2015-03-03 3 views
0

Im пытается сгенерировать массив из 10 кнопок, используя for-in-loop, а затем оживляя их, используя for-in-loop, который находится внутри CADisplayLink, но проблема в том, что создается и анимируется только одна кнопка. Пожалуйста помоги! Заранее спасибо!Как сгенерировать массив кнопок, используя for-in-loop, а затем анимировать их с помощью CADisplayLink

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 
} 

}

ответ

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; в начало этого закрытия, но он отказался работать без него. К счастью, он ничего не делает.

+0

Благодарим вас и есть ли способ создать какую-то задержку для CADisplayLink, как вы можете сделать с UIView.AnimateWithDuration, чтобы все кнопки отображались в разное время? –

 Смежные вопросы

  • Нет связанных вопросов^_^