Tôi vừa hoàn thành việc triển khai cuộn chuyển cho tôi. Trong triển khai của tôi, tôi có UITableViewCell với một scrollView và Navigationbuttons. ScrollView chứa x lượt xem tất cả với cùng chiều rộng. lượt xem được đặt theo chiều ngang và phân trang được bật.
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
scrollView.showsHorizontalScrollIndicator = NO;
codelogic của tôi là như sau:
- Trong chức năng khởi tạo của tôi, tôi
- tạo mọi quan điểm (đối với scrollview) và
- đặt chúng vào một mảng và
- thêm chúng vào scrollView
Sau đó, tôi gọi một hàm tính toán vòng lặp vị trí cho mỗi lần xem (mỗi khi bạn phát hiện một cuộn, chức năng này cũng sẽ cần được gọi). Nó luôn luôn lấy phần tử đầu tiên của mảng và đặt frame thành (0,0, ..., ...), thứ hai với (i * width, 0, ...., ....) và như vậy trên. Chức năng beeing gọi là trông như thế này:
- (void)updateOffsetsOfViews{
int xpos = 0;
for (int i=0; i<[views count]; i++) {
UIImageView *_view = [views objectAtIndex:i];
CGRect aFrame = _view.frame;
aFrame.origin.x = xpos;
aFrame.origin.y = 0.0;
_view.frame = aFrame;
xpos += viewWidth;
}
float center = 0;
if(fmod([views count],2) == 1){
center = viewWidth * ([views count]-1)/2;
}else {
center = viewWidth * [views count]/2;
}
[scrollView setContentOffset:CGPointMake(center, 0)];
lastOffset = center;
}
Sau đó (vẫn còn trong quá trình khởi tạo) tôi thêm một người quan sát
[scrollView addObserver:self forKeyPath:@"contentOffset" options:0 context:nil];
vì vậy mỗi lần một cái gì đó trong những thay đổi scrollview tôi nhận được (observeValueForKeyPath) - chức năng được gọi, trông giống như sau:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
UIImageView *_viewFirst = (UIImageView *)[views objectAtIndex:0];
if (fmod([scrollView contentOffset].x,viewWidth) == 0.0) {
if ([scrollView contentOffset].x > lastOffset) {
[views removeObjectAtIndex:0];
[views addObject:_viewFirst];
[self updateOffsetsOfViews];
}else if ([scrollView contentOffset].x < lastOffset) {
UIImageView *_viewLast = (UIImageView *)[views lastObject];
[views removeLastObject];
[views insertObject:_viewLast atIndex:0];
[self updateOffsetsOfViews];
}
}
}
Và trong dealloc hoặc viewDidUnload (phụ thuộc vào cách bạn triển khai) đừng quên làm lại đã quan sát.
[scrollView removeObserver:self forKeyPath:@"contentOffset"];
Hope this helps, bạn có thể nhận thấy một số phí, nhưng trong việc thực hiện của tôi, tôi cũng hỗ trợ như di chuyển 5 trang (cũng ... không giới hạn) cùng một lúc và autoanimated di chuyển vv để bạn có thể thấy một cái gì đó có thể bị vứt đi.
Bạn đã xem MapKit chưa? –
cũng UITableView là một phân lớp của UIScrollView –