2016-03-21 66 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