簡體   English   中英

動畫期間未調用UIButton的選擇器方法

[英]Selector method of UIButton not called during animation

在此處輸入圖片說明 我已經在動態視圖上動態創建了按鈕,后來又將該動態視圖添加到了主視圖中。
除未調用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中允許用戶交互

問題是您試圖單擊正在動畫的對象。 文檔

在動畫過程中,將暫時禁用用戶交互以激活動畫視圖。 (在iOS 5之前,整個應用程序都禁止用戶交互。)

但是不用擔心,該解決方案非常簡單,只需使用.AllowUserInteraction選項調用動畫.AllowUserInteraction 例如(使用您的代碼):

UIView.animateWithDuration(1, delay: 0, options: [.Autoreverse,.Repeat,.AllowUserInteraction], animations: {
    users.center.y += 10
}, completion: nil)

您是否嘗試過這種方式:

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中發布它的樣子嗎?

//嗨。 您的問題出在選擇器行中。 嘗試這個:

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")
}

該動作具有一個參數,因此選擇器簽名實際上是takeActionBtn:
(請注意最后的冒號)。
您需要更改它,否則按鈕將嘗試調用不帶參數的函數版本。

button.addTarget(self, action: "button:",forControlEvents: UIControlEvents.TouchUpInside)

func button(sender: UIButton!) {
    // handling code
    print("1")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM