2013-07-30 56 views
1

我使用自動佈局與此佈局下面調整大小的UIView與自動佈局:當置於具有固定大小的UIView

enter image description here

與幀self.view(0,80,320,488)

的CollectionView與框架(0,0,320,220)

underView與框架(0220320268)

並試圖實現這應該調整的動畫underView放大其高度,使underView部分覆蓋collectionView自下而上的移動。

自動佈局強制的,因此我已經創建了一個IBOutlet爲underView高度約束我在動畫正在調整的2次的高度約束:

NSLog(@"underView height %.2f", self.underView.frame.size.height); 

NSLog(@"offset (%.2f, %.2f)", offset.x, offset.y); 

heightConstraint.constant += offset.y; 

NSLog(@"heightConstraint %.2f", heightConstraint.constant); 

[self.underView setNeedsUpdateConstraints]; 

[UIView animateWithDuration:ANIMATION_DURATION 
         delay:ANIMATION_DELAY 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 

        [self.underView layoutIfNeeded]; 

        NSLog(@"underView height %.2f", heightConstraint.constant); 

       } completion:nil]; 

並在控制檯中,我可以看到:

2013-07-30 09:09:37.268 Cal[49611:a0b] underView height 268.00 
2013-07-30 09:09:37.268 Cal[49611:a0b] offset (320.00, 144.00) 
2013-07-30 09:09:37.269 Cal[49611:a0b] heightConstraint 412.00 
2013-07-30 09:09:37.270 Cal[49611:a0b] underView height 412.00 

但是調整大小根本不會發生。

這種行爲的唯一原因我能想到的是上面的collectionView的高度約束,但由於我不希望集合重新加載,我無法對此操作。

我想知道如何實現具有擴展OVER集合視圖的underView?我嘗試使用約束優先權,但它沒有工作...

回答

0

所以,我發現了一個可能的解決我的問題,不知道這是否是最好的解決辦法,但。我缺少self.collectionView的垂直空間約束的引用,所以最終的代碼如下:

verticalSpace.constant -= shift; 
heightConstraint.constant += shift; 

[self.collectionView setNeedsUpdateConstraints]; 
[self.underView setNeedsUpdateConstraints]; 

[UIView animateWithDuration:ANIMATION_DURATION 
         delay:ANIMATION_DELAY 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 
        [self.view layoutIfNeeded]; 
       } completion:nil 
]; 

我會等待其他更好的解決方案了一段時間,所以我不慶祝我自己的答案爲接受了一個。

2

請嘗試以下操作,根據this answer。確保你在上海華呼籲layoutIfNeeded

[UIView animateWithDuration:ANIMATION_DURATION 
         delay:ANIMATION_DELAY 
        options:UIViewAnimationOptionCurveEaseOut 
       animations:^{ 

        heightConstraint.constant += offset.y; 
        [self.view layoutIfNeeded]; 

        } 
       completion:nil]; 
+0

謝謝@Maarten,但實際上這並沒有什麼區別,此外,如果您閱讀了關於答案的註釋,則鏈接人員已經確認,持續更新可以很好地避開動畫,只留下layoutIfNeeded方法在動畫塊中。作爲一個額外的提示,我也嘗試調用[self.view layoutIfNeeded],因爲有人指出是需要重新顯示佈局的超級視圖,但沒有再改變。 –

+0

你有沒有試過在superView上調用'layoutIfNeeded'?我改變了我的答案以反映這一點。 – Maarten

+0

是的,正如我上面所說,self.view是superview。 –

相關問題