2016-03-21 51 views
0

这是我用于绘制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它的工作原理很快速

回答

1

有两个快速技术,以提高在这些情况下的性能:

  1. 开始拖动UIView之前,您可以设置viewtruelayershouldRasterize,当你完成下降它,将shouldRasterize恢复为false。有时(特别是拖动的图像可能会发生变化),这会产生不利影响,但尝试很简单,您可以查看它是否改善了性能。

  2. 另一种方法是手动创建快照(例如,使用其剪辑呈现视图到UIImage),并用UIImageView代替视图,然后拖动该视图,然后在放下视图时将其替换为原始视图(如果您需要它,有时快照是您所需要的)。

我可能会建议看WWDC 2012的视频iOS App Performance: Graphics and Animations这说明了诊断和解决图形性能问题的一些技巧。视频可能有几年了,但这些技术仍然在很大程度上适用。 Optimizing 2D Graphics and Animation Performance视频也可能提供一些见解(尽管我认为其他视频在这里可能更适用)。顺便说一下,有很多其他技巧可以提高性能(例如,在拖动视图时,使用预测性触摸;如果拖动的视图包含很多透明度,可能会使不透明的快照拖动;等等)。 ),但也许尝试上面的第一个,看看是否最大限度地减少性能问题。此外,请确保您在目标设备上测试此功能,并且不要依赖模拟器中的测试,因为性能特征往往是完全不同的。

0

遮罩视图的动画本质上很慢,因为渲染树必须在每一帧重新计算。正如你所说的那样,它并不需要很多这样的观点,所有的动画都在同一时间变得明显(通常在口吃中)。苹果公司的WWDC专门为此提供了许多优秀的视频,通常是在滚动的情况下(例如桌面视图);我建议观看一些视频,这些视频也提供了解决方法。

基本上,最好的解决方法可能是不要这样做。尝试其他方法,例如绘制视图,以便视图以正确的形状绘制(外部只是透明的)。这对绘图系统来说要小得多,因为没有复合模板。例如,要使视图成为圆形,请使用图像视图,其图像是圆形图片。如果可能的话,不透明的观点当然更好。

+1

顺便说一句,你会发现仪器的核心动画模板的使用非常有助于量化和定位原因。 – matt