2017-02-16 5 views
0

У меня есть следующий код, который выполняет именно то, что мне нужно. Я должен был специально настроить таргетинг на эти элементы пользовательского интерфейса, а не на использование всплывающей надстройки UIView из-за характера приложения.Swift - оптимизация анимации пользовательского интерфейса

@IBAction func hidecontrols(_ sender: UIButton) { 
    UIView.animate(withDuration: 0.5) { 
    self.brightnesstitle.alpha = 0 
    self.brightnesslbl.alpha = 0 
    self.brightnesssldr.alpha = 0 
    self.kelvintitle.alpha = 0 
    self.kelvinlbl.alpha = 0 
    self.kelvinsldr.alpha = 0 
    self.greentitleminus.alpha = 0 
    self.greentitleplus.alpha = 0 
    self.greenzerobtn.alpha = 0 
    self.greensldr.alpha = 0 
    self.greensldrdiv.alpha = 0 
    self.hidecontrolsbtn.alpha = 0 
    } 
} 

Я бы хотел (а) оптимизировать его, но я потратил впустую часы, поэтому я оставил его как есть. Первоначально я попробовал цикл for, в который я помещал различные имена пользовательских интерфейсов в массив, но независимо от того, что я пробовал, он не прошел бы через строку правильно и утверждал, что .alpha не является членом String.

Есть ли способ назначить пользовательское значение для каждого элемента пользовательского интерфейса, который я хочу затронуть, а затем вызвать анимацию fade для каждого элемента, который имеет это значение?

ответ

0

Ага, я могу думать о двух способов:

Простой вариант. Если все переменные выше, являются экземпляры UIView или подклассов UIView, то вы можете сделать:

let fadingViews: [UIView] = [brightnesstitle, brightnesslbl, ...] 
UIView.animate(withDuration: 0.5) { fadingViews.forEach { $0.alpha = 0 } } 

Если некоторые из них не UIView экземпляров, то вы можете определить протокол, как это

protocol Fadable { 
    var alpha: CGFloat { get set } 
} 

extension UIView: Fadable {} 
extension MyClass: Fadabale {} 

и затем

let fadables: [Fadable] = [brightnesstitle, brightnesslbl, ...] 
UIView.animate(withDuration: 0.5) { fadingViews.forEach { $0.alpha = 0 } }