2010-09-01 30 views
14

Tôi có lớp con UIScrollView mà tôi đang cuộn theo chương trình bằng hoạt ảnh UIView.Sự kiện chạm UIScrollView trong khi hoạt ảnh không kích hoạt bằng animateWithDuration: nhưng hoạt động tốt với UIView beginAnimations:

Tôi muốn người dùng có thể nhấn hoặc thu phóng nội dung UIImageView của Chế độ xem cuộn trong khi hoạt ảnh đang diễn ra.

này đã làm việc tốt khi sử dụng một công thức tương tự như này:

- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond { 
    // distance in pixels/speed in pixels per second 
    float animationDuration = _scrollView.contentSize.width/thePixelsPerSecond; 

    [UIView beginAnimations:@"scrollAnimation" context:nil]; 
    [UIView setAnimationCurve: UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:animationDuration]; 
    _scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0); 
    [UIView commitAnimations]; 
} 

Bây giờ, kể từ khi iOS 4.0, UIView beginAnimations: không được khuyến khích. Vì vậy, tôi đã cố gắng để cập nhật mã của tôi bằng cách sử dụng một khối và UIView animateWithDuration: Các công trình di chuyển giống hệt với ở trên.

Sự khác biệt chính và điên là trong phim hoạt hình, UIScrollView và quan điểm khác không còn đáp ứng với các phương pháp xử lý sự kiện:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 

Cũng không:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; 

được gọi khi cố gắng thu phóng.

Chỉnh sửa để rõ ràng: Không có UIView trình bày phản hồi sự kiện chạm. Điều này không chỉ giới hạn ở UIScrollView. UIScrollView của peer ngang hàng một UIToolbar không đáp ứng với các sự kiện cảm ứng, cũng không làm các nút khác mà là subviews của một peer để UIScrollView. Dường như toàn bộ phụ huynh UIView bị đóng băng khỏi tương tác người dùng trong khi hoạt ảnh đang diễn ra trên. Một lần nữa, sau khi hoạt ảnh hoàn tất, tất cả các UIViews ở trên đều đáp ứng lại.

Tất cả những điều này được gọi trong UIView beginAnimations: công thức bất kể trạng thái hoạt ảnh.

AnimateWithDuration của tôi: mã hơi khác nhau - nhưng sự khác biệt không phải là tài liệu. Ngay sau khi những hình ảnh động hoàn tất, các sự kiện liên lạc trên một lần nữa gọi là ...

đây là mã Animate của tôi:

- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{ 

    float animationDuration = theSyncPoint.time - [player currentTime]; 
    [UIView animateWithDuration:animationDuration 
          delay:0 
         options:UIViewAnimationOptionCurveLinear 
        animations:^{ 
     [_scrollView setContentOffset:theSyncPoint.contentOffset]; 
    } 
        completion:^(BOOL finished){ 
         if (theContinueFlag) { 
          SyncPoint *aSyncPoint = [self nextSyncPoint]; 
          if (aSyncPoint) { 
           [self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES]; 
          } 
         } 
    }]; 
} 

Các xử lý sự kiện duy nhất mà cháy trong khối hoạt hình trên là:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

Vì vậy, câu hỏi: Tôi có nên - bỏ qua nhãn hiệu của Apple không khuyến khích nhãn và tiếp tục sử dụng công thức beginAnimation không? Tôi có nên - thực hiện lại việc thu phóng và các sự kiện dựa trên cảm ứng khác của tôi bằng cách sử dụng hitTest không? Có một số kiến ​​thức về sự khác biệt trong việc triển khai giữa các khối hoạt ảnh có thể giúp tôi đối mặt với vấn đề này không? Có điều gì rõ ràng mà tôi đang bỏ lỡ không?

Tôi là nhà phát triển mới của Apple và vì vậy tôi không biết mức độ nghiêm trọng của việc sử dụng thẻ không khuyến khích của mình. Nhưng nếu API này sẽ không được dùng nữa thì biến mất, tôi muốn di chuyển theo hướng lâu dài.

cảm ơn bạn rất nhiều vì sự chú ý của bạn.

+0

Tình trạng này thực sự có vẻ như được nhắc bởi tình huống bộ nhớ thấp. Tôi đã không có thời gian để kiểm tra toàn diện nếu điều này thực sự là nguyên nhân (đó là lý do tại sao tôi đã không trả lời câu hỏi được nêu ra). Tuy nhiên, sau khi trải qua sự đình chỉ tương tự của xử lý sự kiện trong các tình huống bộ nhớ thấp, nó thực sự sẽ xuất hiện đó là những gì đang xảy ra. Bây giờ - tại sao các hình ảnh động dựa trên khối bị ảnh hưởng trong khi khác không phải là ... Tôi sẽ chạy một bài kiểm tra toàn diện khi tôi nhận được thời gian và đăng bài. – Jackifus

Trả lời

41

Bạn chỉ cần bao gồm các tùy chọn UIViewAnimationOptionAllowUserInteraction khi triệu gọi hoạt hình như vậy:

[UIView animateWithDuration:animationDuration 
          delay:0 
         options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
        <snip>]; 

Đó là một lén lút, tôi biết! ;)

Re: Thẻ "nản lòng" - Nói chung, khi Apple yêu cầu bạn không làm gì đó liên quan đến việc thiết kế các ứng dụng chạy trên nền tảng của họ, nó thường là tốt cho riêng bạn. Vì vậy, bạn có quyền trong việc chấp nhận các khối hoạt hình thay vì cách cũ clunky.

+0

Thực sự lén lút - cảm ơn mucho! – Jackifus

+0

chờ đợi, bạn có nghĩa là hình ảnh động dựa trên khối là BLOCKing? Nó giống như một trò chơi chữ! (Xin lỗi, không thể cưỡng lại. 1 cho một câu trả lời rất hữu ích) – Bdebeez

+0

câu trả lời xuất sắc, cảm ơn rất nhiều! – joern

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