重写layoutsubviewss何时调用的问题

时间: 来源:
【iOS开发-67】QQ好友列表案例:UITableViewHeaderFooterView类、layoutSubviews与didMoveToSuperView方法等【编程语言】
点击次数:2933
其它web前端开发资讯使用Xcode 4.5和iOS 6,我正在开发一个应用程序与自定义单元格的简单表视图。我已经在iOS5中这样做了一百下,但对于原因的autoLayout新系统是一个很大的trouble。
设置我的表视图,并在IB原型cell,添加子视图和有线他们作为IBOutlets然后设置我的委托和数据源。然而现在每当优先个单元格是从的cellForRowAtIndexPath牵强,我得到以下错误:
在***assertions失败-[ShopCell layoutSublayersOfLayer:] / SourceCache/UIKit_Sim/UIKit-2372/UIView.m:5776
***终止应用程序因未捕获的异常'NSInternalInconsistencyException',原因是:“自动布局执行 CodeGo.net,layoutSubviews后仍然需要。 ShopCell年代,layoutSubviews需要调用super“。
我没有一个-在我子类cell(ShopCell),甚至当我尝试这样做,并添加超级调用,因为它表明我仍然得到错误。如果我从IBcell中移除子视图,并将其更改为一个标准的UITableViewCell,一切都如预期,当然,虽然我离开了,在我的cell没有数据。
我几乎可以肯定的是,有简单的我失踪,但无法找到任何或导游建议我做了什么错。任何帮助,将不胜感激。
编辑:刚才试图将其更改为一个UITableViewCell在IB和使所有的子视图到位,仍然是错误。
本文地址 :CodeGo.net/508067/
-------------------------------------------------------------------------------------------------------------------------
1. 我遇到的问题,而在代码中手动添加constraints。在代码中,我在做以下操作:
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
[self addSubview:someView];
[self addSubview:someOtherView];
[self addConstraint:...];
从我可以告诉,问题是,当你禁用translatesAutoresizingMaskIntoConstraints,的UITableViewCell启动自动布局和自然失效的根本layoutSublayersForLayer不调用super。与料斗或其它工具可以证实这一点。既然你IB你可能想知道,为什么这是一个问题......这就是IB自动禁用translatesAutoresizingMaskIntoConstraints对views CodeGo.net,认为它增加了constraints(它会自动添加在自己的位置,宽度和高度的限制)。
我的解决办法是一切移动到contentView。
[self.contentView addSubview:someView];
[self.contentView addSubview:someOtherView];
[self.contentView addConstraint:...];
我不是100%肯定这是否会在Interface Builder,但如果你把一切都关掉你的手机(假设你有直接就可以了),那么它应该工作。希望这可以帮助你!
显然,定义UITableViewCell的layoutSubviews不调用super,这与自动布局的问题。我很想看看,如果去掉了下面的类到项目中修复的东西。它有助于在一个测试项目。
#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];
我要补充问题出现了在表格单元格中backgroundView,作为被添加作为一个子视图到cell(而多数子视图应该被添加到表格单元格的内容查看,这工作得更好)。
注意:出现此错误是固定在IOS7,我能够删除这些代码,或者至少添加一个检查,以便它只能做,如果在iOS6的运行。
我有错误的几个月。但我发现什么问题。
当我创建一个IB文件,UIView已添加。如果这种观点,当自动布局被禁用的应用程序不会崩溃(但也有其他的问题)。当自动布局,你必须在对象库中选择合适的视图:UITableViewCell。
事实上,你应该总是使用这个项目的所有子视图添加到contentView的UITableViewCell。
这就是全部.a切都会好起来的。
我有这个问题。问题是在我创建的单元格XIB的方式。我创建了一个XIB正常人一样,只是更改了默认“的UIView”的类型,我自定义的UITableViewCell类。正确的方法是,先删除默认的视图,然后在表视图单元格对象拖动到xib。更多细节在这里:
我通过关闭“自动布局”为我的自定义表视图单元中的所有子视图解决了问题。
在xib的自定义单元格,选择一个子视图并取消文件检查器&界面生成器&使用自动布局
我看到这是在我的layoutSubviews的修改constraints的结果。移动从一开始就调用super的解决了这一问题的结束。
我遇到了这一点,似乎它是关系到的UITableViewCell子类为原型的cell,特别是已经添加到他们的其他自定义的UIView的子类。我特别underline“自定义”在这里我已经跟刚刚已经UIKit的儿童的cell,但它跌倒在试图建立对我已经创建定制视图的constraints时,扔在作者问题所述的错误。
我有我的cell分离成独立的碎粒,唐“自动版式。
让我们希望苹果清理
我一直在经历着的事情。原来,如果你编程方式从您的ShopCell .xib /分镜,自动布局,作为一个子视图到另一个视图中添加子视图,这可能会引发异常,这取决于你的constraints是如何配置的。我的猜测是,在IB创建的constraints是什么造成的烦恼,当以编程方式添加一个视图作为子视图,因为它是那么维修器材的限制从viewA-&您可以添加viewB作为viewC的子视图。你猜对了(这句话是连我自己)?
在我的情况-因为这是非常简单的看法,这个问题-我创建的views,编程,而不是在IB。这解决了这个问题。你可能会提取这些views给其他XIB文件和禁用自动布局的。我想这会工作。
我有这个问题。我有一个按钮,在我的UITableViewCell我已经联系到accessoryView出口在IB想这是可行的。它没有,所以我打破了链接,现在我没有得到的错误(不得不在代码中的按钮)。
我遇到这个我最初加入一个UIView,而不是一个UITableViewCell到xib文件。
我通过解偶联消除这个错误的backgroundView从我的后台连接器UIImageView和accessoryView从我的连接器UIButton的定制。我怀疑,这些是我的方式他们。
我有这个问题,当内部视图链接到超类网点。例如我MyTableViewCell到的UITableViewCell的backgroundView IBOutlet属性。从超类的sockets财产解除连结有解决这个问题。
我今天遇到了这个问题优先次。到现在为止我有经验原型的UITableViewCell子类,但从来没有遇到这个问题。什么是对我工作的小区不同的是,我有一个IBOutlet的,backgroundView我的颜色的单元格。我发现,如果我创建了一个新的属性,仍然增加了一个新的UIView的拉长了整个小区的span,这种说法就走开了。为了验证这一点是我回到附带这种观点的backgroundView出口和主张又出现了。到目前为止,还没有其他的自动版式在子类原型的UITableViewCell,因为我做了这个改变。
添加的子视图的单元格的内容查看,而不是cell本身。
而不是这样:[self addSubview:someView];您[self.contentView addSubview:someView];
解释自动版式是如何工作的。你有xib文件或脚本,你有一组与constraints的观点,自动布局自动为您根据这些constraints勾画出了场,这时候屏幕正准备显示您的用户界面完成,
- (void)viewDidLayoutSubviews {}
被称为当布局完成。现在,由被调用时,布局已经确定,并在地方,如果你添加一个子视图的ios不知道该怎么办这个观点就已经奠定了显示器。你可以看到如何在脚本或xib文件被transform的constraints处理这个。
您可以致电[查看layoutSubviews];告诉IOS重新做你的布局与什么是添加,和iOS会很乐意为你做的。你必须要添加内容,喜欢在视图上调用layoutSubviews
[tableCell addSubview:cellContent];
[tableCell layoutSubviews];
(无效)viewDidLayoutSubviews {}不是从具有在该视图中的一个UIView类或子类,它只是从在一个名为的UIViewController自动调用。 (无效)viewDidLayoutSubviews {}称为有史以来当UI变化,如点击和拖动或旋转的事件,但是当你调用它不叫
(无效)viewWillAppear
(无效)viewDidAppear
(无效)viewDidAutolayout
在任何视图控制器被调用的顺序,然后viewDidAutolayout会为您发送事件称为多。如果你想子视图添加到主视图你,那么你必须这样做
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// not here by now it's too late
其他明智的,你将不得不调用layoutSubviews的看法,他这样说使一个类的UIView +AddSubview.h并重写调用[超级addSubview:查看]→[自layoutSubview];把导入此类别中您又名在你的支持文件的。PCH文件头的文件夹,你将永远不必担心这个问题再次进行任何前缀的用户界面。
本文标题 :用的UITableViewCell子类“执行-layoutSubviews后自动布局仍需”
本文地址 :CodeGo.net/508067/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&m今天看啥 热点:
viewDidLayoutSubviews,viewdidload
由于种种原因,最近才开始真正在新项目中使用autolayout,使用过程中虽说是比较顺畅,但是也遇到了一些麻烦,比如:
我使用的XIB默认是4寸屏幕,我再XIB中增加一个viewA,宽度为320,约束为SuperView等宽。
然后我用4寸模拟器,代码跑起来,在ViewDidload中取出viewA的宽度,发现宽度为320,SuperView(self.view)的宽度也为320.
这个结果没有错误。
但是我用5.5寸的模拟器,代码跑起来,在ViewDidLoad取出viewA的宽度发现还是320,SuperView(self.view)的宽度也为320.
此时就不对了
这会导致在ViewDidLoad中初始化一些控件时,导致这些控件的frame的大小是在XIB默认的大小,而不是我们增加约束后希望的大小。
笔者这个问题纠结了很久也百度Google了很久,也不知道是关键字没有正确还是什么原因,寻求无果,最后还是请教一个大神才豁然开朗。
原来在iOS5.0开始就有另外一个生命周期函数ViewDidLayoutSubViews这个方法基本可以代替ViewDidload使用,只不过差别在于前者是约束后,后者是约束前。
当让聪明的读者肯定会想到有Did肯定也会有Will,即ViewWillLayoutSubViews.
希望本片文章可以帮到大家!
暂无相关文章
相关搜索:
相关阅读:
相关频道:
Android教程最近更新iOS:layoutSubviews的使用浅谈 - 推酷
iOS:layoutSubviews的使用浅谈
layoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机:
1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
在这些触发情况下,我们就可以妙用他,比如说改变数据等等,这是个很不错的方法
而且我们也可以手动调用,即& & & & &&
[self setNeedsLayout];
注意:调用layoutSubviews,也需要调用它的父类方法,即& & & & & &
[super layoutSubviews]
传说如果不调用的话会出现奇怪的问题。
已发表评论数()
&&登&&&录&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见主题 : UITableviewCell不停调用layoutSubviews方法的原因
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 4(时)
发自: Web Page
来源于&&分类
UITableviewCell不停调用layoutSubviews方法的原因&&&
向大侠们求助:一个简单的应用,在TableView中显示从网络获取的电影信息。每个Cell为自定义,在其中的layoutSubviews方法多线程获取海报,并用setNeedsLayout显示海报。问题是应用执行时会不停的调用layoutSubviews方法直到系统奔溃,我知道当Cell发生改变时会调用layoutSubviews,但是这样不停的调用是为什么呢?求解下面是Cell中的代码:-(void)layoutSubviews{    //self.posterImageView.image=[UIImage imageNamed:@&poster.png&];//海报未知的默认图片,这里必须注释掉,否则后面真正的海报无法显示,这个也很困惑,为什么呢?    self.nameLabel.text=self.movie.//电影名称    self.directorLabel.text=self.movie.    self.plotLabel.text=self.movie.plot_    NSLog(@&Cell图片:%@&,self.movie.poster);//该输出会不停的打印知道系统奔溃    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{        NSData *imageData=[NSData dataWithContentsOfURL:[NSURL URLWithString:self.movie.poster]];//多线程获取图片        dispatch_async(dispatch_get_main_queue(), ^{            UIImage *posterImage=[UIImage imageWithData:imageData];            self.posterImageView.image=posterI            [self setNeedsLayout];//这个就是罪魁祸首,只要加上这句方法就会不停调用,但是不加的话无法显示海报图片        });    });}谢谢
级别: 侠客
UID: 238814
可可豆: 398 CB
威望: 334 点
在线时间: 115(时)
发自: Web Page
感觉像是死循环了,无限调用layoutSubviews方法,你在layoutSubviews里去[self setNeedsLayout];,那么在这个方法执行的时候又去调用layoutSubviews方法,然后又去走[self setNeedsLayout];反反复复,无穷无尽····
二次元的神啊带我走吧~
级别: 新手上路
可可豆: 14 CB
威望: 14 点
在线时间: 4(时)
发自: Web Page
回 1楼(walker_l) 的帖子
哦,对,应该是这样那我在Cell里做一个判断,如果有图片就不请求图片,这样如果就不用调用setNeedsLayout方法了,但是Cell在复用时会不会不加载新的图片……还有没有判断还有没有别的方法呢?
关注本帖(如果有新回复会站内信通知您)
3*3+1 正确答案:10
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版}

我要回帖

更多关于 layoutsubviews是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信