标签: autolayout

自动布局中的弹簧:在Xcode 5中使用约束均匀分布视图

我理解在Interface Builder中对齐,调整大小和分发视图的旧Struts和Springs方法.但是,我似乎无法弄清楚如何使用Xcode 5使用自动布局均匀分布视图.有一种方法可以使用Xcode 4,但该选项已经消失.

我有7个按钮排列在垂直堆栈中.在3.5英寸的布局上,它看起来很棒.当我在4英寸布局中预览屏幕时,所有按钮都保持紧密包装,并且最后一个按钮下方有大量空间.

我希望它们保持相同的高度,但我希望它们之间的空间能够弯曲,以便它们可以在屏幕上展开.

在此输入图像描述

我已经能够使按钮的高度弯曲并填充空间,但这不是我想要的行为.我想学习如何使用自动布局来替换旧的Springs行为,但我似乎无法通过Interface Builder找到任何方法.

我可以使用顶部按钮,它可以是顶部边缘的固定空间,也可以是顶部边缘的比例空间,同样适用于底部按钮和底部边缘.那些对我来说不那么重要,我也很擅长.

但我真的需要弄清楚如何在视图中的每个项目之间均匀分配额外的空间.

constraints interface-builder autolayout ios7 xcode5

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

如何(轻松)删除Xcode 6中Interface Builder中的约束

假设您已选择了一个对象,并且在"工具"面板中打开了"大小选择器".您可以看到应用于对象的约束列表.在约束列表中,您可以单击小齿轮并选择删除.你不能在Xcode 6中.

在IB中删除约束仍有几种方法:

  • 在文档大纲中找到约束并以这种方式删除它(但很难找到).
  • 单击故事板中的小栏并以该方式删除(可能难以点击).
  • 双击"大小选择器"中的约束,该约束将打开"属性"检查器并突出显示"文档大纲"中的约束.如果要删除多个,这可能会很麻烦.

不过,我想念齿轮删除功能的易用性,我想知道它是否仍然以类似的方式存在,我只能找到它.虽然其他方式有效,但我发现自己浪费了大量时间,特别是在使用新的大小级别功能时.那么,找到一种更简单的方法来删除它们?

xcode autolayout xcode6

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

iOS NSLayoutConstraint使用constraintWithItem修复宽度

我想设置一个约束,以编程方式为UIButton提供固定(常量)宽度.我知道我可以使用constraintsWithVisualFormat来做到这一点,但我一直在使用constraintWithItem来处理代码中的所有约束.如果有任何方法可以使用constraintWithItem,我想知道好奇/一致性.

objective-c ios autolayout

42
推荐指数
4
解决办法
4万
查看次数

使用大小类以编程方式实现两种不同的布局

我有四个按钮布局.在肖像中,它们应该一个在另一个之上.在横向上,它们应该是两列,每列有两个按钮.

我在代码中实现了按钮 -​​ 非常简单:

UIButton *btn1 = [[UIButton alloc] init];
[self.view addSubview: btn1]; 

UIButton *btn2 = [[UIButton alloc] init];
[self.view addSubview: btn2]; 

UIButton *btn3 = [[UIButton alloc] init];
[self.view addSubview: btn3]; 

UIButton *btn4 = [[UIButton alloc] init];
[self.view addSubview: btn4]; 

NSDictionary *views = NSDictionaryOfVariableBindings(btn1, btn2, btn3, btn4);

[btn1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn2 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn3 setTranslatesAutoresizingMaskIntoConstraints:NO];
[btn4 setTranslatesAutoresizingMaskIntoConstraints:NO];

// portrait constraints
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn1]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn2]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn3]-(50)-|"
                                                                 options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(50)-[btn4]-(50)-|"
                                                                 options:0 …
Run Code Online (Sandbox Code Playgroud)

autolayout ios8 size-classes

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

如何使用自动布局保持圆形imageView轮?

如何将矩形图像视图转换为可以在自动布局中保持形状而不设置宽度和高度限制的圆形图像视图?从而允许imageView定义它的大小,并且相对于其周围的对象,其大小越来越小,具有前导,尾随,顶部和底部约束.

前几天我问了一个类似的问题,但我认为这可能会以更简洁的方式提出.非常感谢!

编辑

好的,我开始尝试尽可能简单.我有一个名为"Cell"的视图和一个名为"dog"的UIImageView,就是这样.我不再在控制台中"无法同时满足约束",只是使用自动布局的两个简单视图.我仍在尝试使用此代码来绕过UIImageView:

profileImageView.layer.cornerRadius = profileImageView.frame.size.width / 2
profileImageView.clipsToBounds = true
Run Code Online (Sandbox Code Playgroud)

这是单元格约束设置:

截图1

这是配置文件pic约束设置:

截图2

这是没有代码的结果,没有舍入,但是很好和正方形:

截图3

以下是圆形代码的结果:

截图4

这对我来说没有意义,因为没有舍入代码,图像是方形的,并且代码是菱形的.如果它是正方形不应该是一个没有问题的圆圈?

