首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以在同一个视图上使用setFrame和自动布局吗?

我可以在同一个视图上使用setFrame和自动布局吗?
EN

Stack Overflow用户
提问于 2012-11-02 07:10:00
回答 5查看 52.3K关注 0票数 70

我想给我所有的按钮添加填充,所以我子类化了UIButton,并且在其他更改中,我想使用setFrame方法添加固定填充。除了setFrame之外,一切都很正常。我查看了一下,发现如果我在该视图上取消选中“使用AutoLayout”,那么我就可以使用setFrame,并且它可以工作。有什么办法可以解决这个问题吗?我真的很想使用自动布局,因为它有助于使应用程序在iPhone5和更早的设备上看起来都很好。但我也想在我的子类中使用setFrame,让我的生活更轻松一点。

总而言之,我的问题是:我可以使用自动布局并以编程方式调整UIView的框架吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-24 17:01:40

是的,这是可以做到的。

如果设置视图的translatesAutoresizingMaskIntoConstraints = YES,那么对setFrame:的调用将在运行时自动转换为基于视图的当前autoresizingMask的布局约束。这使您可以混合使用基于框架的布局和基于约束的布局。

例如,您可以使用自动布局来定义视图的所有子视图的布局,但仍然可以调用setFrame:来设置视图本身的大小和位置。从您的角度来看,您正在使用自动布局和直接框架操作的混合进行布局。但是系统实际上是使用约束来处理所有事情。

然而,关于使用translatesAutoresizingMaskIntoConstraints有一个很大的警告。

当您这样做时,您仍然需要确保这些自动约束可以用您的其余约束来满足。

例如,假设已经有了决定视图大小和位置的约束,然后您还设置了translatesAutoresizingMaskIntoConstraints = YES并调用了setFrame:。对setFrame:的调用将在视图上生成新的约束,这可能会与现有的约束冲突。

(实际上,这个错误经常发生。如果您曾经看到一条关于冲突约束的日志消息,并且其中一个约束是NSAutoresizingMaskLayoutConstraint,那么您所看到的就是与自动约束的冲突。这是一个很容易出错的错误,因为translatesAutoresizingMaskIntoConstraints = YES是默认值,所以如果您在代码中配置约束,那么如果您不想要这些自动约束,就需要记住将其关闭。)

相反,再次假设已经存在决定视图大小和位置的约束,但是在调用setFrame:之前设置了translatesAutoresizingMaskIntoConstraints = NO。在这种情况下,您的setFrame:调用不会产生新的约束,因此不同的约束之间不会有冲突。但是,在这种情况下,约束和您设置的帧值之间仍然存在“冲突”。下次调用Auto Layout时,它将看到视图上已经存在的约束,计算它们所需的框架值,并将框架本身设置为所需的值,从而破坏您手动设置的值。

有关更多详细信息,请查看苹果Cocoa Auto Layout Guide中的“采用自动布局”部分。

票数 214
EN

Stack Overflow用户

发布于 2013-10-30 13:19:47

事实证明,对我来说最简单的事情是从它的superview中删除我想要移动/调整大小的视图,设置它的frame,然后再添加回来。例如,在UITableViewCell子类中使用自定义UILabel

代码语言:javascript
复制
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
票数 16
EN

Stack Overflow用户

发布于 2016-03-21 05:59:11

对我有效的方法只是将我的约束添加到视图控制器中,然后更改插座上的constant属性。

例如,要更改视图的x原点,请设置从该视图的前导约束到控制器的出口。换句话说,创建一个outlet @IBOutlet var labelXOrigin: NSLayoutConstraint!。然后,当您想要调整x位置时,只需执行以下操作

代码语言:javascript
复制
self.labelXOrigin.constant = 20.0 // Or whatever origin you want to set.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13186908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档