ios – 在约束依赖于框架的自定义视图中使用自动布局

ios – 在约束依赖于框架的自定义视图中使用自动布局,第1张

概述我正在编写一个以编程方式初始化的自定义视图.我重写updateConstraints以添加此视图所需的所有约束. : - (void)updateConstraints { [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX 我正在编写一个以编程方式初始化的自定义视图.我重写updateConstraints以添加此视图所需的所有约束. :
- (voID)updateConstraints {    [self.supervIEw addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.supervIEw attribute:NSLayoutAttributeCenterX multiplIEr:1 constant:0]];    [self.supervIEw addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributetop relatedBy:NSLayoutRelationEqual toItem:self.supervIEw attribute:NSLayoutAttributetop multiplIEr:1 constant:0]];    [self.supervIEw addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.supervIEw attribute:NSLayoutAttributeBottom multiplIEr:1 constant:0]];    // some more constraints,you get the point    self.bottomSpacingConstraint = [NSLayoutConstraint constraintWithItem:self.imageVIEw attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplIEr:1 constant:-(0.2 * CGRectGetHeight(self.bounds))];    [self addConstraint:self.bottomSpacingConstraint];    [super updateConstraints];}

问题是self.bounds返回CGRectZero的等价物.我做了我的研究并根据这个objc.io article,这是预期的,因为在调用layoutSubvIEws之前框架不会被设置.它也提到了

To force the system to update the layout of a vIEw tree immediately,you can call layoutIfNeeded/layoutSubtreeIfNeeded (on iOS and OS X respectively). This can be helpful if your next steps rely on the vIEws’ frame being up to date.

但是,当我添加

[self setNeedsLayout];[self layoutIfNeeded];

在updateConstraints中设置self.bottomSpacingConstraint之前,我仍然得到一个CGRectZero返回框架.根据objc.io文章(和本SO answer),这些方法应该触发布局并更新框架.

任何人都可以对如何使这一切工作有所启发吗?我对解决方案感兴趣,并解释了导致调用布局相关方法的原因(例如,看起来在layoutSubvIEws中更改现有约束的常量会导致调用setNeedsUpdateConstraints,然后触发updateConstraints并导致约束要多次添加).

解决方法 我很确定你不能或不应该从updateConstraints调用layoutIfNeeded.更新约束是在布局周期的早期部分,所以我认为它不会产生你想要的效果.

在你的情况下,解决方案是检查layoutSubvIEws中依赖于帧的约束的常量属性,如果需要更新,则在那里更新它或调用setNeedsUpdateConstraints(小心引起循环).

您已经说过更新约束会触发另一个对updateConstraints的调用 – 这是真的,我认为您正在滥用updateConstraints – 它是根据视图内容的更改来更新约束.您应该只添加那些约束(如果它们尚不存在).

总结

以上是内存溢出为你收集整理的ios – 在约束依赖于框架的自定义视图中使用自动布局全部内容,希望文章能够帮你解决ios – 在约束依赖于框架的自定义视图中使用自动布局所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100172.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存