當用戶輸入重量時,我想旋轉針。低值和高值根據用戶身高動態變化。
pointer.transform = CGAffineTransform(rotationAngle: CGFloat(weight / low * .pi / 3))
此代碼在低端作業。但我不知道如何指出低~高,過高
uj5u.com熱心網友回復:
您要做的是轉換weight為介于0和之間的值1以獲得“進度”值。你可以通過使用一個inverseLerp函式來做到這一點,它看起來像這樣:
let progress = (weight - low) / (high - low)
此公式將回傳 0 whenweight == low和 1 when weight == high。
現在您必須將其轉換為旋轉。假設您的箭頭影像默認指向上方,我們需要在[-pi / 2, pi / 2]. pi是半個旋轉,所以我們向左旋轉四分之一,向右旋轉四分之一。
一個lerp函式范圍內變成一個值[0, 1],就像一個我們已經有了,到值的范圍之內,這正是我們需要的。它看起來像這樣:
let value = (1 - progress) * start progress * end
使用實際值,它看起來像這樣:
let angle = (1 - progress) * (-.pi / 2) progress * (.pi / 2)
我們現在使用它來轉換我們的箭頭視圖:
pointer.transform = CGAffineTransform(rotationAngle: angle)
默認情況下,視圖將按中心旋轉,因為這是默認情況下它們的錨點所在的位置。由于我們希望我們的視圖圍繞其框架的底部中間旋轉,我們可以這樣改變它:
pointer.layer.anchorPoint = CGPoint(0.5, 1)
這應該像我們想要的那樣旋轉我們的視圖。
PS:我制作了一個名為的庫CGMath,其中包含這樣的功能。你可以在這里查看。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/408274.html
標籤:
