美文网首页
ios 悬浮小球移动 (swift)

ios 悬浮小球移动 (swift)

作者: Enter_Y | 来源:发表于2019-04-26 18:49 被阅读0次

    extension ELAudioFloatPlayerView {

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        if let touch = touches.first {
            let touchPoint =  touch.location(in: self)
            touchX = touchPoint.x
        }
    }
    
    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)
        if let touch = touches.first {
            let currentPosition =  touch.location(in: self)
            let offsetX = currentPosition.x - touchP.x
            let offsetY = currentPosition.y - touchP.y
            
          //移动后的按钮中心坐标
            let centerX = self.center.x + offsetX
            var centerY = self.center.y + offsetY
            self.center = CGPoint(x: centerX, y: centerY)
            
            //父试图的宽高
            let superViewWidth = self.superview!.frame.width
            let superViewHeight = self.superview!.frame.height
            let btnX = self.frame.origin.x
            let btnY = self.frame.origin.y
            let btnW = self.frame.size.width
            let btnH = self.frame.size.height
    
            //x轴左右极限坐标
            if btnX > superViewWidth {
                //按钮右侧越界
                let centerX = superViewWidth - btnW/2
                self.center = CGPoint(x: centerX, y: centerY)
            }else if (btnX < 0){
                //按钮左侧越界
                let centerX = btnW * 0.5
                self.center = CGPoint(x: centerX, y: centerY)
            }
    
            //默认都是有导航条的,有导航条的,父试图高度就要被导航条占据,固高度不够
            let defaultNaviHeight:CGFloat = 64
            let judgeSuperViewHeight = superViewHeight - defaultNaviHeight
    
            //y轴上下极限坐标
            if btnY <= 0 {
                //按钮顶部越界
                centerY = btnH * 0.7
                self.center = CGPoint(x: centerX, y: centerY)
            } else if btnY > judgeSuperViewHeight {
                //按钮底部越界
                let y = superViewHeight - btnH * 0.5
                self.center = CGPoint(x:btnX, y:y)
            }
        }
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        let btnWidth = self.frame.size.width
        let btnHeight = self.frame.size.height
        let btnY = self.frame.origin.y
        let btnX = self.frame.origin.x
    
        let minDistance:CGFloat = 2
    
        //结束move的时候,计算移动的距离是>最低要求,如果没有,就调用按钮点击事件
        let isOverX = abs(btnX - touchX) > minDistance
        let isOverY = abs(btnY - touchY) > minDistance
    
        if isOverX || isOverY {
            //超过移动范围就不响应点击 - 只做移动操作
            super.touchesCancelled(touches, with: event)
        }else{
            super.touchesEnded(touches, with: event)
        }
    
        //按钮靠近右侧
        switch (type) {
        case .none:
            if self.center.x >= self.superview!.frame.size.width/2 {
                UIView.animate(withDuration: 0.5) {
                    let btnX = self.superview!.frame.size.width - btnWidth
                    self.frame =  CGRect(x: btnX, y: btnY, width: btnWidth, height: btnHeight)
                }
            } else {
                UIView.animate(withDuration: 0.5) {
                    let btnX:CGFloat = 0
                    self.frame =  CGRect(x: btnX, y: btnY, width: btnWidth, height: btnHeight)
                }
            }
        case .left:
            UIView.animate(withDuration: 0.5) {
                let btnX:CGFloat = 0
                self.frame =  CGRect(x: btnX, y: btnY, width: btnWidth, height: btnHeight)
            }
        case .right:
            UIView.animate(withDuration: 0.5) {
                let btnX = self.superview!.frame.size.width - btnWidth
                self.frame =  CGRect(x: btnX, y: btnY, width: btnWidth, height: btnHeight)
            }
        }
    }
    

    }

    相关文章

      网友评论

          本文标题:ios 悬浮小球移动 (swift)

          本文链接:https://www.haomeiwen.com/subject/ysgqnqtx.html