简体   繁体   中英

Stop UIDynamicAnimator Whit view Limits

I have been trying to create a custom UIClass that implements an horizontal scrolling for its inner content by using UIPanGestureRecognizer.

My first success approach was:

@IBAction func dragAction(_ sender: UIPanGestureRecognizer) {

    let velocity = sender.velocity(in: sender.view)

    if velocity.x > 0{

        //print("\(logClassName) Dragging Right ...")
        if innerView!.frame.origin.x < CGFloat(0){
            offSetTotal += 1
            innerView?.transform = CGAffineTransform(translationX: CGFloat(offSetTotal), y: 0)
        }

    }
    else{

        //print("\(logClassName) Dragging Left ...")
        if totalWidth - innerView!.bounds.maxX < innerView!.frame.origin.x{
            offSetTotal -= 1
            innerView?.transform = CGAffineTransform(translationX: CGFloat(offSetTotal), y: 0)
        }

    }

}

That way, althought is a little bit clunky, I am able to scroll from left to right (and reverse) and the innerview is always covering in the holderView.

Then, and because i wanted to get the scrolling effect that you would get with a UIScrolling view i tried the following approach

@objc func handleTap(_ pan: UIPanGestureRecognizer){

    let translation = pan.translation(in: innerView)
    let recogView = pan.view
    let curX = recogView?.frame.origin.x

    if pan.state == UIGestureRecognizerState.began {

        self.animator.removeAllBehaviors()
        recogView?.frame.origin.x = curX! + translation.x
        pan.setTranslation(CGPoint.init(x: 0, y: 0), in: recogView)

    }else if pan.state == UIGestureRecognizerState.changed {

        recogView?.frame.origin.x = curX! + translation.x
        pan.setTranslation(CGPoint.init(x: 0, y: 0), in: recogView)

    }else if pan.state == UIGestureRecognizerState.ended {

        let itemBehavior = UIDynamicItemBehavior(items: [innerView!]);
        var velocity = pan.velocity(in: self)
        print(velocity.y)
        velocity.y = 0
        itemBehavior.addLinearVelocity(velocity, for: innerView!);
        itemBehavior.friction = 1
        itemBehavior.resistance = 1;
        //itemBehavior.elasticity = 0.8;

        self.collision = UICollisionBehavior(items: [innerView!]);
        self.collision!.collisionMode = .boundaries
        self.animator.addBehavior(collision!)
        self.animator.addBehavior(itemBehavior);

    }

Now the problem i face is that it moves horizontally but it goes away and gets lose.

Is that the right approach? Is there a delegate?

The question was posted due to a lack of knowledge of UIScrollViews. I Knew how to do with Storyboard and only scroll vertically.

I ended up creating a programatically UIScrollView and setting up its content size with the inner view.

    scrollView = UIScrollView(frame: bounds)
    scrollView?.backgroundColor = UIColor.yellow
    scrollView?.contentSize = innerView!.bounds.size
    scrollView?.addSubview(innerView!)
    addSubview(scrollView!)

But first I have defined the innerView.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM