2012-07-30 82 views
1

我用一個子視圖初始化一個UIScrollView。一個按鈕動作後,我想:iOS scrollView setContentOffset同步問題

  • 滾動添加一個新的子視圖到新的子視圖與動畫
  • 刪除舊的子視圖當動畫完成。

爲我做到以下幾點:

[mCubeView setContentOffset:tOffset animated:YES];  
[tActualSide removeFromSuperview]; 

的問題是,在動畫開始了「tActualSide」被立即刪除,它會從動畫中刪除,以及之後。

我想同步它,tActualSide只會在動畫結束時被刪除。

我該怎麼做?

+0

對!謝謝! :) – 2012-07-30 14:54:44

回答

3
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.5]; 
[UIView setAnimationCurve: UIViewAnimationCurveLinear]; 
[mCubeView setContentOffset:tOffset]; 
[UIView commitAnimations]; 
[self performSelector:@selector(remove) withObject:nil afterDelay:0.5f]; 


- (void)remove 
{ 
    [tActualSide removeFromSuperview]; 
} 
+0

當然這是有效的,但是當Apple給你一個單一的命令來做同樣的事情時,爲什麼你自己在代碼中呢?除非您在任何地方執行此操作,否則您的動畫將與您的相同應用中的其他動畫看起來不同。 – 2012-07-30 15:10:17

+1

@DavidH你的委託可以在滾動時慢慢做,但是當你快速滾動時,我認爲它不會被使用。 – cloosen 2012-07-30 15:17:16

+0

正如@靈森所暗示的,我發現動畫視圖UIView比使用'contentOffset:location animated:YES'設置響應要快得多。 – zekel 2013-05-14 03:10:45

5

傾聽委託回調:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 

,當你得到消息

[tActualSide removeFromSuperview]; 

引述蘋果文檔(注意 「setContentOffset:動畫:」 參考):

scrollViewDidEndScrollingAnimation: 
Tells the delegate when a scrolling animation in the scroll view concludes. 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView 
Parameters 
scrollView 
The scroll-view object that is performing the scrolling animation. 
Discussion 
The scroll view calls this method at the end of its implementations of the UIScrollView and setContentOffset:animated: and scrollRectToVisible:animated: methods, but only if animations are requested. 

Availability 
Available in iOS 2.0 and later. 
Declared In 
UIScrollView.h 
+0

委託是爲你自己拖動滾動視圖的情況 – 2012-07-30 14:55:44

+0

我添加了代碼給我的應用程序 - 加載後我使用dispatch_after塊setContentOffset:animate:YES,並添加了上面放置NSLog消息的方法,看到動畫停止時,我看到了消息。所以它確實有效(至少在iOS 5上)。 – 2012-07-30 16:26:44

+1

@DavidH如何做到這一點是最優雅的。 – kelin 2014-11-26 11:55:47