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

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中的 "采用自动布局"部分.

  • 如果您看到不可满足约束的警告,那些可能是有意义的.如果你在视图中使用`translatedAutoresizingMaskIntoConstraints = true`操作时看到它们,那么可能正在发生的事情*你已经*有一些试图控制该视图框架的约束(可能在IB中设置).帧上的那些旧约束与从自动调整掩码自动生成的约束相互作用.在这种情况下,答案是删除那些旧约束.如果你在IB中添加它们只是为了让IB在设计时闭嘴,你可以让它们成为"占位符"而失去它们. (4认同)
  • 这有效,但我在日志中看到很多警告.任何人都可以建议使用这种方法的正确方法是什么?或者我应该忽略警告?谢谢 (2认同)

And*_*rew 16

对我来说最简单的事情是删除我想从其superview移动/调整大小的视图,设置它frame,然后将其添加回来.例如,UILabelUITableViewCell子类中进行自定义:

[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
Run Code Online (Sandbox Code Playgroud)

  • 没问题.虽然我觉得有义务告诉你我最终摆脱了这个并且实际上学习如何在IB中使用约束.我不知道它们存在,现在制作复杂的布局似乎更合理. (3认同)