簡體   English   中英

在自定義UIView中對更改進行動畫處理

[英]Animate changes in a custom UIView

我正在為iOS實現自定義循環進度欄。 在我的drawRect方法中,我有以下代碼:

override func drawRect(rect: CGRect) {
    // Drawing code
    let path = UIBezierPath(arcCenter: barCenter, radius: radius, startAngle: CGFloat(0.0), endAngle: CGFloat(2 * M_PI) * progress, clockwise: true)
    color.set()
    path.lineWidth = lineWidth
    path.stroke()
}

每當progress屬性更改時,我都會調用setNeedsDisplay()方法。

問題是我想動畫化此進度變化,即我不希望視圖從0跳到100。我能想到的唯一方法是使用NSTimer。 那么,也許有一些更合適的方法可以做到這一點?

我建議使用其他方法。 不用覆蓋drawRect,而是讓您的自定義視圖在形狀層中創建CAShapeLayer和完整的圓形路徑(創建圓形路徑可以就像您在代碼中所做的一樣。)

然后創建一個CABasicAnimation,在所需的任何時間段內,將形狀圖層的strokeEnd屬性設置為從0(不繪制任何路徑)到1.0(繪制所有路徑)。 然后,系統負責生成與屏幕刷新同步的中間幀。

您可以選擇線性定時,緩入,緩出或緩入,緩出定時。

我在Github上有一個類似的項目:

https://github.com/DuncanMC/iOS-CAAnimation-group-demo

看一下演示中的“時鍾擦除動畫”部分。 該動畫如下所示:

在此處輸入圖片說明

在該動畫中,它使用形狀圖層作為圖像視圖的蒙版。 相反,您可以將形狀層安裝為視圖內容層的子層(或者,您可以覆蓋視圖類的layerClass方法,以將自定義視圖的層類型更改為CAShapeLayer如果您唯一想繪制的層)您的視圖是圓形動畫。)

我的動畫還使圓變得如此粗,以至於它完全填滿了圖像的邊界矩形。 您希望動畫中的線寬較小。

編輯:

我看到您在Swift中工作。 我的示例應用程序在Objective-C中,但是概念是相同的。 讓我知道您是否需要翻譯任何幫助。 (我是“雙語”。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM