2010-12-13 2 views
16


в основном мне нужна кнопка изображения, в частности пользовательского объект, который:
1) вызывает действие контроллера, когда постучал
2) инкапсулирует пользовательские данные
3) автоматически перемещаются по мнению обертки (не имеет значения)Подчеркивая подкласс UIControl

Ну, я все это подкласс UIControl (с подклассов UIButton не рекомендуется и подклассов UIImageView затрудняет управление пункт 1). Но теперь, как правильно выделить его? Я хотел бы выделить элемент управления при любом нажатии (даже простое мгновенное уменьшение альфы).

С beginTrackingWithTouch и endTrackingWithTouch Я не могу признать единственное событие UIControlEventTouchUpInside.

Просмотр анимации в контроллере? Мне кажется грубым решением

Есть ли простое и немедленное решение?

Спасибо :(

ответ

35

Я думаю UIControls автоматически правильно установить их свойства выделенной исключительно на основе сенсорных событий Что вам нужно переопределить -setHighlighted: метод для реализации конкретного алгоритма:.

- (void) setHighlighted: (BOOL) highlighted { 
    [super setHighlighted: highlighted]; 
    // Only as an example. Caution: looks like a disabled control 
    self.alpha = highlighted ? 0.5f : 1.0f; 
} 
+4

Если у вас есть какие-либо подвиды, не забудьте установить mySubview.userInteractionEnabled = NO (в противном случае кран не будет зарегистрирован и нет подсветка будет активирована). –

12

В проценты, связанные с поддержанием этого ответа на современном уровне, вот Swift версия (ответа Костика).

override var highlighted: Bool { 
    didSet { 
     alpha = highlighted ? 0.6 : 1.0 // Sets alpha to 0.6 if highlighted, or 1.0 if it's not. 
    } 
} 

Вам также может понравиться постепенное уменьшение яркости UIControl. Чтобы сделать это, просто поместите назначение альфа в анимации блоке, как этот

override var highlighted: Bool { 
    didSet { 
     UIView.animateWithDuration(0.25) { _ in 
      self.alpha = self.highlighted ? 0.6 : 1.0 
     } 
    } 
} 
+0

Я обнаружил, что использование 'didSet', вызванное касаниями, задерживается. 'set (выделено) {' работал лучше - но только если бы я не называл супер – Sam

0

Чтобы выделить подвиды из UIControl правильно, вы можете использовать пользовательский оттенок цвета. Чтобы включить это, где-то в init методов или awakeFromNib вы должны изменить изображение режим рендеринга в always template:

self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
self.backgroundImageView.image = [self.backgroundImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
self.tintColor = [UIColor zst_blueColor]; // Use custom instead of system-defined color 

Таким образом, вместо изменения alpha значение можно изменить оттенок цвета, и он будет автоматически изменять свои UIImageView подвидов. В методе setHighlighted: вы можете изменить текст и оттенок цвета на более темный цвет:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    [super setHighlighted:highlighted]; 
    UIColor *tintColor = highlighted ? [UIColor zst_darkerBlueColor] : [UIColor zst_blueColor]; 
    self.tintColor = tintColor; 
    self.titleLabel.textColor = tintColor; 
} 
Смежные вопросы