繁体   English   中英

使用自定义图形处理UIView自动调整大小的最佳方法

[英]Best way to handle autoresizing of UIView with custom drawing

我正在使用一个自定义视图,该视图具有一些特定的Core Graphics绘图。 我想尽可能有效地处理视图的自动调整大小。

如果我在UIView中绘制了一条垂直线,并且视图的宽度被拉伸,则该线的宽度将随之拉伸。 我想保持原始宽度,因此每次在-layoutSubviews重绘:

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];

    // ONLY drawing code ...
}

- (void)layoutSubviews
{
    [super layoutSubviews];
    [self setNeedsDisplay];
}

这很好用,但是我认为这不是一种有效的方法-除非CGContext绘图很快。

真的快吗? 还是有更好的方法来处理视图的自动调整大小? (CALayer在iOS上不支持自动调整大小)。

更新:这将是一个可重用的视图。 它的任务是绘制由dataSource提供的数据的可视表示形式。 因此,实际上可能会有很多图纸。 如果无法进一步优化它,那么我无能为力……但是我严重怀疑我是否采用了正确的方法。

这实际上取决于您所说的“快速”是什么意思,但是对于您而言,答案可能是“否,CoreGraphics绘图不会给您带来出色的性能。”

每当您绘制drawRect时(即使您使用CoreGraphics进行绘制),您实际上都是在绘制一个位图,以支持您的视图。 最终将位图发送到较低级别的图形系统,但是从根本上讲,这比(例如)绘制到OpenGL上下文中的过程要慢。

当您具有带有drawRect的视图绘图时,通常最好设想一下对drawRect的每次调用都会“创建”一个位图,因此您应尽量减少调用drawRect的次数。

如果只需要一条垂直线,我建议您制作一个宽度为一点的简单视图,该视图配置为在根视图的中心布局并垂直拉伸。 您可以通过为其提供背景颜色来为视图着色,并且无需实现drawRect。

通常不建议使用视图,并且实际上首选直接绘制,尤其是在场景复杂时。

如果您看到绘图代码付出了可观的代价,则进一步优化绘图的步骤是通过仅使视图的某些部分而非全部无效( setNeedsDisplayInRect:或使用平铺仅绘制部分来使绘图最小化。

例如,调整视图大小时,如果只需要绘制视图已更改的区域,则可以监视和计算当前布局与以前的布局之间的大小差异,并且仅使已更改的区域无效。 编辑:似乎iOS不允许局部视图绘图,因此您可能需要将绘图移动到CALayer ,并将其用作视图的图层。

CATiledLayer还可以提供一种可能的解决方案,您可以在其中缓存和预加载切片,并异步并发绘制所需的切片。

但是在采取严厉措施之前,请先在困难的条件下测试代码,然后看一下代码是否具有足够的性能。 仅使更新的区域无效可以提供帮助,但是将图形限制为提供的矩形并不总是那么简单。 切片会增加更多的难度,因为切片机制需要学习,并且元素是在后台线程上绘制的,因此并发问题也很重要。

这是关于优化来自Apple WWDC 2012的2D绘图的有趣视频: https : //developer.apple.com/videos/wwdc/2012/? include = 506#506

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM