对UIView框架属性感到困惑

时间:2010-03-30 22:42:44

标签: iphone uiview ipad frame

我正在构建一个绘制图表的原型iPad应用程序。我有以下视图层次结构:

的UIView  UIScrollView中   DiagramView:UIView 的TabBar 导航栏

UIViewController子类将所有这些结合在一起。

在绘制图表之前,我第一次计算图表的尺寸,并将DiagramView框架设置为该尺寸,以及滚动视图的内容大小。

-(void)recalculateBounds
{
 [renderer diagram:diagram shouldDraw:NO];
 SQXRect diagramRect = SQXMakeRect(0.0,0.0,[diagram bounds].size.width,[diagram bounds].size.height);
 self.frame = diagramRect;
 [(UIScrollView*)[self superview] setContentSize:diagramRect.size];
}

我应该透露框架设置为大约1500 x 3500,我知道这是荒谬的。在开始优化渲染代码之前,我只想关注应用程序的其他部分。

这很好用,除了传递给drawRect的rect不是我设置的大小,我的绘图在底部被剪裁。它接近我设定的尺寸,但宽度更大,高度更短。

另外值得注意的是,如果我强制框架比我知道图表需要的大得多,那么drawRect:rect足够大,并且不会发生剪切。当然,这让我想知道框架大小是否需要考虑其他屏幕空间,如工具栏,但我对文档的阅读告诉我框架是超视图坐标,这将是滚动视图所以我认为我不要需要担心这些事情。

知道是什么导致了这种差异吗?

1 个答案:

答案 0 :(得分:4)

要注意的一点是,非3G S iPhone上的最大纹理尺寸(甚至在MacBook Air上的模拟器中)是2048 x 2048.如果您尝试创建超过此值的视图或图层在任何一个维度中,通常它根本不会显示,或者如果它确实可能会以某种方式被剪切。显然,我没有在iPad上测试它,看它是否有相同的纹理大小限制。

如果您需要这样的非常大的视图,建议的方法是使用CATiledLayer或由CATiledLayer支持的UIView。您应该能够通过重写以下方法在UIView子类中指定它:

+ (Class) layerClass 
{
    return [CATiledLayer class];
}
相关问题