为了账号安全,请及时绑定邮箱和手机立即绑定

我可以在同一视图上使用setFrame和autolayout吗?

我可以在同一视图上使用setFrame和autolayout吗?

慕村9548890 2019-11-25 14:13:54
我想向所有按钮添加填充,因此我将UIButton子类化,在其他更改中,我想使用setFrame方法添加固定的填充。一切正常,除了setFrame。我检查了一下,发现如果取消选中该视图上的“ using AutoLayout”,那么我可以使用setFrame,它可以工作。有没有解决的办法?我真的想使用自动布局,因为它有助于使该应用在iPhone 5和更早的设备上看起来都不错。但是我也想在子类中使用setFrame,使我的生活更轻松。总结一下,我的问题是:我可以使用自动布局并以编程方式调整UIView的框架吗?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

是的,可以这样做。


如果设置了视图的translatesAutoresizingMaskIntoConstraints = YES,则setFrame:在运行时会根据视图的current将对的调用自动转换为布局约束autoresizingMask。这使您可以将基于框架的布局与基于约束的布局混合使用。


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


但是,关于使用存在一个大警告translatesAutoresizingMaskIntoConstraints。


执行此操作时,您仍然需要确保其余约束可以满足这些自动约束。


因此,例如,假设已经有确定视图大小和位置的约束,然后还要设置translatesAutoresizingMaskIntoConstraints = YES和调用setFrame:。调用setFrame:将在视图上生成新的约束,这可能与已经存在的约束冲突。


(实际上,此错误经常发生。如果您看到一条日志消息抱怨约束冲突,并且其中一个约束是NSAutoresizingMaskLayoutConstraint,则您看到的是与自动约束冲突。这是一个简单的错误,因为translatesAutoresizingMaskIntoConstraints = YES是默认值,因此,如果您要在代码中配置约束,则在不需要这些自动约束时,请记住将其关闭。)


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


有关更多详细信息,请查看Apple的Cocoa自动布局指南中的 “采用自动布局”部分。


查看完整回答
反对 回复 2019-11-25
?
Helenr

TA贡献1780条经验 获得超3个赞

对我来说,最简单的事情是从其超级视图中删除要移动/调整大小的视图,设置其frame,然后重新添加。例如,UILabel在UITableViewCell子类中采用自定义:


[cell.myLabel removeFromSuperview];

cell.myLabel.frame = someFrameIGenerated;

[cell.contentView addSubview:cell.myLabel];


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 588 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信