编辑2

这是当我删除底部约束并为superview添加相同高度的.637乘数时发生的情况.

截图5

xcode ios autolayout swift ios-autolayout

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

UIScrollView使用自动布局错误偏移

我有一个相当简单的视图配置:

UIViewController,与孩子UIScrollViewUIImageView在此UIScrollView.我设置的UIImageView高度足以突破可见区域(即更高1024pt),并将Bottom space to superviewmy 的约束设置UIImageView为固定的正值(20例如).

项目布局

整个设置按预期工作,图像在其父级中滚动很好.除非滚动视图(如果滚动到视图底部,效果更明显),然后消失,再次出现(您切换到另一个视图并返回)滚动值将恢复,但内容为滚动视图移动到其父视图的外部顶部.

这不是一个简单的解释,我会尝试绘制它: 前一段的视觉表示

如果你想测试/查看源(或故事板,我没有编辑一行代码).我在我的github上放了一个小小的演示:https://github.com/guillaume-algis/iOSAutoLayoutScrollView

我确实阅读了iOS 6更新日志和关于这个特定主题的解释,并认为这是第二个选项(纯自动布局)的正确实现,但在这种情况下,为什么UIScrollView表现如此不规律?我错过了什么吗?

编辑:这是与#12580434 uiscrollview-autolayout-issue完全相同的问题.答案只是解决方法,因为任何人都找到了解决这个问题的正确方法,或者这是一个iOS错误?

编辑2:我找到了另一种解决方法,它将滚动位置保持在用户离开的相同状态(这是对12580434接受的答案的改进):

@interface GAViewController ()

@property CGPoint tempContentOffset;

@end


@implementation GAViewController

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    self.tempContentOffset = self.mainScrollView.contentOffset;
    self.scrollView.contentOffset = CGPointZero;
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    self.scrollView.contentOffset = self.tempContentOffset;
}
Run Code Online (Sandbox Code Playgroud)

这基本上保存了偏移量viewWillAppear,将其重置为原点,然后恢复该值viewDidAppear.问题似乎发生在这两个调用之间,但我无法找到它的起源.

uiscrollview ios autolayout

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

UILabel有时无法正确包装文本(自动布局)

我在视图中有一个uilabel设置.它没有宽度约束,但其宽度由缩略图图像的前导约束和视图边缘的尾随约束决定.

在此输入图像描述

标签设置为0行,并自动换行.我的理解是,这应该使uilabel的框架成长,有时它确实会发生.(在自动布局之前,我会计算并更新代码中标签的框架).

结果是,它在某些情况下可以正常工作,而在其他情况下则不然.看到大多数细胞在那里正常工作,但最后一个细胞看起来太大了.实际上它的尺寸合适.标题"Fair Oaks Smog Check Test"实际上以"Only"结尾.所以我对单元格大小的计算是正确的,它应该是那么大.但是,无论出于何种原因,标签都不会包装文本.它的框架宽度不会向右延伸,所以这不是问题.

在此输入图像描述

那么这里发生了什么?它是100%一致的,总是在那个单元格而不是它上面的单元格,这让我认为它与文本的大小有关,并且一旦将该视图添加到单元格中,UILabel就不会重新布置文本(其中使它实际上更小的宽度).

有什么想法吗?

一些额外的信息

从我创建的一个样本单元计算单元格的高度,并将其存储在静态变量中:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.items.count == 0) {
        return 60;
    }
    static TCAnswerBuilderCell *cell = nil;
    static dispatch_once_t pred;

    dispatch_once(&pred,
                  ^{
                      // get a sample cellonce
                      cell = [tableView dequeueReusableCellWithIdentifier:TC_ANSWER_BUILDER_CELL];
                  });
    [cell configureCellWithThirdPartyObject:self.items[indexPath.row]];
    return [cell heightForCellWithTableWidth:self.tableView.frame.size.width];
}
Run Code Online (Sandbox Code Playgroud)

我在运行中使用我的数据对象配置单元格,然后调用我在其上的方法,该方法计算具有给定表格宽度的单元格的高度(不能总是依赖于最初正确的单元格框架).

这反过来在我的视图上调用高度方法,因为它实际上是标签所在的位置:

- (CGFloat)heightForCellWithTableWidth:(CGFloat)tableWidth {
    // subtract 38 from the constraint above
    return [self.thirdPartyAnswerView heightForViewWithViewWidth:tableWidth - 38];
}
Run Code Online (Sandbox Code Playgroud)

此方法通过确定标签的正确宽度来确定高度,然后进行计算:

