首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有-layoutSubviews子类的“执行-layoutSubviews后仍然需要自动布局”

带有-layoutSubviews子类的“执行-layoutSubviews后仍然需要自动布局”
EN

Stack Overflow用户
提问于 2012-09-26 21:32:52
回答 30查看 53.9K关注 0票数 115

使用XCode 4.5和iOS 6,我正在开发一个带有自定义单元格的简单表视图的应用程序。在iOS 5和更低版本中,我已经做过一百次了,但是由于某种原因,新的autoLayout系统给我带来了很多麻烦。

我在IB中设置了表视图和原型单元格,添加了子视图,并将它们连接为IBOutlets,然后设置我的委托和dataSource。但是,无论何时从cellForRowAtIndexPath获取第一个单元格,我都会得到以下错误:

* /SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776中的-ShopCell layoutSublayersOfLayer:,断言失败 *终止应用程序的原因是:“在执行-layoutSubviews之后仍然需要自动布局。ShopCell的-layoutSubviews实现需要调用Super.”,原因是“NSInternalInconsistencyException”异常。

我还没有在子类单元格( -layoutSubviews )中实现一个ShopCell方法,即使我尝试这样做并添加超级调用(这意味着我仍然会得到相同的错误)。如果我从IB中的单元格中移除子视图,并将其更改为标准的UITableViewCell,那么一切都按预期的方式工作,当然,我的单元格中没有数据。

我几乎可以肯定,我遗漏了一些简单的东西,但找不到任何文档或指南来说明我做错了什么。任何帮助都将不胜感激。

编辑:只是尝试将其更改为IB中的一个UITableViewCell,并将所有子视图保留在原地,仍然是相同的错误。

EN

回答 30

Stack Overflow用户

发布于 2012-09-27 22:42:33

在手动添加代码中的约束时,我遇到了同样的问题。在代码中,我执行了以下操作:

代码语言:javascript
复制
{
    [self setTranslatesAutoresizingMaskIntoConstraints:YES];
    [self addSubview:someView];
    [self addSubview:someOtherView];
    [self addConstraint:...];
}

假说

据我所知,问题是当您禁用translatesAutoresizingMaskIntoConstraints时,UITableViewCell开始使用自动布局,并自然失败,因为layoutSublayersForLayer的底层实现没有调用超级。有Hopper或其他工具的人可以证实这一点。既然你在使用IB,你可能想知道为什么这是个问题.这是因为使用IB会自动禁用对其添加约束的视图的translatesAutoresizingMaskIntoConstraints (它将自动添加一个宽度和高度约束)。

溶液

我的解决方案是把所有东西都转移到contentView

代码语言:javascript
复制
{
   [self.contentView addSubview:someView];
   [self.contentView addSubview:someOtherView];
   [self.contentView addConstraint:...];
}

我不能100%确定这在Interface中是否有效,但是如果您将所有东西从单元格中推开(假设您有直接在其上的东西),那么它应该可以工作。希望这对你有帮助!

票数 57
EN

Stack Overflow用户

发布于 2012-10-17 18:51:59

显然,UITableViewCell的layoutSubviews实现没有调用super,这是自动布局的一个问题。我想看看是否把下面的类别放到项目中去解决问题。它帮助了一个测试项目。

代码语言:javascript
复制
#import <objc/runtime.h>
#import <objc/message.h>

@implementation UITableViewCell (FixUITableViewCellAutolayoutIHope)

+ (void)load
{
    Method existing = class_getInstanceMethod(self, @selector(layoutSubviews));
    Method new = class_getInstanceMethod(self, @selector(_autolayout_replacementLayoutSubviews));

    method_exchangeImplementations(existing, new);
}

- (void)_autolayout_replacementLayoutSubviews
{
    [super layoutSubviews];
    [self _autolayout_replacementLayoutSubviews]; // not recursive due to method swizzling
    [super layoutSubviews];
}

@end

我可能会添加在表单元格上使用backgroundView时出现的问题,因为它会作为子视图添加到单元格中(而大多数子视图应该添加到表单元格的contentView中,这通常会更好地工作)。

注意:这个bug似乎是在iOS7中修复的;我删除了这段代码,或者至少添加了一个运行时检查,这样只有在iOS6上运行时才能完成。

票数 53
EN

Stack Overflow用户

发布于 2013-02-28 15:45:05

几个月来我都有同样的毛病。但我发现了问题所在。

创建IB文件时,已经添加了一个UIView。如果使用此视图,当禁用自动布局时,应用程序不会崩溃(但还有其他问题)。使用自动布局时,必须在Object:UITableViewCell中选择右视图。

实际上,您应该始终使用,因为所有子视图都被添加到UITableViewCellcontentView中。

就这样。一切都会好的。

票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12610783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档