这个分配有什么问题?

时间:2013-06-03 03:15:52

标签: ios uiview

我在我的项目中使用GMGridView。在- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index方法中,我写了一个超出我期望的片段。摘录如下:

if (!cell)
    {
        cell = [[GMGridViewCell alloc] init];

        ThumbImageView *view = [[ThumbImageView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
        [view setBackgroundColor:DEFAULT_BACKGROUND_COLOR];
        [view setImage:[UIImage imageWithContentsOfFile:path]];
        view.userInteractionEnabled = YES;
        view.layer.shadowOffset = CGSizeMake(8, 8);
        view.layer.shadowOpacity = 0.5;
        NSLog(@"view frame width:%f,height:%f",view.frame.size.width,view.frame.size.height);
        cell.contentView = view;
        NSLog(@"cell.contentView frame width:%f,height:%f",cell.contentView.frame.size.width,cell.contentView.frame.size.height);
    } 

运行时输出如下:

2013-06-03 11:02:05.508 XXX[71692:707] view frame width:115.000000,height:180.000000
2013-06-03 11:02:05.511 XXX[71692:707] cell.contentView frame width:0.000000,height:0.000000

为什么将视图分配给cell.contentView,cell.contentView.frame.size仍为零?而且cell.contentView可以正确显示图像。什么原因?我完全糊涂了:(。

2 个答案:

答案 0 :(得分:2)

检查the docs

  

<强>内容查看

     

返回单元格对象的内容视图。 (只读)

     

@property(nonatomic, readonly, retain) UIView *contentView

contentView是一个只读属性。你无法分配它。

答案 1 :(得分:0)

问题可能是您已经创建了新视图,并且在运行循环达到其布局阶段之前,您正在查看其中一个视图的框架。

创建GMGridViewCell时,它会以frame的默认boundsCGRectZero开头。设置内容视图时,会将内容视图的frame设置为其(单元格)bounds。因此,即使您使用initWithFrame:直接设置内容视图的框架,当您将视图设置为单元格的内容视图时,框架也会更改为CGRectZero

由于单元格不是网格视图的子视图,因此在您尝试记录内容视图的框架时,无法要求网格视图布置单元格。如果网格视图对所有单元格使用恒定大小,并且您知道该大小是什么,则可以在设置单元格的内容视图之前手动将单元格设置为该大小。否则,您需要等到网格视图的layoutSubviews方法运行后才检查内容视图的框架。