簡體   English   中英

UIView animateWithDuration和用戶交互

[英]UIView animateWithDuration and user interaction

我正在使用以下遞歸函數在iPhone上運行動畫。 設置動畫時,用戶交互將被阻止(動畫完成后,用戶交互將起作用)。 我一直在嘗試啟用用戶交互,並且嘗試了

  • 將標志UIViewAnimationOptionAllowUserInteraction傳遞給animateWithDuration
  • 從此網站開始定義一個名為touchesBegan的功能。 從不調用此函數(在我點擊屏幕時在其他視圖中調用)。
  • 按照此SO答案指定的方式,在具有dispatch_asyncdispatch_sync的不同線程上運行動畫。 我嘗試了幾種方法,但是甚至不確定是否可以使用。
  • 放置一個UIButton來檢測水龍頭。 鏈接的功能在約1-2秒內不會被調用。

對我來說,所有聽起來像用戶交互都沒有啟用。 運行此動畫時如何響應?

該動畫相當長且復雜-這是此應用存在的全部原因。 每個longAndComplicatedCalculation大約需要1 longAndComplicatedCalculation ,此函數稱為longAndComplicatedCalculation次。

- (void)startAnimation:(dispatch_block_t)block withUIBlock:(dispatch_block_t)uiBlock iteration:(int)N{
    [UIView animateWithDuration:1.0
                 delay:0.0
                 options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction | UIViewAnimationOptionAllowAnimatedContent)
                 animations:^(void) {
                         [block invoke];
                         [uiBlock invoke];
                  }
                  completion:^(BOOL finished) {
                       if(FINISHED_IF && N<N_MAX) {
                          __weak id weakSelf = self;
                          [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                              [weakSelf startAnimation:block withUIBlock:uiBlock iteration:N+1];
                          }];
                        }
                  }
     ];
}

該函數用

[self startAnimation:^{
    imageChange = [self longAndComplicatedCalculation];
} withUIBlock:^{
    self.imageView.image = imageChange;
}
iteration:1];

您正在從主線程調用這兩個塊(該塊和uiBlock)。 如果您的longAndComplicatedCalculation阻塞了線程,則行為正常。 您應該在單獨的線程中調用計算,並在完成調用UIThread的動畫之后從那里開始。

更清楚地說,這就是我要這樣做的方式(沒有確切的實現和測試):

考慮到您的圖像被聲明為屬性:

@property (nonatomic, retain) UIImage *changedImage;

調用動畫時,您可以像

[NSThread detachNewThreadSelector:@selector(updateImage) toTarget:nil withObject:nil];

然后在函數中進行計算,然后在UIThread上調用動畫:

- (void)updateImage {
    self.changedImage = [self longAndComplicatedCalculation];
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [self doAnimationAndChangeImage];
    }];
}

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM