我想知道哪种是更好的方法来计算和获得动态绘制的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:
,它在用该参数绘制后返回文本的最终大小。
我怎样才能实现这样的目标?我不喜欢目前的解决方案,我认为这是错误的。
谢谢。
答案 0 :(得分:1)
您通常不应计算drawRect:
中的尺寸。您应该拥有所需的所有数据,以便更新数据。并且在类方法中计算它似乎有点奇怪(尽管如果你需要从不同的地方调用它可能会很好,但这仍然不常见)。
执行此操作的常规方法是覆盖每个子视图的sizeThatFits:
。在那里,根据视图的当前配置计算最佳大小。然后使用sizeToFit
告诉视图采用其最佳大小。您的超级视图可以使用覆盖sizeThatFits:
来合并其子视图的结果,您可以使用sizeThatFits:
中的layoutSubviews
来计算整体布局。