簡體   English   中英

自動布局問題:iOS 7與iOS8

[英]Auto-Layout Issues: iOS 7 vs iOS8

我正在嘗試創建一個像這樣工作的可折疊工具欄(在iOS 7中運行 - 丑陋的顏色等用於可視化目的):

iOS 7中的工具欄行為

但是,當我在iOS 8中運行代碼時,會發生以下情況: 在此輸入圖像描述 我已經建立了一個基於以下內容的約束系統: 可折疊的工具欄圖

centering view (未示出)使工具欄保持在屏幕中間。 sizing view以折疊工具欄。 sizing view錨定在centering view的右側(通過trailing約束)。 container view包含工具欄的實際內容。 它錨定在sizing view的右側(也通過trailing約束)。 容器content views中包含各種content views container view 他們沒有任何限制。 系統應用的默認約束應該是width,height,top,left,這可以確保它們在container view保持相對位置。

工具欄的折疊如下:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50; // adjust this number for collapse / expand
    [UIView animateWithDuration:0.3 animations:^{
        [self.centeringView layoutIfNeeded]; // trigger animation
    }];
}

這會調整sizing view的寬度。

問題: iOS 8似乎表現得好像我已經錨定了內容視圖,但事實並非如此。

我真誠地感激:

  • 解釋為什么iOS 8會對給定(相當簡單)的約束進行如此根本不同的解釋。
  • 關於如何在iOS 8中獲得預期行為的指針

此處提供的源代碼 (適用於iOS 8的更新版本)。

更新:這個問題是通過Stack-overflow的答案解決的。 基本上,正確的答案是這樣 ,但在這個答案中很好地總結了。 iOS7和iOS8之間的區別不在於解釋約束的方式,而在於更新命令通過視圖層次結構向下流動的方式。 當我在iOS 7中首先實現該行為時,我注意到如果我在sizing view的父視圖上調用layoutIfNeeded (即在centering view ),動畫將只能正常工作。 在iOS 7中,這顯然會自動降低視圖層次結構。 在iOS 8中,情況並非如此。 您必須使用setNeedsLayout手動使其約束已更改的視圖無效,然后使用layoutIfNeeded更新布局。 我在更新的代碼中的解決方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我希望這有助於其他同樣堅持這種向前兼容性問題的人。

Stack-overflow的答案解決了這個問題。 基本上,正確的答案是這樣 ,但在這個答案中很好地總結了。 iOS7和iOS8之間的區別不在於解釋約束的方式,而在於更新命令通過視圖層次結構向下流動的方式。 當我在iOS 7中首先實現該行為時,我注意到如果我在sizing view的父視圖上調用layoutIfNeeded (即在centering view ),動畫將只能正常工作。 在iOS 7中,這顯然會自動降低視圖層次結構。 在iOS 8中,情況並非如此:您必須使用setNeedsLayout手動使約束已更改的視圖無效,然后使用layoutIfNeeded更新布局。 我在更新的代碼中的解決方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我已經更新了問題以包含答案,但是為了回應@unmircea,我也發布了一個單獨的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM