获得UIView最终尺寸的更好方法是哪种?

时间:2013-04-30 14:09:11

标签: ios uiview drawing

我想知道哪种是更好的方法来计算和获得动态绘制的UIView的最终大小。例如,我有一个超级视图,将会绘制一堆视图。我需要这些视图的尺寸来正确布局它们,但它的最终尺寸是动态的,考虑到它们将显示的数据。

这样,我必须发布一个类方法来计算并根据要显示的数据返回视图的大小,以创建具有适当帧的视图。之后,在superview中我正确地布局视图,并且在子视图的drawRect中几乎复制了该类方法代码,因为我需要这些计算才能正确绘制。

示例:

+ (CGSize)sizeForTopText:(NSString *)topText 
                leftText:(NSString *)leftText 
             showingIcon:(BOOL)showIcon {

    // Here I compute all this data taking into account font sizes, 
    // icon image size, etc, code that will be almost cloned in drawRect:
}

// In the superview

CGSize myViewSize = [MyView sizeForTopText:@"topText" leftText:@"leftText" showingIcon:NO];
MyView *theView = [[MyView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, myViewSize.width, myViewSize.height)];

我看到一些Cocoa方法在绘制后返回最终大小,例如NSString的drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:,它在用该参数绘制后返回文本的最终大小。

我怎样才能实现这样的目标?我不喜欢目前的解决方案,我认为这是错误的。

谢谢。

1 个答案:

答案 0 :(得分:1)

您通常不应计算drawRect:中的尺寸。您应该拥有所需的所有数据,以便更新数据。并且在类方法中计算它似乎有点奇怪(尽管如果你需要从不同的地方调用它可能会很好,但这仍然不常见)。

执行此操作的常规方法是覆盖每个子视图的sizeThatFits:。在那里,根据视图的当前配置计算最佳大小。然后使用sizeToFit告诉视图采用其最佳大小。您的超级视图可以使用覆盖sizeThatFits:来合并其子视图的结果,您可以使用sizeThatFits:中的layoutSubviews来计算整体布局。