Ios UIButton在第一次单击后不可单击
我试图在单击按钮时从底部显示一个子视图。但这只是第一次按钮是可点击的。对于动画后的第二次单击,按钮不可单击 这是代码Ios UIButton在第一次单击后不可单击,ios,swift3,xcode8,Ios,Swift3,Xcode8,我试图在单击按钮时从底部显示一个子视图。但这只是第一次按钮是可点击的。对于动画后的第二次单击,按钮不可单击 这是代码 class AnimateView: UIView { var button: UIButton! var menuView: UIView! var mainView: UIView! override init(frame: CGRect) { super.init(frame: frame) mainView = UIView(fra
class AnimateView: UIView {
var button: UIButton!
var menuView: UIView!
var mainView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
mainView = UIView(frame: CGRect(x: 0, y: 0, width:
self.frame.size.width, height: self.frame.size.height))
mainView.clipsToBounds = true
mainView.backgroundColor = .clear
mainView.isUserInteractionEnabled = true
mainView.isExclusiveTouch = true
self.addSubview(mainView)
let theRect = CGRect(x: self.frame.size.width / 2 - 44 / 2, y: 0,
width: 44, height: 44)
button = UIButton(frame: theRect)
check.layer.cornerRadius = btnView.frame.size.height / 2
mainView.addSubview(self.check)
mainView.bringSubview(toFront: check)
check.addTarget(self, action: #selector(buttonClick(_:)),
for:.touchUpInside)
let newRect = CGRect(x: 0, y: check.frame.height, width:
self.frame.size.width, height: self.mainView.frame.size.height)
menuView = UIView(frame: newRect)
menuView.backgroundColor = .blue
mainView.addSubview(menuView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func buttonClick(_ sender: UIButton) {
toggleMenu()
}
func toggleMenu() {
if check.transform == CGAffineTransform.identity {
UIView.animate(withDuration: 1, animations: {
self.check.transform = CGAffineTransform(scaleX: 12, y: 12)
self.mainView.transform = CGAffineTransform(translationX: 0, y: -120)
self.check.transform = CGAffineTransform(rotationAngle: self.radians(180)) // 180 is 3.14 radian
self.setNeedsLayout()
}) { (true) in
UIView.animate(withDuration: 0.5, animations: {
})
}
} else {
UIView.animate(withDuration: 1, animations: {
// .identity sets to original position
//self.btnView.transform = .identity
self.mainView.transform = .identity
self.button.transform = .identity
})
}
}
}
该类是从另一个UIView类调用的,如下所示
class MainViewClass: UIView {
var animateView: AnimateView!
override init(frame: CGRect) {
animateView = AnimateView(frame: CGRect(x: 0, y: self.frame.size.height - 44 - 44 - 20, width: self.frame.size.width, height: 122+44))
//animateView.clipsToBounds = true
self.addSubview(animateView)
self.bringSubview(toFront: animateView)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
当屏幕首次出现时:
最初,按钮是可单击的,单击时,它会随子视图一起向上移动。
现在该按钮不可单击。当我看到按钮的框架时,它与屏幕最初出现时一样,按钮接触屏幕底部,即使它向上移动。
我的意图是在点击按钮时从底部显示带有动画的屏幕,并在第二次点击时移动到默认位置
但是,如果我将按钮作为self内部的子视图放置,而不是作为mainView的子视图放置,则该按钮是可单击的,但即使在视图设置动画并向上移动后,它仍保持在相同的位置
self.addSubview(按钮)
因此,我终于找到了动画制作前后我想要实现的目标的解决方案 UIButton在动画之后未接收任何触摸事件的原因是,在动画之后,UIButton向上移动,因为它是mainView的子视图。因此,它超出其superView的范围,不会响应任何单击事件。虽然我移动了按钮和它的superView(主视图),但按钮并没有响应触摸事件。 然后,我使用hitTest测试按钮绑定是否在mainView中:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let pointForTargetView: CGPoint = button.convert(point, from: mainView)
if button.bounds.contains(pointForTargetView) {
print("Button pressed")
return button.hitTest(pointForTargetView, with:event)
}
return super.hitTest(point, with: event)
}
如果条件为:
button.bounds.contains(pointForTargetView)
动画后按下按钮时返回false
所以,我需要捕获子视图上的触摸事件,它位于它的superview框架之外
使用hitTest()解决了我的问题。
这是帮助我的链接
Swift 3
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
if clipsToBounds || isHidden || alpha == 0 {
return nil
}
for subview in subviews.reversed() {
let subPoint = subview.convert(point, from: self)
if let result = subview.hitTest(subPoint, with: event) {
return result
}
}
return nil
}
屏幕截图:
当屏幕第一次出现时,按钮位于屏幕底部,子视图隐藏在按钮下方
单击按钮时,mainView会向上设置动画,并且按钮会向上移动,因为它是mainView的子视图
再次单击按钮时,mainView会转到上一个位置,按钮也会转到上一个位置
制作完动画后,是否需要删除
AnimateView
,以便再次显示按钮?首先,单击按钮时,子视图应从屏幕底部开始制作动画,并且按钮也应向上移动。然后,第二次单击按钮时,该按钮应与子视图一起向下移动。现在,当单击按钮时,子视图会随着按钮的按钮一起向上设置动画,按钮不可单击。当单击按钮并向上移动时,它不可单击。虽然我试图更新它的框架,但它不可点击。