2010-11-08 33 views
18

Tôi đang sử dụng UIScrollView và một hình ảnh trong đó như phân trang một hình ảnh trên mỗi trang. Tôi gặp sự cố khi xoay iPhoneUIScrollView vô hiệu hóa di chuyển trong khi xoay trên iPhone/iPad

Khi tôi xoay iPhone, sau đó cuộnViewViewDidScroll (Phương thức ủy quyền xem cuộn) đang gọi. Do đó, phân trang của tôi bị xáo trộn và số trang thay đổi.

Giải pháp là gì?

+0

có cùng một vấn đề. .., bạn đã quản lý để giải quyết vấn đề? – negersiu

+1

@ Maciulis..What chính xác tôi đã được thực hiện tại thời điểm đó ... nhưng tôi kiểm tra mã .. và tôi không sử dụng phương thức scrollViewDidScroll và sử dụng scrollViewDidEndDecelerating .. và sử dụng biến toàn cục cho số trang hiện tại .. hy vọng điều này sẽ giúp bạn hoặc cho tôi biết chính xác những gì bạn muốn –

Trả lời

13

Tôi đã tìm thấy một hành vi không có giấy tờ lạ khi quay một trang UIScrollView.

Khi chế độ xem cuộn được đặt ở trang cuối cùng và người dùng thay đổi hướng, hệ điều hành cuộn lại UIScrollView một vài pixel để bù cho sự khác biệt giữa chiều cao và chiều rộng.

Về cơ bản, tôi đã nhận được các cuộc gọi sau cho bất kỳ trang nào.

willRotateToInterfaceOrientation:duration 
willAnimateRotationToInterfaceOrientation:duration: 
didRotateFromInterfaceOrientation: 

Và đối với những trang cuối cùng:

willRotateToInterfaceOrientation:duration 
scrollViewDidScroll: 
willAnimateRotationToInterfaceOrientation:duration: 
didRotateFromInterfaceOrientation: 

Đó sai lầm với các trang của tôi quá. Vấn đề là ở willRotate, giới hạn chưa được cập nhật bởi hệ điều hành nào, và trong willAnimate bạn có giới hạn mới và có thể tính toán kích thước mới, nhưng nó đã quá muộn ...

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    CGSize tempSize = [self.pagingScrollView contentSize]; 
    NSUInteger padding = abs(pagingScrollView.frame.size.width - pagingScrollView.frame.size.height); 
    tempSize.width += padding; 
    [self.pagingScrollView setContentSize:tempSize]; 
    [...] 
} 
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration{ 
    CGSize newSize = ... // Compute new content size based on new orientation 
    [self.pagingScrollView setContentSize:newSize]; 
} 

Đây chỉ là một cách giải quyết, nhưng tôi đã dành vô số giờ về vấn đề này và không thể tìm thấy một giải pháp thanh lịch.

22

Raphaël's answer là mô tả tuyệt vời về sự cố và khắc phục gọn gàng. Tôi đã có cùng một vấn đề chính xác và kết thúc việc sửa chữa với cờ scrollingLocked mà tôi đã đặt thành CÓ (bị khóa) trước khi bắt đầu xoay và KHÔNG (mở khóa) khi kết thúc. Có lẽ hơi ít hacky hơn là tạm thời thay đổi contentSize:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation 
           duration:(NSTimeInterval)duration 
{ 
    self.photoViewer.scrollingLocked = YES; 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation 
{ 
    self.photoViewer.scrollingLocked = NO; 
} 

- (void)scrollViewDidScroll:(UIScrollView*)scrollView 
{ 
    if (self.scrollingLocked) 
    { 
     return; 
    } 
    /* do normal scrollViewDidScroll: stuff */ 
} 
+0

+1 để có câu trả lời đúng + rõ ràng hơn. –

+0

thành phần nào là photoViewer? - bởi vì nó không phải là một cuộn, cũng không phải là một cái nhìn –

+2

@matheszabi, anh ta đang sử dụng một con ngà BOOL để theo dõi. Ngoài ra, bạn chỉ có thể sử dụng thuộc tính dựng sẵn 'scrollEnabled' của' UIScrollView'. Bằng cách này, điều này vẫn còn cho một số lý do gây nên 'scrollViewDidScroll' khi trên hình ảnh cuối cùng. – Steven

0

Nhiệm vụ của tôi là cho phép cuộn phong cảnh. Thiết kế dành cho portait. Tôi đã đưa ra ý tưởng để thêm một ScrollView vào các thành phần hoặc trong "Nhúng trong chế độ xem cuộn" trong Interface Builder. Tôi đã mong đợi nó sẽ hoạt động, nhưng không. Tôi đang sử dụng Xcode 4.4, iOS 5.1, (dự án văn phòng cũng cần hỗ trợ 4.2), nhưng vấn đề là như nhau.

Trong câu hỏi tràn ngăn xếp iPhone SDK: UIScrollView does not scroll có một hàng giải quyết vấn đề.

thử khác là trong Stack Overflow câu hỏi iOS - UIScrollView is not working (it doesn't scroll at all - the image stays fixed), và điều này đã giúp tôi, kết hợp với khác, vì vậy đây là portait-to-cuộn của tôi đang cảnh quan:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromOrientation 
{ 
    if(UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])){ 
     scrollView.contentSize = portaitScrollSize; 
    } 
    else{//statusbar is Landscape 
     scrollView.contentSize = landscapeScrollSize; 
    }  
} 

Các scrollview trong ràng buộc để một Ivar xem trong giao diện Builder. portaitScrollSizelandscapeScrollSize là các biến riêng tư. Chúng được khởi tạo và không thay đổi. Trong my.h file:

IBOutlet UIScrollView *scrollView; 

Trong my.m file:

CGSize portaitScrollSize, landscapeScrollSize; 

...

portaitScrollSize = CGSizeMake(320,440); 
landscapeScrollSize = CGSizeMake(480,480); 

Tôi hy vọng nó sẽ giúp ai đó để thêm một tính năng + cuộn xoay đến một thiết kế portait .

Đừng quên để cho phép portait + cảnh quan trên đầu phần:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return TRUE; 
} 
0

Ngoài câu trả lời Raphaël Mor của. Nếu bạn đang chuyển từ chế độ dọc sang ngang, nội dung hóa và cấu trúc trang sẽ phanh. Do đó, để duy trì cấu trúc trang hiện chỉ bổ sung thêm kích thước nội dung để width:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.contentSize.width + 400, self.scrollView.contentSize.height)]; 
} 

Và chắc chắn rằng bạn thiết lập contentsize và bù đắp lại sau khi định hướng thay đổi:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    [self.scrollView setContentSize:CGSizeMake(self.scrollView.bounds.size.width *3, self.scrollView.bounds.size.height)]; 
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.bounds.size.width * self.pageControl.currentPage, 0) animated:NO]; 

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