【问题标题】:UIView.animateWithDuration or UIScrollView.animateWithDuration - how to pause at current statusUIView.animateWithDuration 或 UIScrollView.animateWithDuration - 如何在当前状态暂停
【发布时间】:2015-01-22 10:18:55
【问题描述】:

我正在使用这些(代码块 1 和 2)将带有动画的 UIScrollView 从开始移动到我的结束点 (在本例中,x:0 到 1000)

代码块 1:

UIScrollView.animateWithDuration(Double(5), delay: 1, options: (UIViewAnimationOptions.AllowUserInteraction | UIViewAnimationOptions.CurveLinear | UIViewAnimationOptions.BeginFromCurrentState),
                            animations: {
self.myScrollView.contentOffset = CGPointMake(1000, 0)
                            },
                            completion: {
                                finished in
                                if(finished)
                                {

                                }
                        })

代码块 2:

UIView.animateWithDuration ...

问题是不能在当前x点暂停。

我已经尝试过了,但对我不起作用。

  • 导入 QuartzCore 框架
  • self.myScrollView.layer.beginTime = 0.0 完成
  • CATransaction.begin() 和 CATransaction.commit()

  • self.myScrollView.layer.removeAllAnimations()。这会完全停止动画,然后 UIScrollView 将到达 endPoint(到 x:1000)

另外animateWithDuration是取消scrollViewDidScroll,所以无法获取当前位置。另外,同样的原因,在暂停功能中无法获取当前位置。

func scrollViewDidScroll(scrollView: UIScrollView)
{
scrollView.bounds.origin.x
var pos:CGPoint = self.layer.presentationLayer().bounds.origin
}

func StopSlidingByBeginDragging()
{
CATransaction.begin() 
self.myScrollView.layer.removeAllAnimations()
CATransaction.commit()
}

基本上,当我手动触摸或滚动 UIScrollView 时,我需要暂停它应该暂停然后恢复。我发现这个动画是滑动动画,也许你可以提出一些不同的建议。

谢谢

【问题讨论】:

    标签: ios swift uiscrollview uiviewanimation


    【解决方案1】:

    试试这个自定义的UIScrollView 类以及UIViewController 代码。

    class TouchScrollView : UIScrollView
    {
        var animatedScrollOffset = CGPointMake(0, 0)
    
        func startAnimation()
        {
            UIScrollView.animateWithDuration(Double(5), delay: 1,
                options: (UIViewAnimationOptions.AllowUserInteraction
                    | UIViewAnimationOptions.CurveLinear |
                    UIViewAnimationOptions.BeginFromCurrentState),
                animations: {
                    self.contentOffset = self.animatedScrollOffset
                },
                completion: {
                    finished in
                    if !finished {
    
                    }
            })
    
        }
    
        func stopAnimation()
        {
            let offset = self.layer.presentationLayer().bounds.origin
            self.layer.removeAllAnimations()
            self.contentOffset = offset
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
           if let gestures = self.gestureRecognizers
            {
                for gestureRecognizer in gestures
                {
                    if let swipeRecognizer = gestureRecognizer as? UIGestureRecognizer
                    {
                        swipeRecognizer.cancelsTouchesInView = false
                    }
                }
            }
        }
    
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
        override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
            self.stopAnimation()
        }
    
        override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
            self.startAnimation()
        }
    }
    
    
    class ViewController: UIViewController, UITextViewDelegate,UIScrollViewDelegate {
    
        @IBOutlet var scrollView : TouchScrollView!
    
        override func viewDidLoad() {
    
            scrollView.contentSize = CGSizeMake(scrollView.frame.width, 10000)
            scrollView.backgroundColor = UIColor.redColor()
            scrollView.showsVerticalScrollIndicator = true
            scrollView.showsHorizontalScrollIndicator = true
            scrollView.animatedScrollOffset = CGPointMake(0, 1000)
            scrollView.startAnimation()
            scrollView.delegate = self
        }
    
        func scrollViewWillBeginDragging(_: UIScrollView) {
            println("begin dragging")
            scrollView.stopAnimation()
        }
    
        func scrollViewDidEndDragging(_ : UIScrollView, willDecelerate decelerate: Bool) {
            println("end dragging")
            if !decelerate
            {
                scrollView.startAnimation()
            }
        }
    
        func scrollViewDidEndDecelerating(_ : UIScrollView) {
            scrollView.startAnimation()
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 2016-11-23
      相关资源
      最近更新 更多