Sir*_*III 63 iphone cocoa-touch interface-builder frame autolayout
我想为我的所有按钮添加填充,因此我将UIButton子类化,除了其他更改之外,我还想使用setFrame方法添加固定填充.除了setFrame之外,一切正常.我查了一下,我发现如果我在该视图上取消选中"使用AutoLayout",那么我可以使用setFrame,它可以工作.有没有解决的办法?我真的想使用自动布局,因为它有助于使应用程序在iphone 5和早期设备上都看起来不错.但我也想在我的子类中使用setFrame,以使我的生活更轻松.
总结一下,我的问题是:我可以使用autolayout并以编程方式调整UIView的框架吗?
alg*_*gal 204
是的,这可以做到.
如果设置了视图translatesAutoresizingMaskIntoConstraints = YES
,则调用setFrame:
将在运行时自动转换为基于视图当前的布局约束autoresizingMask
.这使您可以将基于框架的布局与基于约束的布局混合使用.
例如,您可以使用"自动布局"来定义视图的所有子视图的布局,但仍然可以调用setFrame:
以设置视图本身的大小和位置.从您的角度来看,您正在使用自动布局和直接帧操作的混合进行布局.但系统实际上是使用约束来处理所有事情.
但是,关于使用有一个很大的警告translatesAutoresizingMaskIntoConstraints
.
执行此操作时,您仍需要确保其余约束可以满足这些自动约束.
因此,例如,假设已经存在确定视图大小和位置的约束,然后您还可以设置translatesAutoresizingMaskIntoConstraints = YES
和调用setFrame:
.调用setFrame:
将在视图上生成新约束,这可能与已存在的约束冲突.
(实际上,这个错误经常发生.如果你看到一条抱怨冲突约束的日志消息,其中一个约束是a NSAutoresizingMaskLayoutConstraint
,那么你所看到的是与自动约束的冲突.这是一个容易犯的错误,因为translatesAutoresizingMaskIntoConstraints = YES
是默认值,因此如果您在代码中配置约束,则需要记住在不需要这些自动约束时将其关闭.)
相反,再次假设已存在确定视图大小和位置的约束,但是translatesAutoresizingMaskIntoConstraints = NO
在调用之前设置setFrame:
.在这种情况下,您的setFrame:
调用不会产生新的约束,因此单独的约束之间不会发生冲突.但是,在这种情况下,约束与您设置的帧值之间仍存在"冲突" .在下次调用自动布局时,它将在视图上看到已存在的约束,计算它们所需的帧值,并将帧设置为所需的值本身,破坏您手动设置的值.
有关更多详细信息,请查看Apple的Cocoa Auto Layout Guide中的 "采用自动布局"部分.
And*_*rew 16
对我来说最简单的事情是删除我想从其superview移动/调整大小的视图,设置它frame
,然后将其添加回来.例如,UILabel
在UITableViewCell
子类中进行自定义:
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
49579 次 |
最近记录: |