动画期间未调用 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 的选择器方法的主要内容,如果未能解决你的问题,请参考以下文章

iOS:动画期间未调用 IBAction

UIButton 动画忽略 Swift 中的目标选择器

未调用 UITapGestureRecognizer 选择器

uibutton 添加目标选择器方法在调用类而不是在被调用类中调用

在 CABasicAnimation 期间 UIButton 未显示选定状态

UIButton 调用选择器使应用程序崩溃