Активация кода на кнопку Нажмите и удерживайте ТОЛЬКО - PullRequest
0 голосов
/ 03 марта 2011

Я пытаюсь активировать часть моего кода только после нажатия (и удержания) кнопки. Когда кнопка отпущена, я хочу, чтобы мой ярлык снова стал невидимым. Есть ли способ сделать это эффективно? У меня есть IBAction (кнопка) и IBOutlet (текстовое поле) с этим кодом для действия:

- (IBAction)toggleIt:(id)sender {
    if ([myDescription isHidden]) {
        [myDescription setHidden:NO];
    } else {
        [myDescription setHidden:YES];
    }
}

Любая помощь? (В фиктивных терминах)

Zach

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Боюсь, в 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 происходят постепенно и могут обновляться в середине курса, это повлияет на видимость слоя только тогда, когда действие больше не запускается, т. Е. Кнопка больше не нажимается.

0 голосов
/ 03 марта 2011

Вы можете использовать UIControlEventTouchDown, чтобы скрыть свой ярлык, а затем показать его на событии UIControlEventTouchUpInside.

-(IBAction)buttonHit {
    [myDescription setHidden:NO];
}

-(IBAction)buttonReleased {
    [myDescription setHidden:YES];
}
...