2012-11-19 18 views
2

我有一個拖放類型的應用程序。在哪裏可以選擇圖像並將它們拖到屏幕上的任何位置! 我遇到的問題是,當你移動到另一個視圖時,所有的圖像重置到中心,當我回來。 例如,如果我按下一個按鈕將我帶到屏幕2,那麼我剛纔所做的所有「拖動」圖像將移回到中心位置。當進入另一個視圖時,UIimages移動到中心

這只是發生時,我已經自動版式啓用:( 我有我的所有圖像的中心開始了,所以我猜它與自動佈局的東西...

任何想法?!

下面是我拖動圖像的代碼示例。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 

CGPoint translation = [recognizer translationInView:self.view]; 
recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, 
            recognizer.view.center.y + translation.y); 
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 
} 

回答

6

你拖放代碼手動配置佈局通過突變view.center財產。

啓用自動佈局後,自動佈局負責設置佈局,因此它將獨佔設置view.center,view.bounds和view.frame(實際上只是從中心和邊界計算)。

因此,一旦啓用了自動佈局,儘管您仍然可以手動設置view.center,但自動佈局會在下次計算滿足您的約束條件的佈局時觸發您執行的任何操作。

那麼你如何更新你的代碼來使用自動佈局?如果你想使用自動佈局,你需要做的是修改你的handlePan:方法,以便不用修改view.center,而是修改使用自動佈局約束來計算view.center。這些細節將取決於您的約束配置。但是,如果我們假設,例如,有一個NSLayoutContraint topSpaceConstraint,設置視圖的頂部空間到上海華,另一個NSLayoutConstraint leftSpaceConstraint,設置視圖的左側空間到上海華盈,那麼你可能會產生如

view.center = CGPointMake(view.center.x + translation.x, 
          view.center.y+ translation.y); 
同樣的效果

通過,而不是做類似

topSpaceConstraint.constant = topSpaceConstraint.constant + translation.y; 
leftSpaceConstraint.constant = leftSpaceConstraint.consant + translation.x; 
[view setNeedsLayout]; 
[view layoutIfNeeded]; 

東西前兩行更新的約束。最後兩行讓自動佈局系統重新計算結果幀並立即應用,而不是等到下一輪運行循環。

或者,您可能可以在獲取UIGestureRecognizerChanged事件時手動更新框架,然後通過僅在獲取UIGestureRecognizerEnded事件後更新上述約束來使結果「永久」。這會更高效,因爲在許多UIGestureRecognizerChanged事件中,您將直接更新框架,而不是依靠自動佈局系統來執行此操作。

+0

你已經制作了一串優秀的Autolayout答案 - 很棒的作品! – jrturton

+0

謝謝。我必須從我的系統中取出它。 :) – algal

+0

先生。你真了不起!我希望我有足夠的聲譽來投票這:) – paintball247

相關問題