由于iOS 8 [UIColletionViewCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]返回高度为0的大小.
这是代码的作用:
为了确定UICollectionViewiOS 7中单元格的大小,我使用systemLayoutSizeFittingSize:自动布局在xib文件中定义的单元格上使用.大小取决于UILabel作为UICollectionViewCell我的xib文件中的子视图的字体大小.标签的字体设置为UIFontTextStyleBody.所以基本上单元格的大小取决于iOS 7中的字体大小设置.
这是代码本身:
+ (CGSize)cellSize {
UINib *nib = [UINib nibWithNibName:NSStringFromClass([MyCollectionViewCell class]) bundle:nil];
// Assumption: The XIB file only contains a single root UIView.
UIView *rootView = [[nib instantiateWithOwner:nil options:nil] lastObject];
if ([rootView isKindOfClass:[MyCollectionViewCell class]]) {
MyCollectionViewCell *sampleCell = (MyCollectionViewCell*)rootView;
sampleCell.label.text = @"foo"; // sample text without bar
[sampleCell setNeedsLayout];
[sampleCell layoutIfNeeded];
return [sampleCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
}
return CGSizeZero;
}
Run Code Online (Sandbox Code Playgroud)
它在iOS 7中完美运行,但在iOS 8中运行不佳.不幸的是,我不知道为什么.
我正在为iPhone和iPad开发应用程序.它支持iOS6和iOS7,并且它仅使用自动布局.
上周,当Apple宣布iOS8已经准备好迎接黄金时段时,我将其中一部iPhone和iPad升级到了iOS8.我还将我的XCODE提升到版本6.我有第二部iPhone,我在iOS7上留下了.
我用Xcode 6生成了新的可执行文件,当我在运行iOS8的设备上执行时,我看到他们的屏幕布局搞砸了,但在iOS7上仍然很好.在我的物理设备和Xcode的仿真器上都是如此.
虽然我不知道为什么,但我现在已经很清楚了解发生了什么.
具体来说,iOS8上的某些自动布局操作失败了,但在iOS7上它们没问题.
一些涉及按钮的示例,我将其放置在基本视图上,其大小等于屏幕大小:
(1)如果我要求自动布局将按钮的水平中心(CX)定位为等于基础视图的水平中心,则结果是按钮的水平中心位于基础视图的左边缘.
(2)如果我要求自动布局使按钮的宽度等于底层视图宽度的50%,则它根本没有宽度.
我能够解决这些问题如下:
(1)我要求自动布局将按钮的中心定位为等于底层视图的左边缘加上屏幕宽度的50%.
(2)我要求自动布局使按钮的宽度等于屏幕宽度的50%.
我正在慢慢地抓住我的方式,使用类似这样的解决方法,回到在iOS7和iOS8上适用于我的自动布局代码.但我真的很想知道这里发生了什么.
看起来自动布局无法确定基础视图的大小,因此需要该信息失败的自动布局计算.但它确实知道视图的顶部和左侧边缘在哪里,因此基于这些数据的计算成功.
这是一个大型应用程序,我已经为iOS6和iOS7编写了数百行自动布局代码,对我来说非常适合.
我一直在调试并尝试使用iOS8三天,而且我开始时并不比我更聪明.
任何人对这里的问题有什么建议或想法?
在纵向模式下,我在左侧有一个桌面视图,在右侧有一个webview.它们都占据了屏幕的一半.我启用了autolayout.
但是当我将屏幕旋转到横向模式时,桌面视图的宽度占据屏幕尺寸的一半以下,并且webview最终会占用更多,而不是它们是偶数分割.
为什么会这样?无论屏幕方向如何,我如何才能让视图占据屏幕宽度的一半?
在我的视图控制器中,我有一个UITextView.此textview填充了一个字符串.字符串可以是短的或长的.根据字符串的长度,textview的高度必须调整.我使用故事板和自动布局.
我对textview的高度有些麻烦.
有时,高度完全适应文本.有时,不,文本在第一行被裁剪.下面,textview是黄色的.蓝色是滚动视图中的容器视图.紫色是一张照片的地方.

文本来自我的核心数据库,它们是字符串属性.在屏幕1和屏幕2之间,唯一改变的是字符串.
如果我在控制台中打印字符串,我有正确的文本:
my amazing new title
Another funny title for demo
Run Code Online (Sandbox Code Playgroud)
我的textview的限制:

我不明白为什么我有2个不同的显示器.
编辑
我尝试了@Nate建议,在viewDidLoad中,我补充说:
myTextViewTitle.text="my amazing new title"
myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical)
myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false)
let views = ["new_view": myTextViewTitle]
var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views)
self.view.addConstraints(constrs)
self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view(220@300)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
Run Code Online (Sandbox Code Playgroud)
没有结果.在界面构建器中为我的textview添加或不添加高度约束...
编辑2
我需要一个UITextView而不是UIlabel,因为后退按钮,使用排除路径.
let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height))
myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack]
Run Code Online (Sandbox Code Playgroud) 我有一个自定义UITableViewCell,它有一个缩略图和一堆文本.行高配置为使用自动计算
tableView.estimatedRowHeight = 129;
tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)
行高应该精确计算为138个点.iPhone 5上的一切看起来都很棒.但是,在iPhone 6 Plus上,对于具有以下日志的随机行,自动行高度无法间歇.
(
"<NSLayoutConstraint:0x17009ddd0 V:|-(20)-[scoop.ThumbnailImage:0x124d2a5a0] (Names: '|':UITableViewCellContentView:0x124e23200 )>",
"<NSLayoutConstraint:0x17009de70 UITableViewCellContentView:0x124e23200.bottomMargin == scoop.ThumbnailImage:0x124d2a5a0.bottom + 20>",
"<NSLayoutConstraint:0x17009e780 V:[scoop.ThumbnailImage:0x124d2a5a0(90)]>",
"<NSLayoutConstraint:0x17009ef00 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x124e23200(138.333)]>"
)
Run Code Online (Sandbox Code Playgroud)
日志的最后一行似乎表示由于某种原因行高计算为138.333 而不是138.我一直在敲我的头一段时间,但我无法弄清楚为什么会发生这种情况.有人可以帮忙吗?
更新:这是我的表格视图单元格的样子.

