新的NSLayoutConstraint方法activateConstraints:和deactivateConstraints:不会出现与IB-创建的约束正常工作(他们正常工作的代码创建的约束).我用一个按钮创建了一个简单的测试应用程序,该按钮有两组约束.安装的一组具有centerX和centerY约束,而另一组(已卸载)具有顶部和左侧约束(常数10).按钮方法切换这些约束集.这是代码,
@interface ViewController ()
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *uninstalledConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *installedConstraints;
@end
@implementation ViewController
- (IBAction)switchconstraints:(UIButton *)sender {
[NSLayoutConstraint deactivateConstraints:self.installedConstraints];
[NSLayoutConstraint activateConstraints:self.uninstalledConstraints];
}
-(void)viewWillLayoutSubviews {
NSLog(@"installed: %@ uninstalled: %@", ((NSLayoutConstraint *)self.installedConstraints[0]).active ? @"Active" : @"Inactive", ((NSLayoutConstraint *)self.uninstalledConstraints[0]).active ? @"Active" : @"Inactive");
}
Run Code Online (Sandbox Code Playgroud)
当应用程序启动时,按钮处于由其安装的约束定义的正确的居中位置.在按钮的操作方法中执行激活/取消激活后,按钮会正确移动到新位置,但是当我将视图旋转到横向时,它会移回到最初定义的位置(尽管日志仍然显示新激活的设置为活跃).当我旋转回肖像时,按钮保持在其初始位置(在屏幕中央),现在日志显示初始约束集合处于活动状态,而我激活的约束处于非活动状态.
问题是,这是一个错误,还是这些方法不应该以这种方式使用IB定义的约束?
我正在试验如何使用UIScrollView.经过多次麻烦,我终于掌握了它.但现在我似乎遇到了另一个障碍.
在这个简单的应用程序,我有一个滚动视图与和,以便它的工作,我必须设置视图的底部空间,所描述的滚动型约束,以0 在这里,它工作正常.我是通过IB做的.
现在我遇到了一个必须以编程方式完成该部分的场景.我在方法中添加了以下代码viewDidLoad.
NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.scrollView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0];
[self.view addConstraint:bottomSpaceConstraint];
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.它在控制台窗口中输出以下消息,我不知道该怎么做.
无法同时满足约束.可能至少下列列表中的一个约束是您不想要的约束.试试这个:(1)看看每个约束并试着找出你不期望的东西; (2)找到添加了不需要的约束或约束的代码并修复它.(注意:如果您看到了您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性translatesAutoresizingMaskIntoConstraints的文档)("","")
有人可以告诉我该怎么做?我还在这里附加了一个演示项目,以便您可以更好地了解该问题.
更新:
首先感谢您的回复.使用答案中提到的方法,我能够使它工作.然而,它的情况略有不同.现在我正在尝试以编程方式将视图加载到viewcontroller.
如果我可以进一步解释.有2个视图控制器.第一个是a UITableViewController和第二个a UIViewController.里面那个UIScrollView.还有多个UIViews和一些视图的高度超过屏幕的正常高度.
在UITableViewController显示选项列表.基于用户的选择,尤其是UIView在大量的出将被装载到UIViewController同UIScrollView.
在这种情况下,上述方法不起作用.滚动没有发生.我是否必须做一些不同的事情,因为我是单独加载视图的?
objective-c uiscrollview uiviewcontroller ios nslayoutconstraint
虽然有很多关于构建故事板布局的问题和答案,它可以在4"和3.5"屏幕尺寸上工作,但我找不到适合以下场景的解决方案.
我使用autolayout和ios6(和ios7),我不需要支持landscpae或ipad.我有一个带有几个子视图的UIView,它们必须看作下面的模型.可以轻松地在故事板中设置自动布局约束以适应任一屏幕尺寸.我的问题是 - 如何根据运行时的屏幕大小使autolayout选择正确的约束?

请注意,我不想使用2个不同的故事板.在我的整个应用程序中这样做将需要做很多工作,而且我必须在每个故事板上连接所有代理,出口和操作.屏幕上的变化需要我做两倍的工作.
我已经尝试了两种方法在一个故事板上完成这项工作,但我对其中任何一个都不满意.

