1

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

UIView UIScrollView DiagramView : UIView TabBar NavigationBar

和一个 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 的矩形不是我设置的大小,而且我的绘图在底部被剪裁了。它接近我设置的尺寸,但宽度更大,高度更短。

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

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

4

1 回答 1

4

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

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

+ (Class) layerClass 
{
    return [CATiledLayer class];
}
于 2010-03-31T02:55:44.900 回答