计算一半

时间:2017-05-25 13:04:54

标签: ios swift animation math

我的数学很糟糕,所以我需要一些帮助,因为它到目前为止花了我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)

1 个答案:

答案 0 :(得分: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
}