代码之家  ›  专栏  ›  技术社区  ›  Rakesha Shastri

立即调用pan手势完成处理程序

  •  1
  • Rakesha Shastri  · 技术社区  · 6 年前

    我正在设置视图的动画,以便在用户平移屏幕时移动。我保留了一个阈值,之后视图将动画设置为默认位置。

    当前的问题是,将视图重置到某个位置的animate方法的完成处理程序在持续时间之前被调用动画似乎是突然发生的,而不是持续一段时间。

    // Pan gesture selector method
    @objc func panAction(for panGesture: UIPanGestureRecognizer) {
        switch panGesture.state {
        case .began:
        //Began code
        case changed:
        if (condition) {
           print("IF")
           //Change constraint constant of customView
           animate(view: customView)
        } else if (condition) {
           print("ELSE IF")
           //Change constraint constant of customView
           animate(view: customView)
        } else {
           //Change constraint constant of customView
           print("ELSE")
           view.layoutIfNeeded()
        }
        case .ended:
        //Ended code
        default:
        break
        }
    }
    

    动画制作方法:

    func animate(view: UIView) {
        UIView.animate(withDuration: 3, delay: 0, options: .curveEaseOut, animations: {
            view.layoutIfNeeded()
        }, completion: { (finished) in
            if finished {
                flag = false
            }
        })
    }
    

    标志将立即设置,而不是在3秒后设置。

    我在摇摄和跨过门槛时得到的O/P。

    其他

    其他

    其他

    其他

    如果

    编辑:我是个白痴。我没有打电话 layoutIfNeeded() 在超视场上。

    2 回复  |  直到 6 年前
        1
  •  0
  •   ekscrypto    6 年前

    当手势发生时,您的手势会发送几个事件,当您多次调用uiview.animate()代码时,新值将取代前一个值。

    尝试添加动画选项 .beginFromCurrentState 以下内容:

    UIView.animate(withDuration: 0.5, delay: 0, options: [.beginFromCurrentState,.allowAnimatedContent,.allowUserInteraction], animations: {
        view.layoutIfNeeded()
    }) { (completed) in
        ...
    }
    

    并期望在手势进行时多次调用completed==false。


    编辑:您的问题还可能与在错误的视图上调用layoutifneeded()有关,可能是在viewcontroller.view上尝试调用此函数?

        2
  •  0
  •   Rakesha Shastri    6 年前

    我解决了这个问题。我没打电话 layoutIfNeeded 在超视场上。