Я создаю пользовательский NSButtonCell
для персонализированного рендеринга.
Теперь я хочу иметь разные аспекты, если мышь над кнопкой или нет. Как я могу получить эту информацию?
Спасибо и приветствую,
Я создаю пользовательский NSButtonCell
для персонализированного рендеринга.
Теперь я хочу иметь разные аспекты, если мышь над кнопкой или нет. Как я могу получить эту информацию?
Спасибо и приветствую,
Вот я создал и работал у меня отлично...
Шаг 1: Создайте кнопку с областью отслеживания
NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(100, 7, 100, 50)];
[myButton setTitle:@"sample"];
[self.window.contentView addSubview:myButton];
// Insert code here to initialize your application
NSTrackingArea* trackingArea = [[NSTrackingArea alloc]
initWithRect:[myButton bounds]
options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
owner:self userInfo:nil];
[myButton addTrackingArea:trackingArea];
Шаг: 2 Внедрите следующие методы
- (void)mouseEntered:(NSEvent *)theEvent{
NSLog(@"entered");
[[myButton cell] setBackgroundColor:[NSColor blueColor]];
}
- (void)mouseExited:(NSEvent *)theEvent{
[[myButton cell] setBackgroundColor:[NSColor redColor]];
NSLog(@"exited");
}
Вам нужно подклассифицировать класс NSButton (или даже лучше класс NSButtonCell). Как сказал Джастин, если вы поместите два метода
- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
Они должны вызываться, когда мышь входит и выходит из области. Вам также может потребоваться создать зону отслеживания, посмотрите здесь:
- (void)updateTrackingAreas
Для эффекта затухания и выцветания я играл с аниматором и альфа-значением, например:
[self animator]setAlphaValue:0.5];
Swift 3:
Создайте кнопку с кодом или просто используйте имя кнопки, которое вы установили в Storyboard. Затем определите зону отслеживания кнопок для мыши (hover):
let area = NSTrackingArea.init(rect: yourButtonName.bounds, options: [.mouseEnteredAndExited, .activeAlways], owner: self, userInfo: nil)
yourButtonName.addTrackingArea(area)
Затем переопределите mouseEntered и mouseExited, установите все, что вы хотите изменить (цвет кнопки, изображение кнопки, текст кнопки,..) в следующих функциях:
override func mouseEntered(with event: NSEvent) {
print("Entered: \(event)")
}
override func mouseExited(with event: NSEvent) {
print("Exited: \(event)")
}
Если у вас есть несколько кнопок (с добавленной областью отслеживания для каждого), и вам нужно определить, какая кнопка вызвала событие mouseEntered, вы можете добавить некоторую информацию пользовательской информации для этой цели, поэтому вместо:
userInfo: nil
Добавьте свое пользовательское имя кнопки в userInfo для каждой кнопки, например:
userInfo: ["btnName": "yourButtonName"]
Затем вы можете написать оператор switch-case или if в ваших mouseEntered и mouseExited, например:
override func mouseEntered(with event: NSEvent) {
// Identify which button triggered the mouseEntered event
if let buttonName = event.trackingArea?.userInfo?.values.first as? String {
switch (buttonName) {
case "yourButtonName":
//do whatever you want for this button..
case "anotherButtonName":
//do whatever you want for this button..
default:
print("The given button name: \"\(buttonName)\" is unknown!")
}
}
}
хорошая стартовая точка, объявленная в NSResponder:
- (void)mouseEntered:(NSEvent *)theEvent;
- (void)mouseExited:(NSEvent *)theEvent;
в частности, контейнер ячейки кнопки (а не сама ячейка) является NSRsponder.