以编程方式创建 AutoLayout 约束 (IOS) Xcode 7.0.1

Posted

技术标签:

【中文标题】以编程方式创建 AutoLayout 约束 (IOS) Xcode 7.0.1【英文标题】:Creating AutoLayout Constraints programmatically (IOS) Xcode 7.0.1 【发布时间】:2015-11-06 00:34:16 【问题描述】:

我看到了几个关于这个话题的问题;但是,他们都没有解决这个问题,而且对于我来说,我无法弄清楚为什么这些限制没有生效。 (也许是因为我有一段时间没睡了。我知道这会适得其反)。

我是 ios 开发的新手,但我很努力,而且学习速度很快。如果您可以解释为什么我的原始代码不起作用,那将非常有帮助。向能解决问题的人点赞!

好的,所以我正在开发一个我实际上已经工作了很长一段时间的应用程序,而我刚开始的时候确实做得很草率。所以我基本上是在重建应用程序的代码,但完全删除了 Interface Builder (Storyboard)。我正在尝试将 UIButton 固定到本地的 UIView (我不想全局声明它)。

//父视图初始化 //

parentView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
[parentView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:parentView];
parentView.tag = 0;

// homeScreenView 已初始化 //

homeScreenView=[[UIView alloc]initWithFrame:CGRectMake(0, homeScreenTitle.frame.size.height, screenWidth, screenHeight-homeScreenTitle.frame.size.height-height)];
[homeScreenView setBackgroundColor:[UIColor greenColor]];
[parentView addSubview:homeScreenView];
homeScreenView.tag = 2;

// chatMenuView 已初始化 //

chatMenuView=[[UIView alloc]initWithFrame:CGRectMake(0, homeScreenTitle.frame.size.height+10, 100, screenHeight-height-10-10-homeScreenTitle.frame.size.height)];
[chatMenuView setBackgroundColor:[UIColor grayColor]];
[parentView addSubview:chatMenuView];
chatMenuView.tag = 3;

// chatMenuButton 已初始化 //

chatMenuButton = [UIButton buttonWithType:UIButtonTypeCustom];
NSString *buttonText = [NSString stringWithFormat:@"CHAT"];
[chatMenuButton setTitle:buttonText forState:UIControlStateNormal];
[parentView addSubview:chatMenuButton];
[chatMenuButton sizeToFit];
    chatMenuButton.center = CGPointMake(0,screenHeight/2);
UIImage *chatIcon = [UIImage imageNamed:@"GrayHouse1.png"];
[chatMenuButton setBackgroundImage:chatIcon forState:(UIControlStateNormal)];
chatMenuButton.tag = 5;

// pinChatButton //

NSLayoutConstraint *pinChat = [NSLayoutConstraint constraintWithItem:chatMenuView
                                                           attribute:NSLayoutAttributeLeading
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:chatMenuButton
                                                           attribute:NSLayoutAttributeTrailing
                                                          multiplier:1
                                                            constant:0];
[self.view addConstraint: pinChat];

我还想补充一点,所有这些代码都在 viewDidLoad 方法中,所有其他视图都在头文件中声明(作为 IBOutlets)。基本上,当我运行代码时,UIView 前导边距位于位置x = 100,并且按钮位于位置 x = 0,这是在添加约束之前假设的位置,这也应该将按钮移动到位置 x = 100。

【问题讨论】:

您应该将translatesAutoresizingMaskIntoConstraints 设置为NO,以便为您要添加的所有视图NSLayoutConstraint @user3480295 完美!谢谢你。我知道我在某个地方在网上看到过这个,但我再也找不到了。那么,每当您关闭此功能时,之前在对象上设置的所有其他帧都将无效? 那些框架不会被作废,在这些视图完成布局之前它们不会改变。 我建议你试试github.com/PureLayout/PureLayout。或者,您可以在 IB 中安装约束,然后以编程方式将它们链接到 M 文件中的 IBOutlet NSLayoutConstraint *property。 【参考方案1】:

所以我基本上是在重建应用程序的代码,但完全删除 界面生成器(故事板)

首先,您真的是在逆流而上。每个人都使用 Interface Builder 进行基本布局,因为在可视化编辑器中可视化布局和查看约束要容易得多。当您尝试做一些聪明的事情时,您应该真正保存代码生成的约束。更不用说设置标签等的所有代码了。

已经解决了这个问题,您的约束对我来说没有多大意义 - 您将 chatMenuView 上的前导空格限制为等于 chatMenuButton 的尾随空格。我可以想象这会很有用的场景,但你可能想要的更像是:

NSLayoutConstraint *pinChat = [NSLayoutConstraint constraintWithItem:chatMenuButton
                                                       attribute:NSLayoutAttributeLeading
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:chatMenuView
                                                       attribute:NSLayoutAttributeLeading
                                                      multiplier:1
                                                        constant:100];

最后,即使您确定要在代码中创建约束,也请考虑使用the visual format,它至少具有一定的可读性。

【讨论】:

以上是关于以编程方式创建 AutoLayout 约束 (IOS) Xcode 7.0.1的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout约束以适应矩形内的视图,保持一定的纵横比(以编程方式)

NSTextField 和 AutoLayout:自动增长高度 -> 以编程方式

如何使用大于或等于编程 iOS AutoLayout 约束而不使布局模糊?

UIPageViewController 和 AutoLayout:未正确应用约束

使用 UIScrollView 和 AutoLayout 以编程方式创建控制器无法正确调整视图大小

自动布局 - 以编程方式定义异常约束