标签: autolayout

autolayout - 使视图的高度相对于半视图高度的一半

最近我一直在进行自动布局,而我却陷入了一个看起来非常微不足道的问题的例子.我认为我想坐在屏幕的顶部,占据屏幕高度的一半.在自动布局之前很简单 - 只需将其固定到位并告诉它在superview调整大小时垂直扩展.

现在,我不能为我的生活看到如何做到这一点.这是我尝试设置时得到的结果:

自动布局蓝调

底部空间约束被设置为"等于284",当我改为iPhone4布局时,这对我来说绝对无用,因为它在屏幕底部保留284个点空间,并且缩小视图不再是屏幕大小.并且没有办法将该约束设置为等于任何其他视图高度的某个部分.

经过一段时间的挣扎之后,我能想到的唯一方法是在这个视图下方引入另一个视图,将它们的高度平均固定,让它们相互坐在上下,然后将第二个(底部)视图设置为不可见..这看起来有点难看!

我错过了一些明显的东西吗?

ios autolayout

132
推荐指数
5
解决办法
9万
查看次数

具有动态单元格高度的UITableView的reloadData()导致跳转滚动

我觉得这可能是一个普遍的问题,并且想知道是否有任何共同的解决方案.

基本上,我的UITableView具有每个单元格的动态单元格高度.如果我不在UITableView和我的顶部tableView.reloadData(),向上滚动变得有点跳跃.

我相信这是因为我重新加载数据,因为我正在向上滚动,UITableView会重新计算每个进入可见性的单元格的高度.如何缓解这种情况,或者如何仅将数据从某个IndexPath重新加载到UITableView的末尾?

此外,当我设法一直滚动到顶部时,我可以向下滚动然后向上滚动,没有跳跃没问题.这很可能是因为已经计算了UITableViewCell高度.

uitableview ios autolayout swift

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

iOS:如何为新的自动布局约束(高度)设置动画

我以前从未使用过autolayout约束.我有一个小的新应用程序我正在研究并注意到NIB的观点默认为自动布局.所以,我想我会抓住机会它一起努力,并试图找出Apple的目标.

第一个挑战:

我需要调整MKMapView的大小,我想将它设置为新位置.如果我按照以前的方式这样做:

[UIView animateWithDuration:1.2f
     animations:^{
         CGRect theFrame = worldView.frame;
         CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
         worldView.frame = newFrame;
}];
Run Code Online (Sandbox Code Playgroud)

...然后,只要兄弟视图得到更新,MKMapView就会"快速"回到原来的高度(在我的情况下,正在更新UISegmentedControl的标题[myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]).

所以,我觉得我想要做的是从等于父视图的HIGHT到可相对于UISegmentedControl的顶部,它改变的MKMapView的限制覆盖:V:[MKMapView]-(16)-[UISegmentedControl]

我想要的是缩短MKMapView高度,以便显示地图视图下方的一些控件.为此,我认为我需要将约束从固定的全尺寸视图更改为底部被约束到UISegmentedControl顶部的约束...并且我希望它在视图缩小到新大小时进行动画处理.

怎么会这样呢?

编辑 - 虽然视图底部立即向上移动170,但此动画不是动画:

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];
Run Code Online (Sandbox Code Playgroud)

并且nibMapViewConstraint在IB中连接到底部垂直空间约束.

uiview ios autolayout nslayoutconstraint

122
推荐指数
3
解决办法
8万
查看次数

使用UITableViewCell子类执行-layoutSubviews后仍需要"自动布局"

使用XCode 4.5和iOS 6,我正在开发一个带有自定义单元格的简单表视图的应用程序.我已经在iOS 5及以下版本中完成了这一百次,但由于某种原因,新的autoLayout系统给了我很多麻烦.

我在IB中设置了我的表格视图和原型单元格,添加了子视图并将它们连接起来作为IBOutlets然后设置我的委托和dataSource.但是现在每当从第一个单元格中取出时cellForRowAtIndexPath,我都会收到以下错误:

***断言失败 - [ShopCell layoutSublayersOfLayer:],/ SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776

***由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'执行-layoutSubviews后仍需要自动布局.ShopCell的-layoutSubviews实现需要调用super.

我没有在我的子类化单元格(ShopCell)中实现-layoutSubviews方法,即使我尝试这样做并添加超级调用,因为它表明我仍然得到相同的错误.如果我从IB中的单元格中删除子视图,并将其更改为标准的UITableViewCell,一切都按预期工作,但当然我的单元格中没有数据.

我几乎可以肯定,我有一些简单的东西,但我找不到任何文件或指南来暗示我做错了什么.任何帮助,将不胜感激.

编辑:只是尝试将其更改为IB中的UITableViewCell并保留所有子视图,仍然是相同的错误.

objective-c ios autolayout xcode4.5

115
推荐指数
10
解决办法
5万
查看次数

如何使用FlowLayout确定UICollectionView的高度

UICollectionView有一个UICollectionViewFlowLayout,我想计算它的内容大小(intrinsicContentSize通过AutoLayout调整其高度所需的返回).

