以编程方式创建 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:未正确应用约束