在wakeFromNib中获取出口尺寸



我创建了一个自定义UICollectionViewCell,其中包含标签的出口(放置在情节提要中)。我想从我的自定义UICollectionViewCellawakeFromNib方法中获得这个标签的高度,但标签的大小总是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方法中

在我的特殊情况下,我发现在我的自定义单元格awakeFromNib方法中添加[self layoutIfNeeded];,就在询问插座大小之前,效果很好。

我不确定这是否是最佳解决方案,但为了像您一样对子视图进行一些更改或获取信息,我在子视图上创建了一个方法,如"prepareSubviews"、"refresh"或"populateWithData"。从IB初始化/加载视图后,我在"viewDidLoad"中调用该方法,此时应该加载xib文件并正常工作。

相关内容

  • 没有找到相关文章

最新更新