3 回答
TA贡献1796条经验 获得超4个赞
是的,可以这样做。
如果设置了视图的translatesAutoresizingMaskIntoConstraints = YES,则setFrame:在运行时会根据视图的current将对的调用自动转换为布局约束autoresizingMask。这使您可以将基于框架的布局与基于约束的布局混合使用。
例如,您可以使用“自动布局”来定义视图的所有子视图的布局,但是仍然可以调用setFrame:来设置视图本身的大小和位置。从您的角度来看,您正在结合使用自动版面设计和直接框架操作来进行版面设计。但是系统实际上是使用约束来处理所有事情。
但是,关于使用存在一个大警告translatesAutoresizingMaskIntoConstraints。
执行此操作时,您仍然需要确保其余约束可以满足这些自动约束。
因此,例如,假设已经有确定视图大小和位置的约束,然后还要设置translatesAutoresizingMaskIntoConstraints = YES和调用setFrame:。调用setFrame:将在视图上生成新的约束,这可能与已经存在的约束冲突。
(实际上,此错误经常发生。如果您看到一条日志消息抱怨约束冲突,并且其中一个约束是NSAutoresizingMaskLayoutConstraint,则您看到的是与自动约束冲突。这是一个简单的错误,因为translatesAutoresizingMaskIntoConstraints = YES是默认值,因此,如果您要在代码中配置约束,则在不需要这些自动约束时,请记住将其关闭。)
相反,再次假设已经存在确定视图大小和位置的约束,但是translatesAutoresizingMaskIntoConstraints = NO在调用之前先进行设置setFrame:。在这种情况下,您的setFrame:调用不会产生新的约束,因此单独的约束之间不会发生冲突。但是,在这种情况下,约束和您设置的帧值之间仍然存在“冲突” 。下次调用自动布局时,它将在视图上看到已经存在的约束,计算它们所需的框架值,并将框架设置为所需的值本身,从而破坏了您手动设置的值。
有关更多详细信息,请查看Apple的Cocoa自动布局指南中的 “采用自动布局”部分。
TA贡献1780条经验 获得超3个赞
对我来说,最简单的事情是从其超级视图中删除要移动/调整大小的视图,设置其frame,然后重新添加。例如,UILabel在UITableViewCell子类中采用自定义:
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
- 3 回答
- 0 关注
- 588 浏览
添加回答
举报