如果只有界面构建器约束具有将在屏幕大小为3.5"时应用的辅助常量值,那么它将解决我的问题.所以我仍然问我的问题 - 如何正确使用单个故事板来正确布局其子视图屏幕尺寸为4"和3.5"?
我对Xcode中的Auto布局约束不熟悉.我有一个像UITabBar6的底部视图UIButtons.在没有约束的情况下,我将这些按钮与每个按钮的5个空格填充对齐,每个按钮的宽度为50.现在,我试图通过使用自动布局来支持所有屏幕尺寸.
在Storyboard约束中,我为6个按钮设置了相等的宽度,每个按钮之间有60个空格.我将第一个按钮0设置为前导空格,然后将最后一个按钮0设置为尾部约束.
我想要buttons with equal width and flexible spaces所有设备尺寸的视图之间.
有人可以帮我吗?寻求帮助.提前致谢.
我想以编程方式创建一个UILabel高度,宽度,然后我想以编程方式为它添加约束以定位UILabel.
更新:
我想创建这样的UI:

如何以编程方式创建此UI
label1同样创建一个标签的代码我创建了两个标签label2和label3
UILabel *label1 = [[UILabel alloc]init];
label1.font = TitleFont;
label1.numberOfLines=0;
label1.text= @"Descriptions";
label1.lineBreakMode=NSLineBreakByWordWrapping;
[label1 sizeToFit];
label1.backgroundColor=[UIColor blueColor];
label1.textColor=[UIColor blackColor];
label1.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:label1];
Run Code Online (Sandbox Code Playgroud)
现在我可以使用此代码添加水平约束
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label1]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(label1)]];
Run Code Online (Sandbox Code Playgroud)
我也能够使用视图设置垂直约束,但我无法设置从一个标签到另一个标签的约束.
在其中一个WWDC 2012视频,Auto Layout By Example中,他们使用Autolayout演示了一个OS X应用程序,在大约7或8分钟时,他展示了如何在单个视图中取消选中Attributes Inspector中的一个框,以及这个盒子被称为"将面膜自动化为约束".现在,我很清楚这个盒子的代码等价,translatesAutoresizingMaskIntoConstraintsboolean,但我似乎无法在iOS或OS X项目中的任何位置找到此复选框.我的项目使用Autolayout.我真的很想要这个复选框,因为我在学习Autolayout(以及将spring/struts应用程序转换为AL)时遇到的困难之一是Xcode为每个视图生成的百万限制,以及如何清理它们并明智地覆盖它们代码中的部分/全部.为了一次转换一个视图,我想要的是关闭那些自动生成的约束.
为什么我看不到这个复选框?我正在使用Xcode 4.6.
有没有办法以constraint编程方式安装和卸载Xcode界面构建器?

objective-c interface-builder ios autolayout nslayoutconstraint
我正在尝试向我的NIB添加布局约束,我正在按照苹果提供的指示:
它说关于添加约束:
添加约束选择要为其添加约束的一个或多个对象.
从"编辑器">"添加约束"菜单中选择约束,或从"编辑器">"对齐"菜单中选择对齐类型.
Add Constraint菜单无法找到.是什么赋予了?我怎样才能添加约束?
假设我有两个UILabel,一个是URL,一个是计时器:
[http://website.com/link/to/specific/story] [9m 42s]
Run Code Online (Sandbox Code Playgroud)
但是"计时器"UILabel改变了很多宽度.有时它只是12s例如,有时它是125h 32m 8s.有很多变化.我希望计时器UILabel占用所需的宽度和URL标签以占用其余部分.这意味着如果计时器更长,更短的URL等.
如何在自动布局中执行此操作?最好在Interface Builder中?
我试图使用可视化格式语言来居中视图.
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_progressView(300)]-|" options:NSLayoutFormatAlignAllCenterY metrics:0 views:views]];
Run Code Online (Sandbox Code Playgroud)
(views是一个NSDictionaryOfVariableBindings包含_progressView)
它不会将我的视图(宽度:300)置于self.view(宽度:768)内.它将它与8像素边距对齐,好像我只会写@"H:|-[_progressView(300)".
是使用类似的东西来中心视图的唯一方法:?
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_progressView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual
toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
Run Code Online (Sandbox Code Playgroud)
谢谢
ios ×9
autolayout ×7
objective-c ×5
uilabel ×2
xcode ×2
cocoa-touch ×1
ios7 ×1
iphone ×1
macos ×1
swift ×1
uiscrollview ×1