更新我无法从主要回购中获取代码,因为它是更大项目的一部分.但我设法通过一个非常简单的理智项目重现了这个问题.请在github上找到它.
说我有一个叫做的视图container.container包含5 UIButtons.我想补充的高度NSLayoutConstraint上container,这个高度应等于NSLayoutHeightAttribute其子视图最高的按钮.
我没有看到一种直截了当的方式来做到这一点.有人有主意吗?
我创建了一个全新的View Controller,然后添加了Scroll View作为根视图的子项,并将"Leading/Top/Trailing/Bottom Space"设置为0,以便滚动视图完全填充其父级.
然后我添加了一个按钮作为滚动视图的子项,空间约束为15到"Superview"(即滚动视图).因此我希望按钮的间距为15到顶部/左/右边框,滚动视图的内容以"按钮底部+ 15"结束.但是按钮的宽度不正确(在Xcode 5 Interface Builder,iOS 6/7模拟器中测试):

如果我用"Equade Width to Superview"限制按钮,它甚至不起作用!仍然没有占据全宽.
我该如何解决这个问题?
我想在iOS通用应用程序中放置两个UIBarButtonItem实例UIToolbar,第一个项目位于工具栏的左边缘,第二个项目位于中心.但是,看起来这不能在Interface Builder中完成,因为自动布局不支持强制UIBarButtonItem类的约束,因为它不是来自的子类UIView.
请注意,我不想将第一个放在左边缘而第二个放在右边缘 - 我必须将第二个按钮放在中心位置.此外,我没有计划使用第三个按钮,以相等的间隔将它们对齐为左,中,右.
在故事板中是否仍然可以在这种情况下添加这种约束?我使用Xcode 6 beta 5.
我的应用程序中的一个屏幕在更新到iOS 8 SDK时完全破坏了.问题似乎是顶部布局指南向上移动而不是其他视图的"锚点".
这就是iOS 7上的视图:

这就是它在iOS 8中的样子(从Xcode 6 View Hierarchy调试器中捕获):

如您所见,视图显示在导航栏上方.顶部布局指南有两个约束,一个用于上部图像视图,另一个用于下面的白色视图.底部布局指南没有约束,只有视图的高度限制.
出于某种原因,iOS 8决定将顶部布局指南推送到{0 -255; 0 0}after,这[self.view layoutIfNeeded]是第一次调用.此外,视图的边界有时对于设备来说太大(即,与统一故事板(600x600)完全一样,而不是320x480/320x568).
iOS 8中发生了哪些变化可能会破坏布局?
[编辑]以下是视图约束的完整列表:
(lldb) po self.view.constraints
<__NSArrayM 0x786ac520>(
<NSLayoutConstraint:0x7c377bd0 V:[_UILayoutGuide:0x7c372f60]-(0)-[UIView:0x7c373120]>,
<NSLayoutConstraint:0x7c377c00 UIView:0x7c373120.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c377c30 UIView:0x7c3730b0.centerX == UIView:0x7c373120.centerX>,
<NSLayoutConstraint:0x7c377c60 H:|-(0)-[UIView:0x7c3716f0] (Names: '|':UIView:0x7c3730b0 )>,
<NSLayoutConstraint:0x7c377c90 UIView:0x7c3716f0.width == UIView:0x7c3730b0.width>,
<NSLayoutConstraint:0x7c372f30 V:[_UILayoutGuide:0x7c372f60]-(129)-[UIView:0x7c3716f0]>
)
Run Code Online (Sandbox Code Playgroud) 有没有办法以constraint编程方式安装和卸载Xcode界面构建器?

objective-c interface-builder ios autolayout nslayoutconstraint
autolayout ×10
ios ×10
ios8 ×3
objective-c ×3
swift ×3
cocoa-touch ×1
constraints ×1
iphone ×1
uiscrollview ×1
uitableview ×1
uitextview ×1
xcode ×1
xcode5 ×1