2013-04-30 46 views
0

我在想什么是更好的方式来计算和获得动态绘制的UIView的最终尺寸。例如,我有一个超级视图,其中将会绘制一堆视图。我需要这些视图的维度来正确地布局它们,但其最终大小是动态的,并考虑到它们将显示的数据。哪个更好的方法来获得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:,这与参数绘制之后返回文本的最终大小。

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

谢谢。

+2

这听起来像一个布局问题,可以使用适当的自动布局或支柱/弹簧设置来解决。你有没有考虑过使用它而不是试图计算所有这些值? – lehn0058 2013-04-30 14:11:58

回答

1

您通常不应该计算大小drawRect:。您应该拥有所需的所有数据,以便更新数据。用类方法计算它似乎有点奇怪(尽管如果你需要从不同的地方调用它,那也许没问题,但这仍然不常见)。

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

相关问题