【问题标题】:Delegate when constraints updated约束更新时委托
【发布时间】:2014-09-08 03:21:59
【问题描述】:

我在使用带有 UIScrollView 的情节提要自动布局时遇到问题。我正在更新 UIScrollView 的约束,然后设置滚动视图的内容大小。但是 UIScrollView 约束需要一些时间来更新,并且最初 UIScrollView 无法滚动,因为它的高度比视图高。我无法更改当前的实现。

是否有任何方法、通知或任何委托方法来检查约束是否已更新?这样我就可以做进一步的改变。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *scrollViewHieghtConstraint;

self.scrollViewHieghtConstraint.constant = 500;
[self.scrollView updateConstraints];

[self.scrollView setContentSize:CGSizeMake(0, 1000)];

【问题讨论】:

    标签: ios iphone objective-c xcode uiscrollview


    【解决方案1】:

    您可以使用UIViewController- (void)updateViewConstraints 选择器。

    如果您扩展了上述视图,您也可以使用UIView- (void)updateConstraints 选择器。

    【讨论】:

    • 谢谢,它有效:) 我想补充的一件事是。我们必须在这个方法中调用 [super updateViewConstraints] 否则它会崩溃。
    • 从框架中调用的大多数方法都应该使用对 super 的调用。如果你必须处理UIViews,这非常重要,因为你扩展的类会对布局产生影响,这也是为什么如果你不处理它会崩溃,因为NSConstraints 将不满足。
    【解决方案2】:

    您不能直接调用 -updateConstraints。您必须将视图的约束标记为脏,iOS 将在下一个更新周期调用该方法。

    在 UIViewController 的实现中,当你需要改变约束时添加这个:

    self.scrollViewHieghtConstraint.constant = 500;
    [self.view setNeedsLayout];
    

    我假设 UIScrollView 是 UIViewController 视图的子视图。如果不是,则在滚动视图的父视图上调用 -setNeedsLayout。

    如果你需要知道子视图何时已经在正确的位置,你有一个 UIViewController 的回调,称为 -viewDidLayoutSubviews

    【讨论】:

    • 是的 UIScrollView 是 UIViewController 的视图的子视图。
    • -viewDidLayoutSubviews 回调通常在将约束添加到UIViewControllers 视图之前调用。如果您正在使用基于约束的布局并希望根据UIViewController 约束更新子视图的约束,您应该始终使用-updateViewConstraint 回调。
    • 对不起,这不正确。 -viewDidLayoutSubviews 在计算约束并且所有内容都在视图内就位后调用。是的,-updateViewConstraints 用于更改约束,如果您想更好地控制系统为您提供的内容,但它不是您可以调用的方法。您必须将布局标记为脏,系统会为您调用它。
    • @galrito 当然,“使用”我总是想继承。你不应该在任何对象上调用-updateConstraints。另外我认为-setNeedsLayout 对于基于约束的布局来说是一种矫枉过正,你可以打电话给-setNeedsUpdateConstraints
    • @Cemal 不,当您已经对约束进行了更改时,过度杀伤正在调用 -setNeedsUpdateConstraints。通过这样做,您是在告诉 iOS 在不需要时重新计算所有约束。 Auto-Layout 包括三个步骤: 1. 更新约束; 2、布局; 3.显示。通过调用 -setNeedsLayout,您跳过了第一步,使过程更快,因为在这种情况下,您已经知道不需要更新任何约束,您只需要更改视图的框架。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多