UIbutton 在动画过程中也能响应事件,主要利用layer的hitTest方法

private var animationAllowUserInteractionKey: UInt8 = 0

extension UIButton {

    var animationAllowUserInteraction:Bool{

        set{

            objc_setAssociatedObject(self, &animationAllowUserInteractionKey, newValue, .OBJC_ASSOCIATION_ASSIGN)

        }

        get{

            if let ani = objc_getAssociatedObject(self, &animationAllowUserInteractionKey) as? Bool{

                return ani

            }

            return false

        }

    }

    open override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        true

    }

}

class DqAniRespondButton :UIButton{

    /*

     layer.presentation()这个方法返回值是当前Layer的副本,它包含当前事务开始时的所有属性,包括动画。它是了一个接近当前显示的layer的版本。如果该layer尚未提交,则返回nil。

     它是个只读的,对它的任何方式修改都是无效的。

     返回值的' sublayers', ' mask'和' superlayer'这些属性也是对应表示版本,也是只读的。

     可以利用它调用-hitTest:将查询表示是否点击在当前layer(包括子layer)

     该layer的所有子layers中包含p的layer,返回最顶层的layer上,如果都不包含则返回nil

     */

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        guard let touch = touches.first else{

            return

        }

        if animationAllowUserInteraction{

            let p = touch.location(in: superview)

            if ((self.layer.presentation()?.hitTest(p)) != nil) {

                super.touchesBegan(touches, with: event)

            }

        }else{

            super.touchesBegan(touches, with: event)

        }

    }

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {

        if animationAllowUserInteraction{

            let p = convert(point, to: superview)

            if ((self.layer.presentation()?.hitTest(p)) != nil) {

                return true

            }

        }

        return super.point(inside: point, with: event)

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值