2013-09-28 51 views
13

Tôi đã tạo UIScrollView với nội dung insets.Phân trang UIScrollView được kích hoạt với nội dung inset đang hoạt động lạ

scrollView.frame = CGRectMake(-80, 180, 480, 190) 
self.scrollView.contentInset = UIEdgeInsetsMake(0, 160, 0, 160); 
self.scrollView.pagingEnabled = YES; 
[self.scrollView setContentSize:CGSizeMake(480, 190)]; 

// Add three Views 
[self.scrollView addSubview:view1]; 
[self.scrollView addSubview:view2]; 
[self.scrollView addSubview:view3]; 

[view1 setFrame:CGRectMake(0, 0, 160, 190)]; 
[view2 setFrame:CGRectMake(160, 0, 160, 190)]; 
[view3 setFrame:CGRectMake(320, 0, 160, 190)]; 

d

Lúc đầu, scrollView.contentOffset.x là -160,0

Nhưng vấn đề lạ là khi tôi gõ vào scrollview (Khu vàng), nội dung bù đắp x giá trị là đặt lại về 0 và hiển thị như điều này.

enter image description here

tôi đã cố gắng nhiều lần, nhưng cách khai thác trên Scroll Xem resets các nội dung bù đắp để 0.

Làm thế nào tôi có thể ngăn chặn điều này?

+0

khung của 'scrollView' là gì? –

+0

scrollView.frame = CGRectMake (-80, 180, 480, 190). Tôi sẽ làm giống như phòng trưng bày. –

Trả lời

13

UIScrollView phân trang hoạt động bằng cách cuộn các trang có cùng chiều rộng của scrollView (trong các trang chữ thường có chiều rộng 480). Điều này có nghĩa là bạn có 1 trang duy nhất (bạn vẫn có thể cuộn sang trái và sang phải do 160 nội dung nội dung).

Một cách để làm cho công việc này sẽ là:

self.scrollView.frame = CGRectMake(80, 180, 160, 190); 
self.scrollView.clipsToBounds = NO; 
self.scrollView.contentInset = UIEdgeInsetsZero; 
self.scrollView.pagingEnabled = YES; 
[self.scrollView setContentSize:CGSizeMake(480, 190)]; 

này sẽ rút ra và di chuyển một cách chính xác, tuy nhiên, các cạnh của màn hình sẽ không tương tác (80 điểm ảnh trên mỗi bên, vì sự kiểm soát bắt đầu từ frame.origin.x = 80 và kết thúc ở 80 + 160 = 240).

Tùy chọn thứ hai sẽ là xử lý phân trang cho chính bạn, bằng cách sử dụng các phương thức được cung cấp bởi UIScrollViewDelegate.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // pageIndex must be declared as a class member - this is used to prevent skipping pages during scroll 
    pageIndex = 0; 
    self.scrollView.frame = CGRectMake(0, 180, 320, 190); 
    self.scrollView.contentInset = UIEdgeInsetsMake(0, 80, 0, 80); 
    self.scrollView.pagingEnabled = NO; 
    self.scrollView.clipsToBounds = YES; 
    [self.scrollView setContentSize:CGSizeMake(480, 190)]; 
    self.scrollView.delegate = self; 
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    int pageWidth = 160; 
    int pageX = pageIndex*pageWidth-scrollView.contentInset.left; 
    if (targetContentOffset->x<pageX) { 
     if (pageIndex>0) { 
      pageIndex--; 
     } 
    } 
    else if(targetContentOffset->x>pageX){ 
     if (pageIndex<3) { 
      pageIndex++; 
     } 
    } 
    targetContentOffset->x = pageIndex*pageWidth-scrollView.contentInset.left; 
    NSLog(@"%d %d", pageIndex, (int)targetContentOffset->x); 
} 
+0

Tôi cần phân trang và nội dung, bởi vì tôi muốn xem ngoài chế độ xem nội dung. –

+0

Chế độ xem cuộn không có trang duy nhất, vì nó có contentInset, nó có 3 trang –

+0

độ rộng trang là '480' (vì đó là chiều rộng của' scrollview) '; 'insets' cùng nhau' 320', nhỏ hơn 1 trang. Trong mọi trường hợp, việc sử dụng 'contentInset' không phải là cách để đi vì nó không hoạt động tốt với phân trang, và các trang sẽ không chứa các khung nhìn mà bạn mong đợi, trừ khi bạn căn giữa mỗi khung nhìn trong trang rộng 480 của nó. –

2

Ngoài phương pháp đầu tiên của alex với cài đặt clipToBounds thành NO, tôi cần phản ứng với cuộn bên ngoài giới hạn chế độ xem cuộn. Vì vậy, tôi tạo ra lớp ScrollForwarderView là lớp con của UIView.

ScrollForwarderView.h

#import <UIKit/UIKit.h> 

@interface ScrollForwarderView : UIView 
@property (nonatomic, weak) UIScrollView *scrollView; 
@end 

ScrollForwarderView.m

... 
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([self pointInside:point withEvent:event]) { 
     return _scrollView; 
    } 
    return nil; 
} 

Sau đó đặt UIView với ScrollForwarderView lớp tùy chỉnh trên chế độ xem cuộn, liên kết thuộc tính scrollview để xem di chuyển của tôi và nó độc đáo chuyển tiếp các sự kiện người dùng để scrollview.

Các vấn đề liên quan