我有一个只包含UILabel的视图.此标签包含多行文字.父级具有可变宽度,可以使用平移手势调整大小.我的问题是,当我这样做时,调整UILabel的大小不会重新计算其高度,使得所有内容仍然可见,它只是将其切断.
我已经设法通过一些黑客来修复它但运行速度非常慢:
- (void)layoutSubviews {
CGSize labelSize = [self.labelDescription sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
if (self.constraintHeight) {
[self removeConstraint:self.constraintHeight];
}
self.constraintHeight = [NSLayoutConstraint constraintWithItem:self.labelDescription attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:labelSize.height];
[self addConstraint:self.constraintHeight];
[super layoutSubviews];
}
Run Code Online (Sandbox Code Playgroud)
这不应该自动布局自动发生吗?
编辑
我的观点结构是:
UIScrollView
---> UIView
---> UILabel
Run Code Online (Sandbox Code Playgroud)
以下是UIScrollView的约束:
<NSLayoutConstraint:0x120c4860 H:|-(>=32)-[DescriptionView:0x85c81c0] (Names: '|':UIScrollView:0x85db650 )>,
<NSLayoutConstraint:0x120c48a0 H:|-(32@900)-[DescriptionView:0x85c81c0] priority:900 (Names: '|':UIScrollView:0x85db650 )>,
<NSLayoutConstraint:0x120c48e0 H:[DescriptionView:0x85c81c0(<=576)]>,
<NSLayoutConstraint:0x120c4920 H:[DescriptionView:0x85c81c0]-(>=32)-| (Names: '|':UIScrollView:0x85db650 )>,
<NSLayoutConstraint:0x120c4960 H:[DescriptionView:0x85c81c0]-(32@900)-| priority:900 (Names: '|':UIScrollView:0x85db650 )>,
<NSLayoutConstraint:0x8301450 DescriptionView:0x85c81c0.centerX == UIScrollView:0x85db650.centerX>,
Run Code Online (Sandbox Code Playgroud)
以下是UIView的约束:
<NSLayoutConstraint:0x85c4580 V:|-(0)-[UILabel:0x85bc7b0] (Names: '|':DescriptionView:0x85c81c0 )>,
<NSLayoutConstraint:0x85c45c0 H:|-(0)-[UILabel:0x85bc7b0] (Names: '|':DescriptionView:0x85c81c0 )>, …Run Code Online (Sandbox Code Playgroud) 我在iOS中使用autolayout尝试构建具有流体宽度的布局.我目前使用的约束的可视格式是:
[self.scrollViewContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-(>=32)-[viewToAdd(<=576)]-(>=32)-|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(viewToAdd)
]];
Run Code Online (Sandbox Code Playgroud)
也就是说:我希望两边至少有32px的间距,我希望它viewToAdd的最大宽度为576px.这很好用,除了我希望在viewToAdd满足所有约束的同时耗尽任何可用空间.目前,我viewToAdd只能获得与其固有内容大小一样宽的内容,并且间距会根据需要增长.
有没有办法指定viewToAdd应该尽可能大?
我的应用程序中有几个自定义UITableViewCells,主要由nibs定义.移动到iOS 8和Xcode 6时,左右边距不正确.这些单元格通常散布在具有默认单元格的表格视图中.
我做了一个示例项目,这是我正在谈论的保证金问题:

我能找到的唯一与此相关的是新物业layoutMargins.对于UITableViewCells,其值似乎会根据运行应用程序的设备而改变:
iPhone 6 and below - layoutMargin: {8, 16, 8, 16}
iPhone 6 Plus - layoutMargin: {8, 20, 8, 20}
Run Code Online (Sandbox Code Playgroud)
这似乎与我在标准单元格上看到的边缘对齐.但是,对于我的定制单元的内容是在细胞内contentView,它具有标准的UIView layoutMargin的{8, 8, 8, 8}.这意味着绑定到Container Margin的任何自动布局约束都会添加不正确的间距.
我发现解决这个问题的唯一方法是添加以下内容 cellForRowAtIndexPath:
cell.contentView.layoutMargins = cell.layoutMargins;
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个非常好的解决方案(特别是因为我需要将它包装在iOS8的支票中以保持兼容性).
有没有人有任何想法?我觉得我必须遗漏一些东西.
我正在使用带有transitionStyle UIPageViewControllerTransitionStyleScroll和navigationOrientation 的UIPageViewControllerUIPageViewControllerNavigationOrientationVertical
我也有一个UIPanGestureRecognizer视图,我想在平移手势处于活动状态时禁用页面滚动.
我想在手势开始时设置以下内容:
pageViewController.view.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何效果,或者似乎偶尔起作用.
我发现做它的唯一另一种方法(工作)是在平移手势运行时将UIPageViewController dataSource设置为nil,但这会在重置dataSource时造成巨大延迟.