Выделение подкласса UIControl - PullRequest
17 голосов
/ 13 декабря 2010


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

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

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

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

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

Спасибо: (

Ответы [ 3 ]

36 голосов
/ 13 декабря 2010

Я думаю, что 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;
}
16 голосов
/ 22 сентября 2015

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

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

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

override var isHighlighted: Bool {
    didSet {
        UIView.animate(withDuration: 0.25) {
            self.alpha = self.isHighlighted ? 0.6 : 1.0
        }
    }
}
0 голосов
/ 20 июня 2016

Чтобы правильно выделить подпредставления 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;
}
...