0

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

这样,我必须发布一个类方法来计算并根据要显示的数据返回视图的大小,以创建具有适当框架的视图。之后,在超级视图中我正确地布局了视图,而在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's drawAtPoint:forWidth:withFont:fontSize:lineBreakMode:baselineAdjustment:,它在使用该参数绘制文本后返回文本的最终大小。

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

谢谢你。

4

1 回答 1

1

您通常不应该计算drawRect:. 您应该拥有您需要的所有数据,即数据已更新。在类方法中计算它似乎有点奇怪(虽然如果你需要从不同的地方调用它可能没问题,但这仍然不常见)。

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

于 2013-04-30T17:36:14.657 回答