标签: nslayoutconstraint

activateConstraints:和deactivateConstraints:在IB中创建的约束旋转后不持久

新的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定义的约束?

cocoa-touch ios autolayout nslayoutconstraint

27
推荐指数
2
解决办法
9412
查看次数

以编程方式设置约束

我正在试验如何使用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在大量的出将被装载到UIViewControllerUIScrollView.

在这种情况下,上述方法不起作用.滚动没有发生.我是否必须做一些不同的事情,因为我是单独加载视图的?

我在这里上传了一个演示项目,以便您可以看到它的实际效果.请参阅表格视图列表中的Email.xib并选择电子邮件.

objective-c uiscrollview uiviewcontroller ios nslayoutconstraint

26
推荐指数
3
解决办法
7万
查看次数

如何使用一个故事板用于带有自动布局(ios6 + ios7)的4英寸和3.5英寸iphone屏幕?

虽然有很多关于构建故事板布局的问题和答案,它可以在4"和3.5"屏幕尺寸上工作,但我找不到适合以下场景的解决方案.

我使用autolayout和ios6(和ios7),我不需要支持landscpae或ipad.我有一个带有几个子视图的UIView,它们必须看作下面的模型.可以轻松地在故事板中设置自动布局约束以适应任一屏幕尺寸.我的问题是 - 如何根据运行时的屏幕大小使autolayout选择正确的约束?

屏幕MOCKUPS

请注意,我不想使用2个不同的故事板.在我的整个应用程序中这样做将需要做很多工作,而且我必须在每个故事板上连接所有代理,出口和操作.屏幕上的变化需要我做两倍的工作.

我已经尝试了两种方法在一个故事板上完成这项工作,但我对其中任何一个都不满意.

  • 加倍约束.较大的约束(50)具有比较低约束(30)更高的优先级.这种方法的问题在于,在3.5英寸屏幕尺寸上,自动布局可能只选择几个较低优先级的约束 - 足以满足布局 - 但保留一些高优先级约束.

双重约束

  • 子类NSLayoutConstraint.在此方法中,故事板中的所有约束都设置为NSDualLayoutConstraint.在NSDualLayoutConstraint的初始化代码中,如果运行时屏幕大小为3.5",则约束的常量将更改为3_5_constant的值.此方法更具确定性,但您无法在界面构建器预览中看到3.5"布局.

在此输入图像描述


如果只有界面构建器约束具有将在屏幕大小为3.5"时应用的辅助常量值,那么它将解决我的问题.所以我仍然问我的问题 - 如何正确使用单个故事板来正确布局其子视图屏幕尺寸为4"和3.5"?

iphone interface-builder ios autolayout nslayoutconstraint

25
推荐指数
2
解决办法
9080
查看次数

如何在iOS Auto布局中为按钮添加Equal Spacing和相等宽度

我对Xcode中的Auto布局约束不熟悉.我有一个像UITabBar6的底部视图UIButtons.在没有约束的情况下,我将这些按钮与每个按钮的5个空格填充对齐,每个按钮的宽度为50.现在,我试图通过使用自动布局来支持所有屏幕尺寸.

在Storyboard约束中,我为6个按钮设置了相等的宽度,每个按钮之间有60个空格.我将第一个按钮0设置为前导空格,然后将最后一个按钮0设置为尾部约束.

我想要buttons with equal width and flexible spaces所有设备尺寸的视图之间.

有人可以帮我吗?寻求帮助.提前致谢.

在此输入图像描述

ios autolayout nslayoutconstraint swift

25
推荐指数
2
解决办法
2万
查看次数

如何以编程方式仅设置UILabel的宽度和高度以及约束

我想以编程方式创建一个UILabel高度,宽度,然后我想以编程方式为它添加约束以定位UILabel.

更新:

我想创建这样的UI:

在此输入图像描述

如何以编程方式创建此UI

label1同样创建一个标签的代码我创建了两个标签label2label3

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)

我也能够使用视图设置垂直约束,但我无法设置从一个标签到另一个标签的约束.

objective-c uilabel ios nslayoutconstraint

24
推荐指数
1
解决办法
5万
查看次数

Xcode复选框在哪里"将面具自动调整为约束"

在其中一个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.

macos xcode ios autolayout nslayoutconstraint

23
推荐指数
1
解决办法
2万
查看次数

以编程方式安装/卸载约束

有没有办法以constraint编程方式安装和卸载Xcode界面构建器?

在此输入图像描述

objective-c interface-builder ios autolayout nslayoutconstraint

23
推荐指数
1
解决办法
1万
查看次数

添加Xcode中"编辑器"菜单中未列出的约束

我正在尝试向我的NIB添加布局约束,我正在按照苹果提供的指示:

http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/030-Edit_User_Interfaces/edit_user_interface.html

它说关于添加约束:

添加约束选择要为其添加约束的一个或多个对象.

从"编辑器">"添加约束"菜单中选择约束,或从"编辑器">"对齐"菜单中选择对齐类型.

Add Constraint菜单无法找到.是什么赋予了?我怎样才能添加约束?

xcode ios nslayoutconstraint

22
推荐指数
1
解决办法
1万
查看次数

使用自动布局,如何在同一"线"上使两个标签的宽度动态变化(根据每个标签需要的宽度进行调整)?

假设我有两个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中?

objective-c uilabel ios autolayout nslayoutconstraint

22
推荐指数
2
解决办法
6686
查看次数

使用可视格式NSLayoutConstraints对中视图

我试图使用可视化格式语言来居中视图.

[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)

谢谢

objective-c autolayout nslayoutconstraint ios7

22
推荐指数
3
解决办法
2万
查看次数