我有一个关于设置视图大小的问题,我正在应用一些布局约束.
如何在不定义视图的情况下定义视图的大小?
我正在尝试创建一个高度固定且在屏幕原点具有原点的视图.它填充视图的宽度,以便在设备旋转时视图延伸到屏幕的宽度.这是我到目前为止所得到的......
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的情况下执行此操作的正确方法是什么?
我有一个简单的(我认为)问题:我有一个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) 我已经阅读了文档.但是我还不确定什么时候不需要设置它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)
我想,每当我需要修改代码中的任何东西,我将不得不设置translatesAutoresizingMaskIntoConstraints到false.
也许更正确的说法是你需要删除所有约束然后将其设置为false然后添加你喜欢的东西,在这种情况下你需要为所有4个边添加约束.
但是,如果您需要保留系统提供给您的内容,在这种情况下,tableView将管理其位置和宽度,然后离开true.
是对的吗?
我正在尝试使用如下所示的约束构建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) 我试图了解如何利用自动布局相对于其他视图按百分比定位项目.
例如,我最近了解到,您可以使用以下命令指定视图的底部应比其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%,而不是将其设置为固定常量.
我试图在UIScrollView中使用AutoLayout放置UITextView,但没有运气.我试过的是,
self.textViewHeightConstraint.constant = [self.textView sizeThatFits:CGSizeMake(self.textView.frame.size.width, FLT_MAX)].height;
UITextView正在增加其高度,但UIScrollView却没有.有什么我错过的吗?
objective-c uiscrollview uitextview autolayout nslayoutconstraint
我有时会想要从布局中删除子视图.它不仅应该被隐藏,而且不应该被视为视图"流"的一部分,可以这么说.一个例子:

我正在寻找一种策略来以编程方式隐藏橙色视图.框的布局及其内容是通过自动布局进行的.有两点需要注意:
我最好的建议是在橙色框中添加一个约束,将其高度设置为0.为此,我需要对橙色框内的所有垂直约束使用非必需的优先级.同时,容器应更新用于分隔框的约束的常量.我不太喜欢这种方法,因为橙色盒子类正在定义它的内部约束,并考虑到它的superview的行为.如果橙色框视图反而暴露了一个"崩溃"方法,它本身就添加了0高度约束,也许我可以忍受它.
有更好的方法吗?
我经常遇到这个问题,我希望我的观点以一种方式排列为纵向,而对于景观则有一种截然不同的方式.
有关简化示例,请考虑以下事项:


请注意,在纵向上图像是垂直堆叠的,但在横向上,它们是并排的?
当然,我可以手动计算位置和大小,但对于更复杂的视图,这很快就会变得复杂.另外,我更喜欢使用Autolayout,因此设备特定的代码更少(如果有的话).但这似乎要写很多 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?
在下面的代码中,调用这四种方法进行布局推理.我有点困惑为什么所有这些都是需要的,以及它们彼此不同的做法.它们在过程中用于通过自动布局使单元格的高度变为动态.(来自该库从这个问题.)
[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)
但他们的做法有何不同?他们为什么都需要?
autolayout ×7
ios ×7
objective-c ×3
swift ×2
uikit ×2
uiview ×2
animation ×1
ios10 ×1
uiscrollview ×1
uitableview ×1
uitextview ×1
xcode ×1