这是我用于为UIView绘制蒙版的代码。问题是,如果我在屏幕上有超过5个带屏蔽的UIViews,它会影响拖动时的性能。 UIViews: 如何改进下面的代码?:
+ (UIBezierPath *)roundedPathAtCenter:(CGPoint)center size:(CGSize)size corner:(CGFloat)corner
{
NSInteger width = size.width;
NSInteger height = size.height;
UIBezierPath *path = [UIBezierPath bezierPath];
// upper left corner
[path moveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f)];
// path to top center
[path addQuadCurveToPoint: CGPointMake(center.x, center.y - height / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y - height / 2.0f)];
// path to upper right
[path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f - corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f - corner, center.y - height / 2.0f)];
// path to mid right
[path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0f, center.y) controlPoint: CGPointMake(center.x + width / 2.0f, center.y - height / 2.0 + corner)];
// path to lower right
[path addQuadCurveToPoint: CGPointMake(center.x + width / 2.0 - corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0f, center.y + height / 2.0f - corner)];
// path to center bottom
[path addQuadCurveToPoint: CGPointMake(center.x, center.y + height / 2.0f) controlPoint: CGPointMake(center.x + width / 2.0 - corner, center.y + height / 2.0)];
// path to lower left
[path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y + height / 2.0f - corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f + corner, center.y + height / 2.0f)];
// path to mid left
[path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f, center.y) controlPoint: CGPointMake(center.x - width / 2.0f, center.y + height / 2.0 - corner)];
// path to top left
[path addQuadCurveToPoint: CGPointMake(center.x - width / 2.0f + corner / 2.0f, center.y - height / 2.0f + corner / 2.0f) controlPoint: CGPointMake(center.x - width / 2.0f, center.y - height / 2.0f + corner)];
[path closePath];
return path;
}
不为UIViews添加遮罩,它的工作速度非常快
答案 0 :(得分:1)
在这些情况下,有两种快速技术可以提高性能:
在开始拖动UIView
之前,您可以将shouldRasterize
layer
的{{1}}设置为view
,当您完成删除后,将true
恢复为shouldRasterize
。有时(特别是如果拖动的图像可能会发生变化)这会产生负面影响,但尝试起来很简单,你可以看看它是否能提高性能。
另一种方法是手动创建快照(例如,将视图渲染为false
)并用UIImage
替换视图,然后拖动它,然后当你放下它时,用原始视图替换它(如果你需要它;有时你需要快照)。
我可能会建议观看WWDC 2012视频iOS App Performance: Graphics and Animations,其中介绍了诊断和解决图形性能问题的一些技巧。该视频可能已有几年历史,但这些技术仍然适用。 Optimizing 2D Graphics and Animation Performance视频也可能提供一些见解(虽然我认为其他视频可能更适用于此处)。
顺便提一下,有很多其他技巧可以改善性能(例如,拖动视图时,使用预测性触摸;如果被拖动的视图包含大量透明度,可能会制作不透明的快照以进行拖动;等等) ,但也许首先尝试以上,并看看是否最小化性能问题。另外,请确保在目标设备上进行测试,并且不要依赖于模拟器中的测试,因为性能特征通常是完全不同的。
答案 1 :(得分:0)
蒙版视图的动画本质上很慢,因为必须在每一帧重新计算渲染树。正如你正确地说的那样,并没有需要很多这样的观点同时为此变得明显(这通常是在口吃中)。 Apple的WWDC已经为此投入了许多优秀的视频,通常是在滚动的背景下(例如桌面视图);我建议观看一些视频,这也是建议的解决方法。
基本上,最好的解决方法可能是不要这样做。尝试其他方法,例如绘制视图以使视图以正确的形状绘制(外部只是透明)。这对绘图系统的压力要小得多,因为没有复合蒙版。例如,要使视图成为圆形,请使用图像视图,其图像是圆形图像。当然,如果可能的话,不透明的观点会更好。