【问题标题】:How to generate an array of buttons using a for-in-loop and then animate them with a CADisplayLink如何使用 for-in-loop 生成按钮数组,然后使用 CADisplayLink 对其进行动画处理
【发布时间】:2015-03-03 21:54:21
【问题描述】:

我尝试使用 for-in-loop 生成一个包含 10 个按钮的数组,然后使用 CADisplayLink 内部的 for-in-loop 对其进行动画处理,但问题是只有一个按钮正在创建和动画化。请帮忙!提前致谢!

var buttons: [UIButton] = Array(count: 10, repeatedValue: UIButton.buttonWithType(.System) as UIButton)

override func viewDidLoad() {
    super.viewDidLoad()

    var displayLink = CADisplayLink(target: self, selector: "handleDisplayLink:")
    displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)

    for index in 0...10 - 1{

        var xLocation:CGFloat = CGFloat(arc4random_uniform(300) + 30)

        buttons[index].frame = CGRectMake(xLocation, 10, 100, 100)
        buttons[index].setTitle("Test Button \(index)", forState: UIControlState.Normal)
        buttons[index].addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)

        self.view.addSubview(buttons[index])

    }



}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

func handleDisplayLink(displayLink: CADisplayLink) {

    for index in 0...10 - 1{

        var buttonFrame = buttons[index].frame
        buttonFrame.origin.y += 1
        buttons[index].frame = buttonFrame
        if buttons[index].frame.origin.y >= 500 {
            displayLink.invalidate()
        }
    }
}


func buttonAction(sender: UIButton) {
    sender.alpha = 0
}

}

【问题讨论】:

    标签: ios swift uibutton for-in-loop cadisplaylink


    【解决方案1】:

    构造函数Array(count:, repeatedValue:) 不会多次执行UIButton 构造函数。它接收一个值然后重复它,你只是碰巧内联实例化了指针。

    你所做的在功能上是一样的:

    var aButton:UIButton = UIButton.buttonWithType(.System) as UIButton
    var buttons: [UIButton] = Array(count: 10, repeatedValue:aButton)
    

    以这种方式拆分参数使Array构造函数的操作更加清晰。


    你可能想做的更像是:

    var buttons:[UIButton] = Array()
    for index in 1...10 {
      buttons.append(UIButton.buttonWithType(.System) as UIButton)
    }
    

    你可以像这样更快速:

    var buttons:[UIButton] = Array(Range(1...10)).map( { $0; return UIButton.buttonWithType(UIButtonType.System) as UIButton } )
    

    我不完全确定为什么我需要在该闭包的前面添加$0;,但没有它它就无法工作。幸运的是,它什么也没做。

    【讨论】:

    • 好的,谢谢,是否可以像使用 UIView.AnimateWithDuration 一样为 CADisplayLink 设置某种延迟,以便所有按钮在不同时间进行动画处理?
    猜你喜欢
    • 2015-05-03
    • 2013-01-22
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多