标签: nslayoutconstraint

NSLayoutConstraints并动态设置视图的宽度/高度

我有一个关于设置视图大小的问题,我正在应用一些布局约束.
如何在不定义视图的情况下定义视图的大小?

我正在尝试创建一个高度固定且在屏幕原点具有原点的视图.它填充视图的宽度,以便在设备旋转时视图延伸到屏幕的宽度.这是我到目前为止所得到的......

self.containerView = [[HitTestContainerView alloc] init];
[self.containerView setBackgroundColor:[UIColor redColor]];
[self.view addSubview:self.containerView];

NSDictionary *viewsDictionary = @{@"view":self.containerView};
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[view]-250-|" options:0 metrics:nil views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:verticalConstraints];
[self.view addConstraints:horizontalConstraints];
Run Code Online (Sandbox Code Playgroud)

问题是除非我设置框架,否则我无法在屏幕上显示任何内容containerView.在不使用Interface Builder的情况下执行此操作的正确方法是什么?

xcode objective-c ios nslayoutconstraint

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

启用+禁用自动布局约束

我有一个简单的(我认为)问题:我有一个UIImageView,我在故事板中设置了多个约束.

有时,我需要禁用约束,并frame手动设置它,但稍后,我将要重新启用这些约束并让视图返回到约束所决定的位置.

我以为我可以这样做:

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var constraint: NSLayoutConstraint!

func example() { 

    //to set its location and size manually
    imageView.removeConstraint(constraint) 
    imageView.frame = CGRectMake(...)

    //to cause it to return to its original position
    imageView.addConstraint(constraint) 

}
Run Code Online (Sandbox Code Playgroud)

但是,有了这个,我得到了错误2015-08-26 01:14:55.417 Constraints[18472:923024] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fbb72815f90 V:[_UILayoutGuide:0x7fbb72814c20]-(100)-[UIImageView:0x7fbb72814540]>.有谁知道为什么会出现这个错误?

view通过调用添加约束来self.view.addConstraint(...)消除错误,但仍然没有将图像视图带回到它应该的位置.

我注意到我甚至不必删除或停用约束,以便能够设置imageView没有问题的框架,只要我不打电话setTranslatesAutoresizingMaskIntoConstraints(true).

我已经看过这个问题,但答案似乎不必要地复杂,可能已经过时,甚至不适用.

我也看到了这个问题,但这并没有涵盖可以重新启用的约束 - 只能禁用它们.

试图设置active属性:

self.top.active = …
Run Code Online (Sandbox Code Playgroud)

nslayoutconstraint swift

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

什么时候应该将translatesAutoresizingMaskIntoConstraints设置为true?

我已经阅读了文档.但是我还不确定什么时候不需要设置它false.在下面的代码中,如果我将其设置为falseI,则根本不会看到标题.如果我把它留下来true,那么一切都会好的.

在View调试层次结构中,它将发出警告" 宽度位置不明确".

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

    let header = UIView()
    header.translatesAutoresizingMaskIntoConstraints = false
    header.backgroundColor = .orange
    header.heightAnchor.constraint(equalToConstant: 10).isActive = true

    return header
}
Run Code Online (Sandbox Code Playgroud)

我想,每当我需要修改代码中的任何东西,我将不得不设置translatesAutoresizingMaskIntoConstraintsfalse.

也许更正确的说法是你需要删除所有约束然后将其设置为false然后添加你喜欢的东西,在这种情况下你需要为所有4个边添加约束.

但是,如果您需要保留系统提供给您的内容,在这种情况下,tableView将管理其位置和宽度,然后离开true.

是对的吗?

uitableview ios autolayout nslayoutconstraint swift

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

使用约束以编程方式构建titleView(或者通常使用约束构建视图)

我正在尝试使用如下所示的约束构建titleView:

titleview的

我知道如何用帧来做这件事.我会计算文本的宽度,图像的宽度,创建一个宽度/高度包含两者的视图,然后将两者作为子视图添加到具有框架的适当位置.

我试图理解如何通过约束来做到这一点.我的想法是内在的内容大小会帮助我在这里,但我正在疯狂地试图让这个工作.

UILabel *categoryNameLabel = [[UILabel alloc] init];
categoryNameLabel.text = categoryName; // a variable from elsewhere that has a category like "Popular"
categoryNameLabel.translatesAutoresizingMaskIntoConstraints = NO;
[categoryNameLabel sizeToFit]; // hoping to set it to the instrinsic size of the text?

UIView *titleView = [[UIView alloc] init]; // no frame here right?
[titleView addSubview:categoryNameLabel];
NSArray *constraints;
if (categoryImage) {
    UIImageView *categoryImageView = [[UIImageView alloc] initWithImage:categoryImage];
    [titleView addSubview:categoryImageView];
    categoryImageView.translatesAutoresizingMaskIntoConstraints = NO;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|[categoryImageView]-[categoryNameLabel]|" options:NSLayoutFormatAlignAllTop metrics:nil views:NSDictionaryOfVariableBindings(categoryImageView, categoryNameLabel)];
} else { …
Run Code Online (Sandbox Code Playgroud)

ios nslayoutconstraint

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

了解自动布局中的乘数以使用相对定位

我试图了解如何利用自动布局相对于其他视图按百分比定位项目.

例如,我最近了解到,您可以使用以下命令指定视图的底部应比其superview的底部高出4%:

self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Bottom, relatedBy: .Equal, toItem: self.view, attribute: .Bottom, multiplier: 0.96, constant: 0))
Run Code Online (Sandbox Code Playgroud)

这对我来说很有意义,因为1的乘数会在视图的底部对齐它,因此您可以通过将乘数更改为0.96来将该数量减少4%.

但是你怎么能在另一个方向做同样的事情呢?你想指定一个标签的顶部应该从superview的顶部开始下降4%.如果您使用相同的行但是将属性更改为.Top,这意味着它将比superview的顶部高4%(但它实际上不会将其移出屏幕).你不能有一个我不认为的负乘数,而且我不相信大于1的值在常数为0时会做任何事情.所以你如何得到这个设置?

我有同样的问题来实现前导和尾随.尾随很容易.如果你想从右边10%:

self.view.addConstraint(NSLayoutConstraint(item: label, attribute: .Trailing, relatedBy: .Equal, toItem: self.view, attribute: .Trailing, multiplier: 0.9, constant: 0))
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为你拨回0.1或10%而不是完全对齐1.0.但你如何做同样的领导?我以为你可以设置标签相对于视图尾部的前导,然后将乘数设置为0.1.在我看来,这意味着标签将从最右边开始,然后被拨回90%,因此从左边获得所需的10%.但事实并非如此,我不确定为什么.

你能解释一下这是如何工作的,如何正确使用乘数来获得这些相对布局?

为了方便起见,假设您想要创建一个标签,该标签具有超视图高度的10%的顶部和底部,并且尾随并超过超视图宽度的10%.在iPhone的纵向上,标签上方和下方的填充比在左侧和右侧的填充更多,就像这样(是的,它是按比例绘制的):
在此输入图像描述

但是,让我们在iPad上说它将会在一个完美的正方形视图中显示出来.因此,填充将是相同的数量,如下所示:
在此输入图像描述

问题是如何将这些约束定义为动态值,而不是为常量设置固定值.我已经知道如何做到底部和尾随,但顶部和领先让我难过.我希望了解如何使用乘数来进行更高级的布局,例如,指定标签的顶部应该位于另一个标签底部下方10%,而不是将其设置为固定常量.

ios autolayout nslayoutconstraint

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

使用AutoLayout在UIScrollView中使用UITextView

我试图在UIScrollView中使用AutoLayout放置UITextView,但没有运气.我试过的是,

  • 我将UIScrollView放在Storyboard的主视图中
  • 我将UITextView放在故事板中的UIScrollView中,并禁用了Scrolling Enabled
  • 我在UIScrollView上设置了约束(前导,尾随,顶部,底部)
  • 我在UITextView上设置了约束(top,leading,trailing,height)
  • 我创建了UITextView的高度约束的IBOutlet
  • 我在viewDidLoad()中的UITextView上设置了一个文本(很多可能导致滚动的文本)
  • 我用下面的代码设置了UITextView的高度约束.我在viewDidLoad()和viewDidLayoutSubviews()中设置文本后没试过就没试过

self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, FLT_MAX)].height;

UITextView正在增加其高度,但UIScrollView却没有.有什么我错过的吗?

objective-c uiscrollview uitextview autolayout nslayoutconstraint

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

