2016-08-18 63 views
0

对不起,这可能看起来像一个愚蠢的问题。如果我有一个从UIButton继承的类LargeButton,有没有办法让我说当单击任何LargeButton时,所有LargeButton对象都有动画并消失?你可以让一个类的所有对象用一个方法调用做同样的事情吗?

UIView.animateWithDuration(0.4, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 
     AllLargeButtons.alpha = 0 
     }, completion: { finished in 
      AllLargeButtons.hidden = true 

有没有办法做到这样的事情,而不是先把所有的LargeButton存储在数组中?

编辑:

class LargeButton: UIButton { 
    required init?(coder: NSCoder) { 
     super.init(coder: coder) 

     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil) 
    } 

    func oneLargeButtonTapped() { 
     UIView.animateWithDuration(0.4, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { 
     self.alpha = 0 // Here you will get the animation you want 
     }, completion: { finished in 
      self.hidden = true // Here you hide it when animation done 
     }) 
    } 

    deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 
} 


class viewController: UIViewController { 
    @IBAction func buttonTapped(sender: UIButton) { 
      NSNotificationCenter.defaultCenter().postNotificationName("oneOfLargeButtonsTapped", object: nil, userInfo: nil) 
    } 
} 

创建LargeButton:

lazy var aButton: LargeButton = { 
     let button = LargeButton() 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil) 

//  button.addTarget(self, action: #selector(oneLargeButtonTapped), forControlEvents: .TouchUpInside) 

     return button 
    }() 

回答

2

不在你所建议的方式,没有。这将要求每个班级跟踪所有现有的对象,而他们不这样做。您可以通过让初始化程序将新实例添加到staticArray来实现此目的,但您不应该这样做。如果您希望拥有同一班级的其他物件,而其他物件不会动起来,会发生什么情况?

相反,您应该创建一个包含所有希望动画的对象的数组。有LargeButtonIBAction调用一个迭代对象数组并对它们进行动画的方法。

+0

或者引发自定义事件,然后从每个按钮实例处理它。 –

+0

你是什么意思,@ chrisp_68? – Alexander

+0

@AlexanderMomchliov如果我以编程方式编写它,我没有真正的选择,而是要为每个现有的LargeButton编写动作,我猜对了? – tryingtolearn

4

当创建LargeButton对象进行注册以接收通知:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(LargeButton.oneLargeButtonTapped), name: "oneOfLargeButtonsTapped", object: nil) 

当LargeButtons之一被轻敲后的通知。

NSNotificationCenter.defaultCenter().postNotificationName("oneOfLargeButtonsTapped", object: nil, userInfo: nil) 

在方法“oneLargeButtonTapped”实现所需的行为。

不要忘记在通知中心销毁前注销按钮。

NSNotificationCenter.defaultCenter().removeObserver(self) 
+0

感谢您的回答。我应该在哪里发布发布通知的代码?在一个大按钮打开我想象是否正确? – tryingtolearn

+0

你可以给我一个oneLargeButtonTapped()方法的例子吗? 它应该是oneLargeButtonTapped(发件人:UIButton){ //在此处执行动画 } – tryingtolearn

+0

@tryingtolearn - 您在接收水龙头的方法中发布通知。所以当一个按钮被轻敲时,它会通知所有其他按钮(和它本身)。接收通知的按钮将执行oneLargeButtonTapped方法。在这个方法中,你应该放置动画的代码。 **不要忘记从通知中取消注册,否则可能导致崩溃和/或内存泄漏。** –

相关问题