我可以使用SETFRAME和自动布局上同样的看法?(Can I use setFrame and a

2019-06-18 18:47发布

我想填充添加到我所有的按钮,所以我子类的UIButton,和其他的变化中,我想用SETFRAME方法添加一个固定的填充。 一切工作,除了SETFRAME。 我查了一下四周,我发现,如果我取消该视图上的“使用自动版式”,然后我可以使用SETFRAME,和它的作品。 有没有解决的办法? 我真的想用自动布局,因为它有助于使应用程序看起来不错,两个iphone 5和更早版本的设备。 但我也想用SETFRAME在我的子类,使我的生活痘痘更容易。

综上,我的问题是:我可以使用自动布局,也可以调整一个UIView编程的框架?

Answer 1:

是的,这是可以做到。

如果你设置视图的translatesAutoresizingMaskIntoConstraints = YES ,然后调用setFrame:在运行时到基于该视图的当前布局约束自动转换autoresizingMask 。 这使您可以使用基于约束的布局混合基于帧的布局。

例如,你可以使用自动布局定义所有视图的子视图的布局,但还是叫setFrame:设置视图本身的大小和位置。 从你的角度,你正在做与汽车的布局相结合,并直接帧操作布局。 但该系统实际上是使用约束来处理一切。

然而,有关于使用一个重要的提醒translatesAutoresizingMaskIntoConstraints

当你这样做, 你仍然需要确保这些自动约束可以满意你的约束休息

所以,举例来说,假设有已经决定您的视图的大小和位置的限制,然后您还可以设置translatesAutoresizingMaskIntoConstraints = YES ,并呼吁setFrame: 要将呼叫setFrame:将生成的观点,这可能会与现有的约束冲突的新的限制。

(事实上,这种错误经常发生。如果你看到一个日志消息抱怨冲突的约束,以及这些制约因素之一是NSAutoresizingMaskLayoutConstraint ,那么你看到的是一个自动约束的冲突。这是一个容易犯的错误,因为translatesAutoresizingMaskIntoConstraints = YES是默认值,所以如果你在代码中配置的约束,你需要记住关闭它,如果你不想这些自动限制。)

相反,再假定有已经存在决定您的视图的大小和位置的限制,但你设置translatesAutoresizingMaskIntoConstraints = NO致电前setFrame: 在这种情况下,您的setFrame:通话不会产生新的约束条件,所以会有不同的约束条件之间没有冲突。 然而,在这种情况下,仍然有“冲突” 的约束,你设置的帧值之间 。 在接下来的时刻自动布局被调用时,它会看到已经存在的制约来看,计算出他们需要的帧值,和帧设置为需要的值本身,重挫您手动设置的值。

有关详细信息,请查看苹果在部分“采用自动布局” 可可自动布局指南 。



Answer 2:

什么竟然是最简单的事情对我来说是删除我想移动/从它的父调整视图大小,设置其frame ,然后将其重新添加。 例如,拿一个自定义UILabelUITableViewCell子类:

[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];


Answer 3:

一种适合我的工作是简单地增加一个IBOutlet对我的约束视图控制器,然后更改constant在出口属性。

例如,要更改视图的X原点,从这一观点的主要约束的出口设置到控制器。 换句话说,形成一出口@IBOutlet var labelXOrigin: NSLayoutConstraint! 。 然后,当你想调整x位置,只需像做

self.labelXOrigin.constant = 20.0 // Or whatever origin you want to set.


Answer 4:

设置子视图的帧最好的办法是在自动布局项目viewWillLayoutSubviews方法。

设置属性translatedAutoresizingMaskIntoConstraints =真正的后视图做了按钮出现或选项卡中设置该会的工作,只是鉴于后确实出现。



Answer 5:

如果您的应用程序并不多装置定向支持。

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];
}

我不知道,但我想,如果你使用此解决方案,一个方向切换到另一个可能导致问题



文章来源: Can I use setFrame and autolayout on the same view?