2017-09-15 66 views
0

我創建了自己的UITabBar(只是一個UIView實例)的實現。Autolayout:旋轉後的UIView幀錯誤

這個UIView包含3個TabBarItem實例。甲TabBarItemUIView子類,並且每個包含以下UI控件:

  • UIImageView
  • UILabel
  • TabBarBadge(定製UIView子類)

我在一個佈局視圖層次結構使用自動佈局的故事板。

標籤欄項目的徽章應定位成使徽章的y中心與圖像視圖的頂部邊緣對齊,並且它應該與圖像視圖的右側對齊,同時4點重疊(所以,徽章的左邊緣與圖像視圖的右邊緣對齊,常數爲-4)。

這適用於加載應用程序時,無論是在縱向還是橫向模式。不管哪種情況,旋轉完成後,旋轉設備都會在徽章框架錯誤的地方旋轉。

下面是有問題的NSLayoutConstraint的控制檯打印輸出:

<NSLayoutConstraint H:[UIImageView]-(-4)-[TabBarBadge] (active)> 

這正是我所期待的那樣。

下面是來自TabBarBadge有問題的控制檯打印輸出(肖像模式;正確演示):

<TabBarBadge frame = (80.6667 0; 36 20); text = '67'; autoresize = RM+BM> 

下面是來自TabBarBadge有問題的控制檯打印輸出(風景模式;不正確演示):

<TabBarBadge frame = (80.6667 0; 36 20); text = '67'; autoresize = RM+BM> 

因此,當旋轉發生時,您可以看到框架未更改/更新。

這裏有幾個屏幕截圖:

肖像,正確的顯示

Portrait, Correct Display

風景,不正確的顯示

Landscape, Incorrect Display

約束(限制的打印輸出以上是從這個看法)

Constraints

那麼,我有什麼困惑的是,其餘的TabBarItem正在更新正確。 UIImageViewUILabel會自動更新。爲什麼這一幀沒有正確更新?

+0

@matt你看到最後一張截圖嗎?它來自視圖調試器。而'NSLayoutConstraint'的打印輸出是高亮約束的描述。 – mbm29414

+0

@matt是的。最後的截圖來自視圖調試器。 「NSLayoutConstraint」的打印輸出來自視圖調試器。他們不匹配。它顯示了一個正確配置的約束,但是該框架對於約束的設置不正確。我不確定你還有什麼其他建議。 – mbm29414

+0

@matt我甚至改變了它,並刪除了我上面顯示的NSLayoutConstraint,用一個約束將視圖對齊到它的超級視圖的中心,向右偏移一個靜態數量(它將它放置在相同的位置地點)。發生同樣的問題。查看調試器仍然顯示徽章的正確設置。難道是因爲這個'UIView'子類有自己的'drawRect:'方法嗎?我想不出其他任何與這種觀點不同的東西。 – mbm29414

回答

0

因此,首先我研究了自定義drawRect:方法是否可能是我的問題的原因。這似乎並不是一個因素。然後,我開始注意到視圖在不同時間的框架之間存在一些奇怪的差異,以及這個特定的(實際上有3個)應用程序出現問題的方式。其他2個當前沒有顯示值。

然後,我記得我使用一個UIDynamicAnimator時,值改變爲「反彈」的觀點,以注意新的價值。

所以,問題實際上是當我完成動畫時,我沒有「釋放」(在控制意義上,而不是記憶意義上)來自UIDynamicAnimator的視圖。 (我仍然不確定這是否是一個錯誤,在我看來,如果動畫暫停,並且約束條件應該更新視圖的幀,那麼也許應該發生。)

所以,這裏是實際的代碼這是「車」:

- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator { 
    // {Other code} 
} 

及這裏的固定我的問題代碼:

- (void)dynamicAnimatorDidPause:(UIDynamicAnimator *)animator { 
    // {Other code} 

    // Code that fixed the issue: 
    [self.animator removeAllBehaviors]; 
} 

如果我需要重新制作動畫的看法,我只是反正重新創建動畫,因此看起來這成爲最佳解決方案。

這似乎與Matt's answer here一致。 (當我問這個問題時,我不知道這是UIDynamicAnimator的問題。)