2011-09-05 31 views
5

UIScrollView của tôi được điền với nội dung lớn và sau đó được phóng to bằng "setZoomScale: animated", sao cho nó vừa với khung cuộn. Chế độ xem xuất hiện thu nhỏ đúng cách và được định vị chính xác trong chế độ xem cuộn. Tuy nhiên, người dùng có thể cuộn ra bên ngoài nội dung (màu nền của scrollview hiển thị). Dường như anh ấy có thể cuộn đến cỡ nội dung gốc (như thể nội dung không bị thu nhỏ). Kỳ lạ, sau khi người dùng phóng to theo cách thủ công lần đầu tiên, mọi thứ hoạt động tốt và cuộn lại bị hạn chế về kích thước nội dung một lần nữa.Cuộn UIScrollView quá xa sau khi zoom ban đầu

Tôi đã tìm kiếm trên web và xem qua các tài liệu và ví dụ của Apple nhưng không thể tìm thấy bất kỳ ai có cùng vấn đề. Các ví dụ của Apple dường như cho thấy điều tương tự như tôi.

Nội dung của tôi là chế độ xem tùy chỉnh bắt nguồn từ UIView và có CALayer được thay thế bằng một CATiledLayer (như trong ví dụ của Apple). Bản vẽ tôi tự làm trong drawLayer: inContext :.

Dưới đây là một đoạn mã từ MyScrollViewController:

- (void)loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    double zoomScale = 0.5; // hardcoded for testing 
    [scrollView setZoomScale:zoomScale animated:NO]; 
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize)); 

    [scrollView release]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return theContentView; 
} 

Tuyên bố NSLog cho thấy một thiết lập một cách chính xác contentSize và zoomscale ...

Hy vọng có cái gì đó rõ ràng là tôi đang thiếu ...

+0

Đã có giải pháp cho ai chưa? tôi có cùng một vấn đề, chỉ là cách khác. My Scrollview là nhỏ để hiển thị hình ảnh chứa (tôi không thể di chuyển đến dưới cùng của hình ảnh) Nhưng sau khi phóng to một khi mọi thứ đều ổn. – Maverick1st

+1

Tôi đã kết thúc thiết lập zoomScale trên runloop tiếp theo (thay vì trực tiếp từ loadView), hoạt động: "[self performSelector: @selector (initialZoom) withObject: nil afterDelay: 0];". Nhưng tôi cũng viết lại rất nhiều thứ khác, vì vậy tôi không chắc đó có phải là thứ duy nhất cần thiết hay không. – fishinear

+0

Tôi đã có cùng một ý tưởng cuối cùng và nó hoạt động hoàn hảo. Một tiền thưởng bạn nhận được, khi thiết lập zoomscale trong viewDidAppear là, người dùng nhìn thấy một zoom hoạt hình và do đó biết, hình ảnh anh ta xem là zoomable :) – Maverick1st

Trả lời

3

tôi đã kết thúc việc thiết lập zoomScale trên runloop tiếp theo (thay vì trực tiếp từ loadView), mà làm việc:

- (void) loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    // set the zoom level on the next runloop invocation 
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0]; 

    [scrollView release]; 
} 

- (void) initialZoom { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:NO]; 
} 

Một khả năng khác, được đề xuất bởi Maverick1st, là để thiết lập các zoomscale từ viewDidAppear, chứ không phải là LoadView . Cách tiếp cận đó có thêm lợi thế là nó cho thấy một hình ảnh động của việc phóng to, chỉ ra cho người dùng rằng chế độ xem bắt đầu ở trạng thái được thu phóng.

- (void) viewDidAppear { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:YES]; 
} 
1

Tôi mới ở đây nhưng bạn có thể thử cắt bớt các bản xem trước. Tôi đã tạo một khung nhìn cuộn với trình tạo giao diện và trong trình kiểm tra thuộc tính là một hộp kiểm tra clip, vì vậy tôi nghĩ bạn nên làm một cái gì đó như thế, chỉ theo chương trình. Hy vọng rằng sẽ giúp.

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