2017-05-25 55 views
0

我的數學比例很爛,所以我需要在這一個一些幫助,因爲它是我花2小時,遠不及我有沒有在那裏。計算一半

我啓用了滑動面板(很像「刷卡透露」你上表細胞功能)的觸摸。這是一個醜陋的ascii圖

----------------------------- 
| Slide   | Reveal | 
----------------------------- 

您滑動左側的「幻燈片」位,以顯示揭示位。我現在想要做的是制定出來,當觸摸結束時顯示多少顯示,並且打開或關閉。

我知道,揭示框的寬度是110,我還可以工作了,如果幻燈片已經向左移動由-75,那麼「開放百分比」爲75%

Open Percentage = left/width 

我希望動畫時間從中心0.5秒。所以如果你在50%時需要0.5秒的時間來打開,而49%需要0.5秒來快速關閉(或者在那裏,我知道49%會在0.5秒之內觸摸)

同樣,如果滑塊是隻有20%打開它應該需要0.1秒來關閉,而80%打開是0.1秒來打開。

我相信我需要向左側偏移,相對摸出半寬度,計算百分比,然後應用這一比例到最大0.5動畫時間......但是,這是我卡住。

更新:這是我設法得到了一些試錯後的工作,但感覺冗長和雜亂。絕對是一種更簡單的方法!

  // Config 
      let maxAnimationTime = 0.5 

      // Get left offset 
      let absLeftOffset = abs(cell.leftContstraint.layoutConstraints[0].constant) 

      // Get width of action box 
      let actionBoxWidth = cell.revealView.frame.width 
      let halfActionBoxWidth = actionBoxWidth/2 

      // Are we opening or closing? 
      let snapOpen = absLeftOffset > halfActionBoxWidth 

      // Calculate the left position relative the half width 
      let xPos = snapOpen ? absLeftOffset - halfActionBoxWidth : absLeftOffset 

      // Calculate the percentage of the left percentage relative to the half width 
      let perc = snapOpen ? abs(xPos - halfActionBoxWidth)/halfActionBoxWidth : xPos/halfActionBoxWidth 

      // Use the percentage to calculate the animation time to apply 
      let animationTime = (Double(perc) * maxAnimationTime).round(to: 2) 
+0

如果你知道個你能不能只使用該值的動畫時間?如果其小於或等於50%,則只使用動畫時間的百分比值,如果大於50則使用'100 - percentValue'作爲動畫時間。 – Hodson

回答

1

如果從中途對齊需要0.5秒鐘,整個過程需要1秒鐘。你的捕捉時間僅僅是它所捕捉的整個寬度的百分比乘以整個行程所花費的時間。

因此,如果滑塊搶購開放,應採取1.0 x %from_left,如果它被搶購關閉,應採取1.0 x %from_right

注意,在下面的,雖然我說說%的,我的意思是0和之間的分數1.

先計算%右:

let rightPercent = Double(displacementFromRight)/Double(width) 

如果是大於或等於0.5,你需要計算leftPercent。 leftPercent是1 - rightPercent。

如果rightPercent小於0.5你已經有了正確的比例,因此把他們放在一起:

let maxDuration: Double = 1 // Maximum snap time in seconds 
let duration: Double 
if rightPercent >= 0.5 
{ 
    // we will snap open 
    duration = (1 - rightPercent) * maxDuration 
} 
else 
{ 
    // we will snap closed 
    duration = rightPercent * maxDuration 
} 
+0

令人驚訝的是,我剛剛發佈了一個更新我的問題,以顯示我設法達到的目標。你的解決方案更加緊密,不知道爲什麼我沒有想到它,現在看起來很簡單,現在已經解釋了!感謝您的幫助,我會刪除我所做的醜陋代碼並使用您的代碼:D – TRG