天道酬勤,学无止境

以编程方式更改自动布局约束后,视图未更新(View is not updating after changing auto-layout constraints programmatically)

问题

事先我不得不说,我实际上得到了我想要的可见效果,但不是以令人满意的方式,因为现在需要“打破”约束而不是正确更新。

我有一个包含 UITableView 的 ViewController。 该tableView的高度可以从 0(不可见)到它保存的行数。 高度是在 ViewController 的 viewDidLoad() 中通过将当前行数乘以行高来计算的。

我尝试的第一件事是创建一个@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint! 连接到故事板中设置的高度约束。 它只有一些随机的初始高度,但它会在 ViewController 的viewDidLoad()更新为正确的值,然后根据需要更新视图:

tableHeightConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: calculatedTableViewHeight)

// At this point I've tried a variety of methods like the following two but actually none has worked for me
view.layoutIfNeeded()

// or
view.updateConstraints()

// or
view.layoutSubviews()

...甚至 tableView 上的相同方法只是为了确保将所有这些都放在viewDidLayoutSubviews()

所以我接下来尝试的是创建与上面相同的约束,但没有更新我只是将它添加到视图中: view.addConstraint(tableHeightConstraint) 。 这实际上具有所需的视觉效果,但在日志中,我遇到了这两个高度限制的冲突,导致初始限制中断。 因为我的目标是获得正确和干净的代码,所以我一直在尝试。 所以这次我首先从视图中删除了约束,然后再添加了调整后的约束。 在视觉上,再一次,一切都很完美,但我仍然没有摆脱相互冲突的约束。

所以我的实际问题是(除了到目前为止我做错了什么)我如何 - 最好 - 只需更新现有约束,然后在任何时候对视图及其子视图进行适当的更新/重新布局,无论是在我第一次加载时一个视图或者我是否只想在用户交互时更改一些约束。 非常感谢您的帮助!

回答1

目前,您正在分配一个新的约束,而不是更新当前的约束。 新约束也没有添加到视图层次结构中。

您使用 IBOutlet 来引用您在 IB 中设置的约束的方法是一种很好的方法,但不是为该 var 分配新约束,您只需要修改约束的常量:

tableHeightConstraint.constant = calculatedTableHeight

