iOS UIButton - Разница между UIButton setUserInteractionEnabled и setEnabled

Подождите!!!:
Я знаю, что вы можете подумать, что на этот вопрос задавали и отвечали несколько раз раньше. Но я могу гарантировать вам, что этот вопрос уникален.

Вопрос:
В приложении для iOS просто представьте, что есть две кнопки, как показано на рисунке ниже, и у них есть два действия, которые ведут себя как переключающая логика.

введите описание изображения здесь

И это логика может быть следующим:

- (IBAction)testBtnClicked:(id)sender {
    if ([self.testBtn isEnabled]) {
        [self.testBtn setEnabled:NO];
        [self.setInteractionBtn setUserInteractionEnabled:YES];
    } else {
        [self.testBtn setEnabled:YES];
        [self.setInteractionBtn setUserInteractionEnabled:NO];
    }
}

- (IBAction)setInteractionBtnClicked:(id)sender {
    if ([self.setInteractionBtn isEnabled]) {
        [self.setInteractionBtn setUserInteractionEnabled:NO];
        [self.testBtn setEnabled:YES];
    } else {
        [self.setInteractionBtn setUserInteractionEnabled:YES];
        [self.testBtn setEnabled:NO];
    }
}

Так что я не вижу большой разницы между setEnabled метод и setUserInteractionEnabled метод. Они же ведут себя как единый метод, который блокирует пользователя, не позволяя использовать его. Однако, если это так же, как мы могли бы обнаружить isEnabledtrue или же false даже когда setUserInteractionEnabled установлено быть False?

Ниже приведены причины, по которым этот вопрос не является возможной копией другой темы вопросов и ответов в SO:

  • Даже если какой-то высокопоставленный код, возможно, пометил мой вопрос как возможный дубликат, этот вопрос и ответ не дали мне правильного понимания.
  • Как сказал @danh,

    По крайней мере, одна из причин заключается в том, что во время анимации взаимодействие с пользователем на UIViews отключено. Было бы неправильно, чтобы элементы управления рисовали себя серыми, пока они анимированы. Так что, по крайней мере, во время анимации два свойства имеют разные значения. Дали мне реальный ответ или причину, чтобы увидеть, что эти два метода по двум причинам. Потому что любой может сказать, что setUserInteractionEnabled не вносит изменений в состояние пользовательского интерфейса, но, по крайней мере, только в ответе @ danh сначала было указано, что оно может быть неявно использовано во время анимации пользовательского интерфейса.

3 ответа

Решение

Они почти одинаковы. userInteractionEnabled является собственностью UIView это переключает, получает ли представление какие-либо пользовательские прикосновения. enabled является собственностью UIControl (который является подклассом UIView и суперкласс UIButton) и имеет тот же эффект. Одно отличие состоит в том, что элементы управления UIKit могут рисовать себя по-разному в зависимости от их enabled состояние, которое не имеет место для абстрактного UIView,

Хорошо, тогда почему?

поскольку UIControl подклассы наследуют оба, почему есть два почти одинаковых свойства? Почему бы элементам управления не отбросить идею "включенного" и нарисовать себя по-разному в зависимости от их userInteractionEnabled государство?

По крайней мере, одна из причин заключается в том, что во время анимации взаимодействие с пользователем отключено UIViews. Было бы неправильно, чтобы элементы управления рисовали себя серыми, пока они анимированы. Так что, по крайней мере, во время анимации два свойства имеют разные значения.

Характеристики включены:

  • Это свойство UIControl
  • Суперкласс для UIButton,
  • Он влияет на визуальное состояние объекта и, как правило, является предпочтительным методом отключения элемента управления.

Характеристики userInteractionEnabled:

  • Свойство UIView
  • Код, который взаимодействует с вашими элементами управления, с большей вероятностью проверяет, являются ли кнопки enabled чем если бы их userInteractionEnabled свойство установлено. Это более условно.
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled

Логическое значение, которое определяет, будут ли пользовательские события игнорироваться и удаляться из очереди событий. Если установлено значение NO, пользовательские события, такие как касание и клавиатура, предназначенные для просмотра, игнорируются и удаляются из очереди событий. Если установлено значение YES, события доставляются в представление в обычном режиме. Значением по умолчанию для этого свойства является YES.

Обсуждение:

Во время анимации пользовательские взаимодействия временно отключаются для всех представлений, участвующих в анимации, независимо от значения в этом свойстве. Вы можете отключить это поведение, указав опцию UIViewAnimationOptionAllowUserInteraction при настройке анимации.

Apple Doc на UIView

@property(nonatomic, getter=isEnabled) BOOL enabled

Логическое значение, определяющее, включен ли приемник.

Обсуждение:

Укажите ДА, чтобы включить контроль; в противном случае укажите NO, чтобы отключить его. Значением по умолчанию является ДА. Если включено состояние НЕТ, элемент управления игнорирует сенсорные события, и подклассы могут рисовать по-разному.

Для справки:

  1. Apple Doc на UIControl
  2. SO Q & A

Как @danh утверждает:

"По крайней мере, одна из причин заключается в том, что во время анимации взаимодействие с пользователем на UIViews отключено. Было бы неправильно, чтобы элементы управления отображали себя серыми, пока они анимированы. Поэтому, по крайней мере, во время анимации, два свойства имеют разные значения".

Другие вопросы по тегам