2015-10-07 38 views
0

我試圖創建一個視圖控制器來模擬經典的體重秤。我有一個UIView子類(DragView)來表示權重,另一個UIView子類(ContainerView)來模擬板塊的尺度。奇怪的行爲與自動佈局和框架更改與iOS 9

當一個DragView拖動到ContainerView上時,我觸發一個動畫,將DragView放置在ContainerView中(如果需要,更改大小)。但是,如果用戶在ContainerView外部釋放DragView,則DragView將被動畫到其原始位置和大小。

在這裏可以看到的DragView(綠色)和兩個ContainerView(在上面的「板」明確顏色)

enter image description here

的DragView的原始幀被設定爲約束(比例寬度,頂尖和領先)。一切看起來都很好,但是當我將DragView設置回原來的位置時,我就知道了。

enter image description here

看到DragView的框架區別?這是爲什麼發生?

以下是我的代碼的相關部分。

DragView.m

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 

    if (self) { 
    _originalFrame = self.frame; 
    } 

    return self; 
} 

- (void)animateBackToOrigin 
{ 
    [UIView animateWithDuration:0.1 animations:^{ 
     self.frame = _originalFrame; 
    }]; 
} 

我在這兩種方法檢查_originalFrame值和它返回的值相同。

答:

我的錯誤是設定_originalFrame內initWithCoderlayoutSubViews是正確的地方。因爲每次設置視圖時都會調用layoutSubViews,所以我添加了一個檢查(使用CGRectIsEmpty),以便僅在沒有值的情況下設置框架。

- (void)layoutSubviews 
{ 
    if (CGRectIsEmpty(_originalFrame)) { 
    _originalFrame = self.frame; 
    } 
} 

回答

0

它在initWithCoder的早期階段:取得結果框架。該視圖只是實例化,並沒有通過佈局過程進行處理。我認爲,最好的地方是layoutSubviews方法。

+0

你把我放在正確的路上,找到了解決辦法。我用答案更新了問題。謝謝。 – WedgeSparda

0

當自動佈局存在時,如果您弄亂框架,將會發生不好的事情。 嘗試改變整個框架,改變對象的.origin

+0

我曾考慮過這個問題,但在很多情況下,尺寸也會改變。 – WedgeSparda