您不需要在此处调用 layoutIfNeeded(),因为当您更改其常量时,约束会自动处理调用布局传递。 updateConstraints()layoutSubviews()绝对不是你想要的。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用自动布局动态更改子视图后调整视图的大小(resize superview after subviews change dynamically using autolayout)
    问题 我不能为上帝的爱而努力,而这是调整规模的监督的重中之重。 我有一个带有4个UILabels的UIView *superview UILabels 。 2个用作其他2个的标头。 所有4个内容都是动态的,都来自数据库。 SizeToFit与SizeThatFits:(CGSize)与UIView systemLayoutSizeFittingSize:传递UILayoutFittingCompressedSize或UILayoutFittingExpandedSize 。 我以编程方式使用自动布局,并将Superview的高度设置为等于或大于虚拟数字。 我在哪里以及如何使用这些SizeToFit vs sizeThatFits:(CGSize) vs UIView systemLayoutSizeFittingSize:并传递UILayoutFittingCompressedSize或UILayoutFittingExpandedSize 。 我在这里已经阅读了很多技巧,但最终却一无所获。 我是否需要重新计算特定位置的Superview约束。 Maby在其控制器类中将其高度设置为“ @property”,然后删除并读取它吗? Atm我已经尝试过将所有内容放到任何地方,然后再放一些。 我仍然得到相同大小的最终结果,虚拟高度和文本漂浮在外面。
  • Xcode 9的安全区域(Safe Area of Xcode 9)
    问题 在探索Xcode9 Beta时,在“界面”构建器的“视图层次结构查看器”中找到了“安全区域”。 好奇并试图了解Apple文档上的“安全区域”,要点是文档说“与Auto布局直接交互的视图区域”,但它令我不满意,我想知道这个新事物的实际用途。 有人有线索吗? Apple文档“安全区域”的结论段落。 UILayoutGuide类旨在执行以前由虚拟视图执行的所有任务,但以更安全,更有效的方式执行。 布局指南未定义新视图。 他们不参与视图层次结构。 取而代之的是,他们只是在自己的视图的坐标系中定义了一个可以与“自动布局”交互的矩形区域。 回答1 安全区域是布局指南(安全区域布局指南) 。 布局指南,表示您的视图中没有被条形图和其他内容遮盖的部分。 在iOS 11+中,Apple不赞成使用顶部和底部布局指南,而将其替换为一个安全区域布局指南。 当视图在屏幕上可见时,本指南将反映视图中未被其他内容覆盖的部分。 视图的安全区域反映了导航栏,选项卡栏,工具栏和其他祖先覆盖的区域,这些区域使视图控制器的视图变得模糊。 (在tvOS,安全区结合在屏幕的边框,通过限定overscanCompensationInsets UIScreen的属性)。它还覆盖由视图控制器的定义的任何额外的空间additionalSafeAreaInsets属性。 如果视图当前未安装在视图层次结构中,或者在屏幕上尚不可见
  • 隐藏视图时如何使用自动布局来移动其他视图?(How to use auto-layout to move other views when a view is hidden?)
    问题 我已经在IB中设计了自定义单元,将其子类化,然后将插座连接到我的自定义类。 我在单元格内容中有三个子视图:UIView(cdView)和两个标签(titleLabel和emailLabel)。 根据每行可用的数据,有时我想在单元格中显示UIView和两个标签,有时只显示两个标签。 我要尝试做的是这样设置约束:如果我将UIView属性设置为hidden,或者将其从超级视图中删除,则两个标签将向左移动。 我试图将UIView领先约束设置为10像素的Superview(单元格内容),并将UILabels领先约束10像素的像素设置为下一个视图(UIView)。 稍后在我的代码中 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(IndexPath *)indexPath { ... Record *record = [self.records objectAtIndex:indexPath.row]; if ([record.imageURL is equalToString:@""]) { cell.cdView.hidden = YES; } 我隐藏了cell.cdView,我希望标签向左移动,但是它们在Cell中的位置相同。 我试图从超级视图中删除cell.cdView
  • 以编程方式设置约束(Setting constraints programmatically)
    问题 我正在尝试使用UIScrollView。 经过很多麻烦之后,我终于明白了。 但是现在我似乎又遇到了障碍。 在这个简单的应用程序中,我有一个滚动视图,为了使其正常运行,我必须将视图的底部空间设置为scrollview约束为0(如此处所述),并且工作正常。 我正在通过IB来做。 现在,我遇到了一种情况,我必须以编程方式执行该操作。 我在viewDidLoad方法中添加了以下代码。 NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; [self.view addConstraint:bottomSpaceConstraint]; 但这似乎不起作用。 它在控制台窗口中输出以下消息,但我不知道该怎么做。 无法同时满足约束条件。 以下列表中的约束中至少有一个是您不想要的约束。 尝试以下操作:(1)查看每个约束,并尝试找出不期望的约束; (2
  • 以编程方式创建视图时,我应该在哪里设置自动布局约束(Where should I be setting autolayout constraints when creating views programmatically)
    问题 我看到了设置约束的不同示例。 有些人在viewDidLoad / loadView设置了它们(添加了子视图之后)。 其他人在方法updateViewConstraints设置它们,该方法由viewDidAppear调用。 当我尝试在updateViewContraints设置约束时, updateViewContraints可能会跳动,例如在视图出现之前稍有延迟。 另外,如果使用此方法,是否应该首先清除现有约束,即[self.view [removeConstraints:self.view.constraints] ? 回答1 I set up my constraints in viewDidLoad/loadView (I'm targeting iOS >= 6). updateViewConstraints is useful for changing values of constraints, e.g. if some constraint is dependent on the orientation of the screen (I know, it's a bad practice) you can change its constant in this method. Adding constraints in viewDidLoad is showed
  • 以编程方式从 XIB 调整自定义 UIView 的大小(Programmatically resize custom UIView from XIB)
    问题 我有以下问题:我在XIB文件中创建了一个自定义UIView类及其布局。 假设我在 XIB 中的自定义视图的大小是 150 x 50。我启用了sizeClasses (wAny hAny) 和AutoLayout 。 在模拟指标中,我设置了Size = Freeform , Status Bar = None ,所有other = Inferred 。 我的自定义UIView类中的代码如下所示: #import "CustomView.h" @implementation CustomView #pragma mark - Object lifecycle - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self setup]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { [self setup]; } return self; } #pragma mark - Private & helper methods - (void)setup { if (self.subviews
  • 检测到约束不明确地提示高度为零的情况(Detected a case where constraints ambiguously suggest a height of zero)
    问题 当我运行包含表格视图单元的应用程序时,更新到Xcode 6.1 beta 2之后,调试助手会说: Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead. 以前,当我在该项目上使用Xcode 5时,会遇到一些错误,但是自升级以来,这些错误已经消失了。 我现在没有其他错误或警告。 我已经尝试过调整所有tableview单元格的大小,也尝试过使用标准高度,但是我仍然收到相同的警告: Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead. 我还阅读了所有与此类似的主题
  • iOS - 更改子类 UIView 的子视图的框架(使用启用自动布局的故事板)(iOS - Changing frame of a subview of a subclassed UIView (using storyboard with auto layout enabled))
    问题 我正在构建一个自定义进度条(UIView 的子类)。 我向 UIView 添加了一个 UIImageView,它使用重复的图像来显示进度。 视图被添加到情节提要中,我可以让它显示得很好,但是如果我尝试更改框架,那么它只会显示情节提要文件中显示的内容(即,如果情节提要视图具有黄色背景,但代码的 uiview 子类将其更改为绿色,如果我尝试更改代码中 UIImageView 的框架以反映当前进度,则默认为黄色背景) 我尝试使用这些但没有运气: [self updateConstraints]; [self layoutSubviews]; 更新 我知道我需要设置一个用于自动布局的约束。 但是,当我以这种方式创建子类 UIView 时,它需要以编程方式完成。 这是我正在尝试的代码,我知道我很接近但无法让它正常工作: [self addConstraint: [NSLayoutConstraint constraintWithItem:self.progressView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:1 constant:progressWidth]];
  • 调整UITableView标头的大小并包含UITextView(iOS7 + AutoLayout)(Resize UITableView Header AND containing UITextView (iOS7 + AutoLayout))
    问题 我已经为此努力了一段时间,并且我想确保自己以正确的方式进行操作。 作为参考,我将自动布局与情节提要结合使用,它是仅iOS7的应用程序。 我有一个带标题视图的UITableView,并且HeaderView的UI挂在情节提要中。 我将标题保留在情节提要中,其中包含一些元素,其中之一是不可滚动的UITextView。 这是它在情节提要中的基本屏幕截图: 我将标头视图的背景变暗为深灰色,从而显得突出。 UITextView的文本可以是动态的,因此其高度需要根据文本的大小进行更改。 但是棘手的是,表的标题视图也需要根据文本的大小来调整其高度。 我尝试了一些带有约束的不同操作,但是它并没有真正正常工作(除非我禁用AutoLayout并以编程方式调整大小,这是我真正希望避免的)。 当然,我希望它尽可能简洁,并且只需编写很少的代码。 尽管它可以满足我的需求,但我并不希望使用table-view标头,因为我希望它及其包含的textview能够与下面的实际详细信息一起滚动。 话虽这么说,如果有一种更简单的方法来实现此目的(即使用uilabel),我将很乐意更改底层结构。 关于方法有什么想法吗? 不想找人通过答案牵我的手; 如果可能的话,主要只是寻找一些好的起点。 提前致谢! 回答1 不久前,我发现了一个新的解决方案,也许它需要对动画进行调整并且是实验性的,但是在某些情况下还可以,请尝试一下:
  • 第一次调用时未显示动画(Animation not Shown When Calling it First Time)
    问题 我有一个简单的动画: - (void)showMenu { [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5]; [UIView setAnimationDelay:0.0]; [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; self.scrollView.frame = CGRectMake(296, -150, 432, 356); [self.buttonMenu setImage:[UIImage imageNamed:@"menu_arrow_up.png"] forState:UIControlStateNormal]; [self.view bringSubviewToFront:self.scrollView]; [UIView commitAnimations]; } 当我第一次调用这个动画时,只是我的按钮的图像发生了变化,我的滚动视图的位置没有改变。 在我两次调用showMenu方法之后,一切正常。 我打电话给showMenu 。 按钮的图像发生变化。 scrollview位置不是我调用另一种方法来重置一切。 按钮更改的图像。 scrollview位置不是我打电话给showMenu 。
  • 如何为约束更改设置动画?(How do I animate constraint changes?)
    问题 我正在使用AdBannerView更新一个旧应用,当没有广告时,它会滑出屏幕。 出现广告时,它会在屏幕上滑动。 基本的东西。 旧样式,我将帧设置在动画块中。 新样式,我对自动布局约束有一个IBOutlet ,它确定Y位置,在这种情况下,它是距父视图底部的距离,并修改常量: - (void)moveBannerOffScreen { [UIView animateWithDuration:5 animations:^{ _addBannerDistanceFromBottomConstraint.constant = -32; }]; bannerIsVisible = FALSE; } - (void)moveBannerOnScreen { [UIView animateWithDuration:5 animations:^{ _addBannerDistanceFromBottomConstraint.constant = 0; }]; bannerIsVisible = TRUE; } 横幅完全按预期移动,但没有动画。 更新:我重新观看了WWDC 12讲的“掌握自动布局的最佳实践”,其中涵盖了动画。 它讨论了如何使用CoreAnimation更新约束: 我尝试使用以下代码,但得到的结果完全相同: - (void)moveBannerOffScreen {
  • 使用自动布局时如何使 UIScrollView 只向一个方向缩放(How to make UIScrollView zoom in only one direction when using auto layout)
    问题 我试图让 UIScrollView 只允许在水平方向上缩放。 滚动视图是使用纯自动布局方法设置的。 通常的方法是在许多 Stack Overflow 答案(例如这个)和其他资源中所建议的。 在自动布局存在之前,我已经在应用程序中成功使用了它。 方法如下:在滚动视图的内容视图中,我覆盖了setTransform() ,并将传入的变换修改为仅在 x 方向上缩放: override var transform: CGAffineTransform { get { return super.transform } set { var t = newValue t.d = 1.0 super.transform = t } } 我还重置了滚动视图的内容偏移量,以便它在缩放过程中不会垂直滚动: func scrollViewDidZoom(scrollView: UIScrollView) { scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: scrollView.frame.height) scrollView.contentOffset = CGPoint(x: scrollView.contentOffset.x, y: 0.0) } 这在不使用自动布局时非常有效: 但是
  • 有没有一种方法可以在Interface Builder中向自动布局约束添加标识符?(Is there a way to add an identifier to Auto Layout Constraints in Interface Builder?)
    问题 在Interface Builder中进行一些可视化布局之后,我创建了一些要在运行时访问的约束。 有没有一种方法可以在Interface Builder中标记或标识约束,以便以后可以查找它们? 我要这样做的原因是我需要根据视觉上指定的约束执行一些计算。 我知道Apple提供了Visual Format Language,我可以在控制器中以编程方式指定约束。 我宁愿不使用这种方法,以免失去IB的设计时间反馈。 编辑 建立参考出口确实可以,但是问题仍然存在。 回答1 更新: 正如他的回答解释由巴特洛梅耶Semańczyk,现在有一个标识符字段可见在为属性检查器NSLayoutConstraint从而不必自己暴露这一领域。 只需在“文档大纲”视图或“情节提要”视图中选择约束,然后在右侧的“属性”检查器中添加一个标识符。 较早的答案: 是的,这可以做到。 NSLayoutConstraint具有一个称为identifier的属性,该属性可以在Interface Builder中公开并分配。 为了演示这一点,我创建了一个具有单个子视图的单视图应用程序,该子视图是一个红色框。 该子视图具有4个约束:宽度,高度,在容器中水平居中,在容器中垂直居中。 我通过执行以下操作为宽度约束指定了标识符redBoxWidth : 在“文档布局”视图中单击宽度约束。 然后在Identity
  • 隐藏了UIViews的自动布局?(AutoLayout with hidden UIViews?)
    问题 我觉得这是显示/隐藏UIViews (最常见的是UILabels的相当常见的范例,具体取决于业务逻辑。 我的问题是,使用AutoLayout响应隐藏视图的最佳方法是什么,就像它们的框架是0x0一样。 这是1-3个功能的动态列表的示例。 现在,从按钮到最后一个标签,我有10px的顶部空间,当标签被隐藏时,它显然不会向上滑动。 到目前为止,我已经创建了此约束的出口,并根据要显示的标签数修改常数。 由于我使用负常量值将按钮向上推到隐藏帧上,因此这显然有点不客气。 这也很糟糕,因为它不限于实际的布局元素,仅基于已知高度/其他元素的填充进行隐蔽的静态计算,并且显然与AutoLayout的用途有所抵触。 很明显,我可以根据我的动态标签创建新的约束,但这要尝试折叠一些空白,这需要大量的微观管理和冗长的工作。 有更好的方法吗? 更改帧大小0,0并让AutoLayout无需约束即可操作吗? 完全删除视图? 坦白说,仅从隐藏视图的上下文中修改常量就需要一行代码,并且计算简单。 用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:重新创建新约束似乎很constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant
  • 通过自动布局以编程方式更改框架(Change frame programmatically with auto layout)
    问题 我有一个带有自动布局的UITableView ,当GADBannerView出现在屏幕底部时,我需要降低高度。 不幸的是,使用自动版式无法修改框架。 解决方案是删除“自动版面”并手动设置框架。 这是非常危险的,因为我的所有应用程序都可以在3.5'和4.0'显示器上正常工作,并且删除“自动布局”会增加新的测试阶段和更多工作。 即使启用了“自动布局”,是否可以更改框架? 回答1 让您的UITableView约束将底部布局设置为0,创建一个IBOutlet 。 现在让您的GADBannerView高度为40,因此更改您的outlet.constant = 40; 有关如何制作IBOutlet并更改其值的更多信息,请查看此IBOutlet ,或者希望对您有所帮助。 编辑:对于那些寻求帮助的人,请按照以下简单的步骤进行(因为这是公认的答案,所以我认为值得举一个例子。这个例子归功于@manujmv) 在界面中为视图创建高度约束。 然后在您的类中为此约束添加一个IBOutlet对象。 例如: @属性(弱,非原子)IBOutlet NSLayoutConstraint * heightConstraint; 在连接面板中连接该对象。 然后在需要时更改此约束的值 self.heightConstraint.constant = 40; 回答2 与其尝试更改视图的框架
  • 更新到Xcode 8后的布局问题(Layout issues after updating to Xcode 8)
    问题 这是我升级到Xcode 8后屏幕之一的前后。 我所做的就是打开main.storyboard ,然后在手机上构建并运行我的应用程序。 在我的版本控制中,我可以看到Xcode仅在打开它后对main.storyboard进行了很多更改。 每当我删除这些更改时,都可以在Xcode 7.3.1中看到使用的内容。 但是,当我用情节提要重新打开界面生成器时,我看到这些更改又恢复了原样。 有什么我可以做的吗? 在Xcode 8之前 更新到Xcode 8之后 回答1 将故事板文件转换为与Xcode8兼容后,我也遇到了类似的问题,即没有出现tableview图像。 这看起来像是Xcode8的错误,因此在发布错误修复之前,这里的解决方法是: 在Xcode 8中打开情节提要,然后选择一个初始设备视图。 像往常一样进行更改。 完成更改后,选择情节提要-> File Inspector-> Opens in->选择'Xcode 7.x'。 出现提示时选择“保存并关闭” 您的情节提要更改将被保存,并且您的情节提要将像Xcode8之前一样运行。 当您需要对情节提要文件进行其他更改时,请再次执行以下步骤。 回答2 XIB或情节提要集默认设置为较早版本7.x,然后单击“保存并关闭”。 临时解决方案,但可行。 完成“保存并关闭”后,请勿再次打开。 否则,再次需要从头开始执行相同的步骤。 回答3 嗯,同样的问题。
  • 自动布局:是什么创建名为UIView-Encapsulated-Layout-Width&Height的约束?(Auto-layout: What creates constraints named UIView-Encapsulated-Layout-Width & Height?)
    问题 我的布局约束在Interface Builder中很好,但是由于框架的某些部分应用了我确实不希望的固定高度和宽度约束,因此在运行时发生了异常。 他们为什么在那里,以及如何将它们关闭? 它们是已记录列表中显示的最后两个约束: 2014-04-26 09:02:58.687 BBCNews[32058:60b] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property
  • 我可以在运行时为特定的子视图禁用自动布局吗?(Can I disable autolayout for a specific subview at runtime?)
    问题 我有一个视图,需要以编程方式对其框架进行操作-这是一种文档视图,将其包装到其内容,然后通过操纵框架原点在超级视图周围滚动和缩放。 Autolayout在运行时与此作斗争。 完全禁用自动布局似乎有些困难,因为可以合理地使用它来处理其他视图的布局。 似乎我可能想要某种“空约束”。 回答1 我有同样的问题。 但是我已经解决了。 是的,您可以在运行时为特定的UIView禁用自动布局,而不是对整个Xib或Storyboard(在Xcode 4.3及更高版本中默认设置)禁用自动布局。 在设置子视图的框架之前,将translatesAutoresizingMaskIntoConstraints设置为YES : self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; self.exampleView.frame = CGRectMake(20, 20, 50, 50); 回答2 我有一个类似的问题,即Autolayout在运行时会覆盖我的某些帧设置(我有一个动态视图,在某些情况下,该视图推了一个新的视图控制器...按入,然后按Back将重置初始视图)。 我通过将操作代码放在View Controller的viewDidLayoutSubviews来解决此问题。
  • UITableViewCell子类“执行-layoutSubviews之后仍需要自动布局”(“Auto Layout still required after executing -layoutSubviews” with UITableViewCell subclass)
    问题 使用XCode 4.5和iOS 6,我正在开发带有带有自定义单元格的简单表格视图的应用程序。 我已经在iOS 5及更低版本中完成了一百次,但是由于某种原因,新的autoLayout系统给我带来了很多麻烦。 我在IB中设置了表格视图和原型单元,添加了子视图,并将它们连接为IBOutlets,然后设置了我的委托和数据源。 但是,现在每当从cellForRowAtIndexPath获取第一个单元格时,都会出现以下错误: ***-[ShopCell layoutSublayersOfLayer:],/ SourceCache / UIKit_Sim / UIKit-2372 / UIView.m:5776中的断言失败 ***由于未捕获的异常“ NSInternalInconsistencyException”而终止应用程序,原因:“在执行-layoutSubviews之后仍需要自动布局。 ShopCell的-layoutSubviews实现需要调用超级。” 我尚未在我的子类化单元(ShopCell)中实现-layoutSubviews方法,即使我尝试这样做并添加超级调用也是如此,因为这表明我仍然遇到相同的错误。 如果我从IB的单元格中删除子视图,并将其更改为标准的UITableViewCell,则一切都会按预期进行,尽管我的单元格中当然没有数据。 我几乎可以肯定,我缺少一些简单的东西
  • UIScrollView contentSize不起作用(UIScrollView contentSize not working)
    问题 我将UIScrollView放在笔尖的view ,并将其链接到IBOutlet属性。 现在,当我在viewDidLoad方法中执行此操作时,似乎对contentSize无效: self.sv.backgroundColor = [UIColor yellowColor]; // this works CGSize size = CGSizeMake(1000.0, 1000.0); [self.sv setContentSize:size]; // this does not 它的行为就像contentSize与框架相同。 这是怎么回事? 当我关闭自动版式时,此功能开始起作用。 为什么? 回答1 我有同样的问题。 UIScrollView自动版式混乱。 解决方法:将UIScrollView所有内容放入另一个UIView ,并将该UIView作为UIScrollView的唯一子级。 然后,您可以使用“自动布局”。 如果末尾的东西弄乱了(无论UIScrollView滚动到哪个方向的末尾),请在末尾更改约束以使其具有最低的优先级。 回答2 我尝试用viewWillLayoutSubviews更新scrollView的contentSize,它对我有用。 - (void)viewDidLayoutSubviews { [self.bgScrollView setContentSize