使用AutoLayout约束隐藏UIView

我有时会想要从布局中删除子视图.它不仅应该被隐藏,而且不应该被视为视图"流"的一部分,可以这么说.一个例子:

在此输入图像描述

我正在寻找一种策略来以编程方式隐藏橙色视图.框的布局及其内容是通过自动布局进行的.有两点需要注意:

  • 橙色框根据内容定义其垂直高度,以及边距的一些顶部/底部偏移.因此,将标签的文本设置为nil只会将视图"缩小"到它的内部边距,它的高度不会为0.
  • 同样,三个方框之间的垂直间距意味着即使橙色框的高度为0,红色和黄色之间的间隙也将是所需的两倍.

可能的解决方案

我最好的建议是在橙色框中添加一个约束,将其高度设置为0.为此,我需要对橙色框内的所有垂直约束使用非必需的优先级.同时,容器应更新用于分隔框的约束的常量.我不太喜欢这种方法,因为橙色盒子类正在定义它的内部约束,并考虑到它的superview的行为.如果橙色框视图反而暴露了一个"崩溃"方法,它本身就添加了0高度约束,也许我可以忍受它.

有更好的方法吗?

uiview ios autolayout nslayoutconstraint

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

如何在使用autolayout进行自动旋转时重新排列视图?

我经常遇到这个问题,我希望我的观点以一种方式排列为纵向,而对于景观则有一种截然不同的方式.

有关简化示例,请考虑以下事项:

肖像:

景观:

请注意,在纵向上图像是垂直堆叠的,但在横向上,它们是并排的?

当然,我可以手动计算位置和大小,但对于更复杂的视图,这很快就会变得复杂.另外,我更喜欢使用Autolayout,因此设备特定的代码更少(如果有的话).但这似乎要写很多 Autolayout代码.有没有办法通过故事板为这类东西设置约束?

uikit ios xcode-storyboard autolayout nslayoutconstraint

29
推荐指数
1
解决办法
1897
查看次数

处理iOS 10中的AutoLayout约束动画差异?

我注意到在iOS 10 Beta 5(即将试用Beta 6)中,AutoLayout约束动画的行为略有不同.

例如,此方法与以前的iOS版本中的工作方式不同:

[view addConstraints:@[constraints...]];

[view setNeedsUpdateConstraints];
[view layoutIfNeeded];

[UIView animateWithDuration:...
{
    /* adjust constraint here... */
    [view layoutIfNeeded]; // Only the adjusted constraints since previous layoutIfNeeded() call should animate change with duration.

} completion:{ ... }];
Run Code Online (Sandbox Code Playgroud)

...在我的测试中,最初添加的约束addConstraints()将在iOS 10中使用UIView 块进行动画处理......这导致了迄今为止一些时髦/不良行为.animateWithDuration()

例如,在数组中设置左/右约束(但块中的垂直约束)会导致整个视图使用此方法对角地在屏幕上进行动画处理......这是完全错误的.

有没有人知道如何正确地为iOS 9(及以下)以及10?

animation uikit autolayout nslayoutconstraint ios10

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

所有这些自动布局更新方法有什么区别?都有必要吗?

在下面的代码中,调用这四种方法进行布局推理.我有点困惑为什么所有这些都是需要的,以及它们彼此不同的做法.它们在过程中用于通过自动布局使单元格的高度变为动态.(来自该库这个问题.)

[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
[cell.contentView setNeedsLayout];
[cell.contentView layoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)

它来自这个单元格高度的代码块:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    RJTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    [cell updateFonts];

    NSDictionary *dataSourceItem = [self.model.dataSource objectAtIndex:indexPath.row];
    cell.titleLabel.text =  [dataSourceItem valueForKey:@"title"];
    cell.bodyLabel.text = [dataSourceItem valueForKey:@"body"];

    cell.bodyLabel.preferredMaxLayoutWidth = tableView.bounds.size.width - (kLabelHorizontalInsets * 2.0f);

    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];
    [cell.contentView setNeedsLayout];
    [cell.contentView layoutIfNeeded];

    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    return height;
}
Run Code Online (Sandbox Code Playgroud)

但他们的做法有何不同?他们为什么都需要?

objective-c uiview ios autolayout nslayoutconstraint

28
推荐指数
1
解决办法
9576
查看次数