Боюсь, в IB нет возможности сделать это на Mac, как это было бы возможно на iOS:
UIKit и AppKit - хотя во многих отношениях похожи - два совершенно разных зверя.В то время как AppKit имеет наследие, уходящее далеко в 1990-е годы (возможно, даже в конце 1980-х), которое просвечивает в нескольких точках (я смотрю на вас, NSCell), UIKit был разработан с опытом работы около 20 лет.AppKit.
И хотя вы легко можете сообщить UIControl
, когда его действие будет вызвано (и может иметь разные действия для разных событий), NSControl
просто позволяет вам указать одно отдельное действие, которое будетотправлено.
Если вы не хотите переопределять -[NSButtonCell stopTracking:at:inView:mouseIsUp:]
или -[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
, так что вскоре после того, как это действие вернулось, слой будетпризван скрыть.Но поскольку переходы CAT происходят постепенно и могут обновляться в середине курса, это повлияет на видимость слоя только тогда, когда действие больше не запускается, т. Е. Кнопка больше не нажимается.