恐怕在 Mac 上的 IB 中无法做到这一点,因为在 iOS 上是可能的:
UIKit 和 AppKit——尽管在许多方面相似——是两个截然不同的野兽。AppKit 的传统可以追溯到 1990 年代(甚至可能是 1980 年代后期),这在一些地方(我在看着你,NSCell)表现出来,而 UIKit 的设计有着大约 20 年的经验应用程序套件。
虽然你可以很容易地告诉一个UIControl
它的动作何时被调用(并且可以对不同的事件有不同的动作),但NSControl
只允许你指定一个要发送的动作。
如果您不想覆盖-[NSButtonCell stopTracking:at:inView:mouseIsUp:]
or-[NSButton mouseDown:]
和-[NSButton mouseUp:]
,您可以实现您想要的最简单的方法应该是设置按钮以连续发送其操作。这可以是 IB 中的骨骼(在“控制”类别下的“属性”检查器中)。
接下来的事情是让您的描述层支持并以如下方式重写您的操作方法:
- (IBAction)toggleIt:(id)sender {
CALayer *descriptionLayer = [myDescription layer];
[descriptionLayer setHidden:NO]; // (ab-)use implicit animation
[descriptionlayer performSelector:@selector(setHidden:) withObject:@"" afterDelay:.1];
}
这个怎么运作:
CALayer 的“隐藏”属性是可动画的,因此,更改它会导致隐式动画。由于Objective C只是C,任何不是0x0
的都被解释为YES
第三行的地方:空字符串显然不是0x0
在此操作返回后不久,该层将被调用隐藏。但是由于 CATransitions 是逐渐发生的并且可以在中途更新,这只会在不再触发动作时影响图层的可见性——即不再按下按钮。