我想填充添加到我所有的按钮,所以我子类的UIButton,和其他的变化中,我想用SETFRAME方法添加一个固定的填充。 一切工作,除了SETFRAME。 我查了一下四周,我发现,如果我取消该视图上的“使用自动版式”,然后我可以使用SETFRAME,和它的作品。 有没有解决的办法? 我真的想用自动布局,因为它有助于使应用程序看起来不错,两个iphone 5和更早版本的设备。 但我也想用SETFRAME在我的子类,使我的生活痘痘更容易。
综上,我的问题是:我可以使用自动布局,也可以调整一个UIView编程的框架?
是的,这是可以做到。
如果你设置视图的translatesAutoresizingMaskIntoConstraints = YES
,然后调用setFrame:
在运行时到基于该视图的当前布局约束自动转换autoresizingMask
。 这使您可以使用基于约束的布局混合基于帧的布局。
例如,你可以使用自动布局定义所有视图的子视图的布局,但还是叫setFrame:
设置视图本身的大小和位置。 从你的角度,你正在做与汽车的布局相结合,并直接帧操作布局。 但该系统实际上是使用约束来处理一切。
然而,有关于使用一个重要的提醒translatesAutoresizingMaskIntoConstraints
。
当你这样做, 你仍然需要确保这些自动约束可以满意你的约束休息 。
所以,举例来说,假设有已经决定您的视图的大小和位置的限制,然后您还可以设置translatesAutoresizingMaskIntoConstraints = YES
,并呼吁setFrame:
要将呼叫setFrame:
将生成的观点,这可能会与现有的约束冲突的新的限制。
(事实上,这种错误经常发生。如果你看到一个日志消息抱怨冲突的约束,以及这些制约因素之一是NSAutoresizingMaskLayoutConstraint
,那么你看到的是一个自动约束的冲突。这是一个容易犯的错误,因为translatesAutoresizingMaskIntoConstraints = YES
是默认值,所以如果你在代码中配置的约束,你需要记住关闭它,如果你不想这些自动限制。)
相反,再假定有已经存在决定您的视图的大小和位置的限制,但你设置translatesAutoresizingMaskIntoConstraints = NO
致电前setFrame:
在这种情况下,您的setFrame:
通话不会产生新的约束条件,所以会有不同的约束条件之间没有冲突。 然而,在这种情况下,仍然有“冲突” 的约束,你设置的帧值之间 。 在接下来的时刻自动布局被调用时,它会看到已经存在的制约来看,计算出他们需要的帧值,和帧设置为需要的值本身,重挫您手动设置的值。
有关详细信息,请查看苹果在部分“采用自动布局” 可可自动布局指南 。
什么竟然是最简单的事情对我来说是删除我想移动/从它的父调整视图大小,设置其frame
,然后将其重新添加。 例如,拿一个自定义UILabel
中UITableViewCell
子类:
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
一种适合我的工作是简单地增加一个IBOutlet
对我的约束视图控制器,然后更改constant
在出口属性。
例如,要更改视图的X原点,从这一观点的主要约束的出口设置到控制器。 换句话说,形成一出口@IBOutlet var labelXOrigin: NSLayoutConstraint!
。 然后,当你想调整x位置,只需像做
self.labelXOrigin.constant = 20.0 // Or whatever origin you want to set.
设置子视图的帧最好的办法是在自动布局项目viewWillLayoutSubviews方法。
设置属性translatedAutoresizingMaskIntoConstraints =真正的后视图做了按钮出现或选项卡中设置该会的工作,只是鉴于后确实出现。
如果您的应用程序并不多装置定向支持。
在viewDidLoad中设置要调整视图的框架
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[aView setFrame:CGRectMake(15, 15, 100, 100)];
}
然后在viewDidLayoutSubviews:
-(void)viewDidLayoutSubviews
{
[self.view setTranslatesAutoresizingMaskIntoConstraints:NO];
}
我不知道,但我想,如果你使用此解决方案,一个方向切换到另一个可能导致问题