在awakeFromNib中获取sockets大小
我创build了一个自定义的UICollectionViewCell
其中包含一个标签UICollectionViewCell
(放置在Storyboard中)。 我想从我的自定义UICollectionViewCell
的awakeFromNib
方法中获得此标签的高度,但标签的大小始终为0.000000
:
// .h @interface MyCustomCell : UICollectionViewCell @property (weak, nonatomic) IBOutlet UILabel *myLabel; @end // .m @implementation MyCustomCell -(void)awakeFromNib { [super awakeFromNib]; NSLog(@"%@", self.myLabel); NSLog(@"%f", self.myLabel.frame.size.width); NSLog(@"%f", self.myLabel.frame.size.height); } @end
控制台输出:
2013-02-06 11:13:59.628 Test[8880:c07] <UILabel: 0x7649a00; frame = (0 0; 0 0); text = '12h00'; clipsToBounds = YES; opaque = NO; autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7649ac0>> 2013-02-06 11:13:59.628 Test[8880:c07] 0.000000 2013-02-06 11:13:59.630 Test[8880:c07] 0.000000
我怎样才能得到我的标签的大小? awakeFromNib
被调用的时候,得到这样的信息还为时过早吗? 如果是的话,我的自定义单元格的哪种方法应该得到大小?
编辑
以下是在ViewController中观察到的奇怪行为:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { MyCustomCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCustomCell" forIndexPath:indexPath]; NSLog(@"%@", cell); NSLog(@"%@", cell.myLabel); }
而输出:
2013-02-07 16:07:34.488 Test[30308:c07] <MyCustomCell: 0x7156980; baseClass = UICollectionViewCell; frame = (20 0; 290 655); clipsToBounds = YES; opaque = NO; layer = <CALayer: 0x7156a80>> 2013-02-07 16:07:34.489 Test[30308:c07] <UILabel: 0x7158100; frame = (0 0; 0 0); text = 'this is a text'; clipsToBounds = YES; opaque = NO; autoresize = TM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7158040>>
答案的一部分是在Dreamzor对iOS AutoLayout的响应- 获取帧大小的宽度 。
诀窍是把你的框架相关的代码放到viewDidLayoutSubviews方法中
在我的具体情况下,我发现添加[self layoutIfNeeded];
在我的自定义单元awakeFromNib
方法,就在要求出口大小像魅力工作之前。
我不确定这是否是最佳的解决scheme,但是要对子视图进行一些更改或获取像您一样的信息,我在subview上创build了一个像“prepareSubviews”或“refresh”或“populateWithData”的方法。 从IB初始化/加载视图后,我调用“viewDidLoad”内的方法,在这一点上,应该加载和正常工作的XIB文件。