Выделение подкласса UIControl


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

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

С beginTrackingWithTouch и endTrackingWithTouch я не могу распознать только событие UIControlEventTouchUpInside.

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

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

Спасибо: (

Ответы

Ответ 1

Я думаю, что 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;
}

Ответ 2

В интересах поддержания этого ответа в актуальном состоянии, это Swift версия (ответа Costique).

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

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

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

Ответ 3

Чтобы выделить субстраты 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 subviews. В методе setHighlighted: вы можете изменить цвет текста и оттенков темным цветом:

- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    UIColor *tintColor = highlighted ? [UIColor zst_darkerBlueColor] : [UIColor zst_blueColor];
    self.tintColor = tintColor;
    self.titleLabel.textColor = tintColor;
}