动画期间未调用 UIButton 的选择器方法
Posted
技术标签:
【中文标题】动画期间未调用 UIButton 的选择器方法【英文标题】:Selector method of UIButton not called during animation 【发布时间】:2016-05-04 09:36:43 【问题描述】:我在动态视图上动态创建了按钮,后来我将该动态视图添加到主视图。 除了没有调用 UIButton 的选择器方法之外,一切都运行良好。
var baseView:UIView?
override func viewDidLoad()
super.viewDidLoad()
randomizeButtons()
func randomizeButtons()
baseView = UIView(frame:CGRectMake(view.bounds.origin.x + 10, view.bounds.origin.y + 50, view.bounds.size.width, view.bounds.size.height-20))
let viewWidth = baseView.bounds.size.width;
let viewHeight = baseView.bounds.size.height;
baseView.userInteractionEnabled = true
let i = GlobalArrayofUsers.count
var loopCount = 0
while loopCount < i
let userBaseView = UIView(frame: CGRectMake(abs(CGFloat(arc4random()) % viewWidth - 90) , abs(CGFloat(arc4random()) % viewHeight - 120), 90, 90))
print(userBaseView.frame)
userBaseView.backgroundColor = UIColor.redColor()
userBaseView.userInteractionEnabled = true
userBaseView.layer.cornerRadius = 45
userBaseView.clipsToBounds = true
let button = UIButton(frame: userBaseView.bounds)
button.backgroundColor = UIColor.greenColor()
button.showsTouchWhenHighlighted = true
button.addTarget(self, action: #selector(ViewController.handleTapEventofBtn(_:)), forControlEvents: .TouchUpInside)
button.setTitle("hello", forState: .Normal)
button.userInteractionEnabled = true
userBaseView.addSubview(button)
baseView.addSubview(userBaseView)
print("button frame is\(button.frame)")
baseView.bringSubviewToFront(userBaseView)
loopCount += 1
baseView.subviews.forEach (users) in
UIView.animateWithDuration(1, delay: 0, options: [.Autoreverse,.Repeat], animations:
users.center.y += 10
, completion: nil)
view.insertSubview(baseView, atIndex: view.subviews.count)
func handleTapEventofBtn(sender: UIButton!)
// handling code
知道为什么我的选择器方法没有被调用吗?这是由于动画。我该如何处理。
解决方案:在 UIAnimationOptions 中允许用户交互
【问题讨论】:
您是否尝试过在按钮目标中将 self 替换为您的控制器名称? @Gottz 是,但同样的问题仍然存在。 您的代码在我将其放入 viewController 时有效。您能否更新您的问题以显示您的 viewController 的完整代码? 您的按钮在按下时是否突出显示? @vacawama 不,他们不是。 【参考方案1】:问题是您正试图单击正在动画的对象。来自docs:
在动画期间,用户交互被暂时禁用 动画视图。 (在 ios 5 之前,用户交互是 对整个应用程序禁用。)
不过不用担心,解决方案非常简单,只需使用选项.AllowUserInteraction
调用您的动画即可。例如(使用您的代码):
UIView.animateWithDuration(1, delay: 0, options: [.Autoreverse,.Repeat,.AllowUserInteraction], animations:
users.center.y += 10
, completion: nil)
【讨论】:
请检查我的新代码。如果我使用动画它不起作用 @NA000022 您的代码将不再工作,因为baseView
从未初始化 + 用户未知
它现在是首字母缩写。问题是由于动画,因为我没有在 UIViewAnimation 选项中添加 userInteraction
@NA000022 我可以重现它+问题已解决(请参阅我的更新)【参考方案2】:
你试过这种方式吗:
for _ in 0...5
// generate new view
let userBaseView = UIView(frame: CGRectMake(abs(CGFloat(arc4random()) % viewWidth - 90) , abs(CGFloat(arc4random()) % viewHeight - 120), 90, 90))
userBaseView.backgroundColor = UIColor.redColor()
// add button to view
let button = UIButton(frame: userBaseView.bounds)
button.backgroundColor = UIColor.yellowColor()
button.showsTouchWhenHighlighted = true
button.addTarget(self, action: #selector(self.handleTapEventofBtn(_:)), forControlEvents: .TouchUpInside)
button.setTitle("hello", forState: .Normal)
userBaseView.addSubview(button)
self.view.addSubview(userBaseView)
你只需要在循环之前创建userBaseView,然后在循环中创建按钮并将它们添加到userBaseView,之后只需将userBaseView添加到self.view或你需要添加它的地方。在您的示例中,您在循环的每次迭代中创建 userBaseView。
我认为问题可能出在这里:
userBaseView.addSubview(button)
// add new view containing button to self.view
self.view.addSubview(userBaseView)
userBaseView.addSubview(button)
baseView.addSubview(userBaseView)
首先你在循环中将 userBaseView 添加到 self.view:
// add new view containing button to self.view
self.view.addSubview(userBaseView)
然后将其添加到 baseView:
baseView.addSubview(userBaseView)
你能发布它在 IB 中的样子吗?
【讨论】:
但我希望 userBaseView 也是动态的。 我都是以编程方式完成的。 好的,你能在屏幕上显示结果吗? PS,还请检查您的 userBaseView 和 baseView 是 userInteractionEnable = true 还有一件事,你的屏幕上有手势识别器吗? 不,没有任何手势。【参考方案3】:动作有一个参数,所以选择器签名实际上是 takeActionBtn: (注意末尾的冒号)。 您需要更改它,否则按钮将尝试调用不存在不存在参数的函数版本。
button.addTarget(self, action: "button:",forControlEvents: UIControlEvents.TouchUpInside)
func button(sender: UIButton!)
// handling code
print("1")
【讨论】:
【参考方案4】:// 嗨。您的问题出在选择器行中。试试这个:
for _ in 0...5
// generate new view
let userBaseView = UIView(frame: CGRectMake(abs(CGFloat(arc4random()) % self.view.frame.size.width - 90) , abs(CGFloat(arc4random()) % self.view.frame.size.height - 120), 90, 90))
userBaseView.backgroundColor = UIColor.redColor()
// add button to view
let button = UIButton(frame: userBaseView.bounds)
button.backgroundColor = UIColor.yellowColor()
button.showsTouchWhenHighlighted = true
button.addTarget(self, action: "buttonAction", forControlEvents: UIControlEvents.TouchUpInside)
button.setTitle("hello", forState: .Normal)
userBaseView.addSubview(button)
self.view.addSubview(userBaseView)
// 用 xcode 7.2 测试过
func buttonAction()
print("working")
【讨论】:
没有选择器方法是可以的。我已经检查过了。 那个方法被调用了吗? 不,无论如何都没有被调用 使用这个也没有帮助? : button.addTarget(self, action: "buttonAction", forControlEvents: UIControlEvents.TouchUpInside)以上是关于动画期间未调用 UIButton 的选择器方法的主要内容,如果未能解决你的问题,请参考以下文章
未调用 UITapGestureRecognizer 选择器
uibutton 添加目标选择器方法在调用类而不是在被调用类中调用