问题是:即使我对所有单元都有一个固定且相等的高度,我也不知道我有多少"行"/行UICollectionView.我也无法通过数据源中的项目数来确定计数,因为表示数据项的单元格的宽度不同,因此我在一行中的项目数量也不同UICollectionView.

由于我在官方文档中找不到关于此主题的任何提示,谷歌搜索没有给我带来任何进一步的帮助和想法将非常感激.

height ios autolayout uicollectionview

111
推荐指数
8
解决办法
7万
查看次数

如何使用autolayout创建总宽度的百分比?

我需要创建三个动态列,每个列具有固定的总宽度百分比.不是三分之一,而是不同的价值观.例如,下图显示了三列:第一列为42%宽,第二列为25%宽,第三列为33%宽.

对于视图控制器上的600像素,分别为252,150和198像素.

但是,对于任何后续显示尺寸(即iPhone 4横向(960宽)或iPad 2纵向(768宽),我希望相对百分比相同(不是上面引用的像素宽度).

有没有办法使用Storyboard(即没有代码)?我可以在代码中轻松完成这项工作,但我的目标是尽可能多地将这种显示逻辑放入Storyboard中.

在此输入图像描述

xcode ios autolayout

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

使用自动布局在UICollectionView中指定单元格的一个维度

在iOS 8中,UICollectionViewFlowLayout支持根据自己的内容大小自动调整单元格大小.这根据其内容在宽度和高度上调整单元的大小.

是否可以为所有单元格的宽度(或高度)指定固定值,并允许其他尺寸调整大小?

对于一个简单的示例,请考虑单元格中的多行标签,其中约束将其定位到单元格的两侧.可以通过不同方式调整多行标签的大小以容纳文本.单元格应填充集合视图的宽度并相应地调整其高度.相反,单元格的大小是随意调整的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃.


iOS 8引入了方法systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:对于集合视图中的每个单元格,布局在单元格上调用此方法,传入估计的大小.对我来说有意义的是在单元格上覆盖此方法,传递给定的大小并将水平约束设置为required,并将垂直约束设置为低优先级.这样,水平尺寸固定为布局中设置的值,垂直尺寸可以灵活.

像这样的东西:

- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
    attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
    return attributes;
}
Run Code Online (Sandbox Code Playgroud)

然而,这种方法给出的尺寸是完全奇怪的.关于这种方法的文档对我来说是非常不清楚的,并提到使用UILayoutFittingCompressedSize UILayoutFittingExpandedSize仅代表零大小和相当大的常量.

size这个方法的参数真的只是传递两个常量的方法吗?难道没有办法实现我期望获得给定大小的适当高度的行为吗?


替代解决方案

1)添加将为单元格指定特定宽度的约束可实现正确的布局.这是一个糟糕的解决方案,因为该约束应该设置为单元的集合视图的大小,它没有安全的引用.在配置单元格时,可以传入该约束的值,但这似乎也完全违反直觉.这也很尴尬,因为直接向单元格或其内容视图添加约束会导致许多问题.

2)使用表格视图.由于单元格具有固定的宽度,因此表视图以这种方式开箱即用,但这不适用于其他情况,例如在多列中具有固定宽度单元格的iPad布局.

objective-c ios autolayout uicollectionview

110
推荐指数
3
解决办法
5万
查看次数

Autolayout:为superview添加约束而不是Top Layout Guide?

我在故事板中的UIViewController中有一个UIView,我想在空间上添加约束,查看距离上边缘的距离.

现在,当我通常按ctrl +拖动到ViewController的主视图时,我只能选择将其设置为顶部布局指南.

这对我来说是一个问题,因为在应用程序中的某一点我将主视图向上移动大约20-50px然后发生的是我不会移动的视图...因为它不与superview对齐.

如何在故事板中手动执行此操作或者是否必须以编程方式添加它?

我正在使用xcode 6.

storyboard ios autolayout nslayoutconstraint

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

UITableView动态单元格高度仅在某些滚动后才能正确显示

我有一个使用自动布局在故事板中定义UITableView的自UITableViewCell定义.细胞有几条多线UILabels.

UITableView出现要正确计算单元格高度,但在最初的几个细胞高度不正确的标签之间的分歧.滚动一下后,一切都按预期工作(即使是最初不正确的单元格).

- (void)viewDidLoad {
    [super viewDidLoad]
    // ...
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"TestCell"];
    // ...
    // Set label.text for variable length string.
    return cell;
}
Run Code Online (Sandbox Code Playgroud)

有什么我可能会遗漏,导致自动布局在前几次无法完成其工作吗?

我已经创建了一个演示此行为的示例项目.

示例项目:首次加载时示例项目的表格视图顶部. 示例项目:向下滚动和备份后的相同单元格.

uitableview ios autolayout ios8 ios-autolayout

107
推荐指数
9
解决办法
5万
查看次数

删除视图时,约束会发生什么

我的问题很简单,但我在文档中找不到任何信息.

从视图层次结构中删除视图(或移动到另一个视图)时,布局约束会发生什么?

例如,让我们容器C与子视图AB.容器C有一些约束.然后我们打电话[A removeFromSuperview].约束会发生什么A

那么如果我们增加会发生什么AC着?

ios autolayout nslayoutconstraint

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