簡體   English   中英

以編程方式創建用於不同尺寸類的具有不同常量的自動布局約束

[英]Programmatically create auto layout constraints with different constants for different size classes

如果使用情節提要,則可以使用Interface Builder將自動布局約束添加到視圖中,並且可以非常輕松地為所需的每個大小類添加不同的constant量值。 當您運行應用程序並在尺寸類別之間切換時,UI將自動更新並重新定位,以遵守新尺寸類別的正確constant數值。

我的問題是,如何通過編程方式獲得相同的行為?

創建NSLayoutConstraint ,不能為不同的大小類設置不同的值。 因此,我認為這將是一個更加手動的過程。 例如,您必須為viewDidLoad的當前大小類創建具有正確值的約束,然后必須使用willTransitionToTraitCollectionupdateConstraints並檢測新的大小類,然后為所有約束更改constant s適用於新的size類,然后在需要重新定位的視圖上調用layoutIfNeeded 那將是很多代碼,對於要優化的更多大小的類,情況將更糟。 是否沒有更容易和/或更有效的方法以編程方式獲得該行為?

請注意,此問題不僅限於自動布局約束,而是可以根據大小類更改其屬性值的任何對象。 例如,為不同大小的類設置UILabel的字體。

迅速

您需要創建不同的NSLayoutConstraint集。

根據下面的討論進行編輯。

  • @Joey :您必須在viewDidLoad (或類似的視圖 )和viewWillTransitionToSize處理大小類決策。

  • 大小類檢測應在animateAlongsideTransition塊內而不是之前進行。

重構代碼:

override func viewDidLoad() {
    super.viewDidLoad()
    let narrow = self.view.traitCollection.horizontalSizeClass 
                 == UIUserInterfaceSizeClass.Compact
    self.useNarrowConstraints(narrow)
}


override func viewWillTransitionToSize(size: CGSize,
                                       withTransitionCoordinator
                                       coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

    coordinator.animateAlongsideTransition({
        (UIViewControllerTransitionCoordinatorContext) -> Void in
            let narrow = self.view.traitCollection.horizontalSizeClass 
                         == UIUserInterfaceSizeClass.Compact
            self.useNarrowConstraints(narrow)
        })
        { (UIViewControllerTransitionCoordinatorContext) -> Void in 
        }
}

使用激活:

func useNarrowConstraints(narrow: Bool) {
    if narrow {
        NSLayoutConstraint.deactivateConstraints([self.fullWidthConstraint])
        NSLayoutConstraint.activateConstraints([self.halfWidthConstraint])
    } else {
        NSLayoutConstraint.deactivateConstraints([self.halfWidthConstraint])
        NSLayoutConstraint.activateConstraints([self.fullWidthConstraint])
    }
}

進一步的細節在這里

使用替代:

func useNarrowConstraints(narrow: Bool) {
    view.removeConstraint(constraint)

    if narrow {
        constraint = NSLayoutConstraint.constraintsWithVisualFormat("format", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)
    } else {
        constraint = NSLayoutConstraint.constraintsWithVisualFormat("otherFormat", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary)
    }
    view.addConstraint(constraint)
}

暫無
暫無

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

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