在下面的代码中,调用这四种方法进行布局推理.我有点困惑为什么所有这些都是需要的,以及它们彼此不同的做法.它们在过程中用于通过自动布局使单元格的高度变为动态.(来自该库从这个问题.)
[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)
但他们的做法有何不同?他们为什么都需要?
Xcode表示没有布局问题,但正如你所看到的那样.我尝试了一切.苹果文档,YouTube,谷歌等.看来我做得对,但是我正在做的事情或其他事情导致这些问题.在尝试了一切之后,我终于让Xcode add missing constraints成为迄今为止最好的结果.我在9个UIImages上有9个按钮,所以我必须对按钮执行与UIImages相同的操作.我暂时把UIImages放在按钮的顶部,这样我就可以更容易地看到我在做什么了.我有2个截图.请指教.
开始

这是在使用Xcode的add missing constraints选项之后.排序我想要的但没有雪茄.

我有可可自动布局的问题,无法解决这个问题.我想要实现的是让两个按钮始终在视图中居中,如下所示.

我尝试了很多不同的方法但没有成功:(请帮帮我.
我的应用程序本地化为英语和阿拉伯语.
不幸的是,有时不需要本地化的自动布局行为.通过这个,我的意思是反转前导和尾随空格.我想覆盖这种行为.有没有办法做到这一点?
我想在cellForRowAtIndexPath中添加一些视图到我的单元格内容视图和它们的约束但没有任何作用.我有这样的事情:
NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:imageView
attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:cell.contentView attribute:NSLayoutAttributeLeft multiplier:1.0f constant:10.0f];
[cell.contentView addConstraint:constraint];
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
假设我有一个如下所示的项目:

有两个UIViews - 一个叫yellowBox,另一个叫redBox.自动布局约束规定yellowBox从超视图顶部开始有60个点,有350个前导和尾随空格(即视图的左侧和右侧).在redBox具有相同的前端和后端空间的限制.两个0之间有一个垂直空间约束,表示底部yellowBox应始终直接位于顶部redBox.
当用户点击"扩展黄色框"按钮时,我希望yellowBox增加的高度,结果redBox向下移动以继续满足垂直空间约束(yellowBox始终位于顶部redBox).这是动画代码:
- (IBAction)expandYellowBox:(id)sender {
[UIView animateWithDuration:0.5
animations:^{
CGRect newFrame = self.yellowBox.frame;
newFrame.size.height += 50;
self.yellowBox.frame = newFrame;
}];
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直无法正常工作.正如您在红色图标中看到的那样,目前的约束存在问题:

这是公平的,因为自动布局无法知道盒子的高度.但是,我不知道如何以这样的方式解决这个问题,它将允许调整框的大小和移动.例如,如果我在yellowBoxthen 上指定一个高度约束,则会阻止它的大小调整.如果我将高度约束设置为大于或等于(以允许yellowBox高度增加),那么我得到一个不同的约束错误:
所有约束都是在故事板中使用Xcode建立的 - 没有一个是用代码编写的.
任何帮助非常感谢.
编辑:事实证明,yellowBox当点击按钮时,它正在增长 - 这只是我无法分辨,因为它出现在后面redBox.我只是在四次点击后才注意到它开始出现在底部redBox.然而,同样的问题仍然存在 - 如何让redBox总是坚持下去yellowBox.
我在视图控制器(VC)上添加了一个uiview,尝试设置它的宽度等于VC视图的宽度.
我设定和期望的内容:

我在iPhone 6 plus上得到了什么:

我试图改变领先空间和尾随空间的常量而没有帮助.iphone 6+ autolayout有什么特别之处吗?
此处的视图设置为"任意宽度x常规高度"
-------已添加2016年12月对于像我这样困惑的人:UIView中有一个布局边距属性,它是一个UIEdgeInsets(8,8,8,8).这就像css padding.
当视图的边缘靠近超视图的边缘并且preservesSuperviewLayoutMargins属性为true时,可以增加实际的布局边距以防止内容与superview的边距重叠.
默认边距为每边八个点.
如果视图是视图控制器的根视图,则系统会设置和管理边距.顶部和底部边距设置为零点.侧边距取决于当前尺寸等级,但可以是16或20点.您无法更改这些边距.
新的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定义的约束?
我想计算我的内容大小UITableView.我正在使用高度自动布局UITableViewAutomaticDimension.
尝试[UITableView contentsize]重新加载tableview后,在这种情况下高度得到基于计算estimatedRowHeight.
self.tableView.estimatedRowHeight = 50;
self.tableView.rowHeight = UITableViewAutomaticDimension;
Run Code Online (Sandbox Code Playgroud)
代表 -
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return UITableViewAutomaticDimension;
}
Run Code Online (Sandbox Code Playgroud)
尝试获取内容大小并将其指定为高度约束.
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Run Code Online (Sandbox Code Playgroud)
有什么建议?提前致谢.
编辑:
最后我通过一些调整解决了我的问题.在重新加载表格数据之前,我将tableview高度更改为max(在我的情况下300是max),因此tableview有空间来调整所有单元格的大小.
self.tableHeightConstraint.constant = 300;
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
self.tableHeightConstraint.constant = self.tableView.contentSize.height;
Run Code Online (Sandbox Code Playgroud)
感谢帮助.
该应用程序打开一个对话框,NSOpenPanel允许用户选择图像.当我选择图像并选择"打开"时,我收到以下错误:
2016-11-03 10:23:25.589283 PA位置数据[9008:265214] [布局]检测到NSTextField的缺失约束:0x6000001e3a00.它无法放置,因为没有足够的约束来完全定义大小和原点.添加缺少的约束,或设置translatesAutoresizingMaskIntoConstraints = YES,并为您生成约束.如果此视图在macOS 10.12及更高版本上手动布局,您可以选择不从覆盖中调用[super layout].在DETECTED_MISSING_CONSTRAINTS上设置断点以进行调试.此错误仅记录一次.
公开对话然后冻结,不能被解雇.
正如所建议的那样,我为DETECTED_MISSING_CONSTRAINTS设置了一个断点,并DETECTED_MISSING_CONSTRAINTS在此代码中发现执行正在暂停:
func happyAlert(message: String, info: String) {
let myPopup: NSAlert = NSAlert()
myPopup.messageText = message
myPopup.informativeText = info
myPopup.alertStyle = NSAlertStyle.informational
myPopup.addButton(withTitle: "OK")
myPopup.runModal()
}
Run Code Online (Sandbox Code Playgroud)
此警报通知用户图像已通过或未通过各种验证检查.
过去发生的事情是图像被选中,被myPopup.runModal()解雇和警报出现没有任何问题.
现在我得到了关于NSTextField的约束的错误,但是我不明白它们为什么会在这里涉及,特别是因为xCode没有标记任何与底层视图的自动布局问题.
任何人都可以解释可能发生的事情和/或进一步调试的策略吗?我的经历有限,我很困惑.
autolayout ×10
ios ×8
cocoa-touch ×2
objective-c ×2
uiview ×2
cocoa ×1
constraints ×1
ios6 ×1
iphone ×1
macos ×1
nsalert ×1
swift ×1
uitableview ×1
xcode ×1