- (CGFloat)heightForViewWithViewWidth:(CGFloat)viewWidth {
    CGFloat widthForCalc = viewWidth - self.imageFrameLeadingSpaceConstraint.constant …
Run Code Online (Sandbox Code Playgroud)

ios autolayout

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

自动布局UIScrollView以及具有动态高度的子视图

使用自动布局约束我遇到了UIScrollView的麻烦.我有以下视图层次结构,通过IB设置约束:

- ScrollView (leading, trailing, bottom and top spaces to superview)
-- ContainerView (leading, trailing, bottom and top spaces to superview)
--- ViewA (full width, top of superview)
--- ViewB (full width, below ViewA)
--- Button (full width, below ViewB)
Run Code Online (Sandbox Code Playgroud)

ViewA和ViewB的初始高度为200点,但可以通过单击将其垂直扩展到400点的高度.ViewA和ViewB通过更新其高度约束(从200到400)进行扩展.这是相应的片段:

if(self.contentVisible) {
    heightConstraint.constant -= ContentHeight;
    // + additional View's internal constraints update to hide additional content 
    self.contentVisible = NO;
} else {
    heightConstraint.constant += ContentHeight;
    // + additional View's internal constraints update to show additional content
    self.contentVisible = YES; …
Run Code Online (Sandbox Code Playgroud)

objective-c uiscrollview ios autolayout

40
推荐指数
3
解决办法
6万
查看次数

ios10:viewDidLoad框架宽度/高度未正确初始化

自升级到XCode8 GM和ios10以来,通过Interface Builder创建的所有视图都没有正确初始化,直到比预期要晚得多.这意味着在viewDidLoad,cellForRowAtIndexPath,viewWillAppear等中,每个视图的帧大小都设置为{1000,1000}.在某些时候他们似乎是正确的,但它为时已晚.

遇到的第一个问题是全面的角落圆角失败:

view.layer.cornerRadius = view.frame.size.width/2
Run Code Online (Sandbox Code Playgroud)

对于依赖于帧大小在代码中进行计算的任何事情,都会出现进一步的问题.

cellForRowAtIndexPath 
Run Code Online (Sandbox Code Playgroud)

对于cellForRowAtIndexPath,帧大小在初始表显示时失败,但滚动后它可以正常工作.willDisplayCell:forRowAtIndexPath也没有正确的帧大小.

我已经对一些值进行了硬编码,但显然这是非常糟糕的代码实践,在我的项目中也是如此.

有没有办法或地方获得正确的框架尺寸?

编辑

我发现使用高度/宽度约束而不是帧宽高度更可靠.这可能会增加需要大量新IBOutlet的开销,以链接项目的高度/宽度约束.

现在我已经创建了一个UIView类,它允许我在没有IBOutlets的情况下直接访问View的高度/宽度约束.对于最小的使用,小循环不应该是一个大问题.对于没有明显创建宽度/高度约束的IB项目,不能保证结果.可能最好为常数返回0,或者更糟.此外,如果您没有高度/宽度约束,并且您的视图基于前导/尾随约束动态调整大小,则这将不起作用.

-viewDidLoad似乎具有正确的帧大小,但如果您在此处进行修改,通常会导致UI的可视更改.

UIView的+ WidthHeightConstraints.h

@interface UIView (WidthHeightConstraints)

-(NSLayoutConstraint*)widthConstraint;
-(NSLayoutConstraint*)heightConstraint;
-(NSLayoutConstraint*)constraintForAttribute:(NSLayoutAttribute)attribute;

@end
Run Code Online (Sandbox Code Playgroud)

UIView的+ WidthHeightConstraints.m

#import "UIView+WidthHeightConstraints.h"

@implementation UIView (WidthHeightConstraints)

-(NSLayoutConstraint*)widthConstraint{
    return [self constraintForAttribute:NSLayoutAttributeWidth];
}
-(NSLayoutConstraint*)heightConstraint {
    return [self constraintForAttribute:NSLayoutAttributeHeight];
}
-(NSLayoutConstraint*)constraintForAttribute:(NSLayoutAttribute)attribute {
    NSLayoutConstraint *targetConstraint = nil;
    for (NSLayoutConstraint *constraint in self.constraints) {
        if (constraint.firstAttribute == attribute) {
            targetConstraint = constraint;
            break;
        }
    }
    return targetConstraint;
}

@end
Run Code Online (Sandbox Code Playgroud)

编辑2

事实证明,上述类别只是部分有效.主要是因为ios似乎自动添加一些额外的高度/宽度约束重复项,类型为NSContentSizeLayoutConstraint,实际上与普通约束的大小不同.NSContentSizeLayoutConstraint也是一个私有类,所以我不能做isKindOfClass来过滤掉那些.我还没有找到另一种有效测试的方法.这很烦人.

objective-c frame autolayout ios10 xcode8

40
推荐指数
3
解决办法
7665
查看次数

Xcode 8添加布局边距崩溃

当我尝试将布局边距添加到TableViewCell上的标签时,使用Xcode上的右侧面板,我尝试添加显式边距(顶部,左侧,底部,右侧).但是,只要我输入数字值,或点击箭头更改值,Xcode就会崩溃.

我附上了一张照片,以显示我正在尝试添加布局边距的面板,以及它崩溃的位置.

任何想法为什么它不会让我调整利润?

图像 - 编辑布局边距面板

xcode ios autolayout xcode8

38
推荐指数
1
解决办法
1373
查看次数