Почему для свойства UIButton exclusiveTouch по умолчанию установлено значение YES? - PullRequest
8 голосов
/ 28 июня 2011

Я уверен, что есть много причин, по которым кто-то хотел бы, чтобы более чем одна кнопка принимала касания одновременно.Однако большинству из нас требуется только одна кнопка для одновременного нажатия (для навигации, для того, чтобы что-то было представлено модально, для представления всплывающего окна, представления и т.exclusiveTouch свойство UIButton в NO по умолчанию?

Ответы [ 4 ]

8 голосов
/ 06 марта 2014

Очень старый вопрос, но заслуживает уточнения ИМО.

Несмотря на очень вводящую в заблуждение документацию по методу от Apple , представление "A" с набором exclusiveTouch будет препятствовать другим событиям получать события , пока A обрабатывает какое-то само событие (например, установлено кнопку с exclusiveTouch и поместите на нее палец, это предотвратит взаимодействие с другими представлениями в окне, но взаимодействие с ними будет происходить по обычной схеме после удаления пальца из элемента exlusiveTouch).

Другим эффектом является предотвращение получения события представлением A, если с каким-либо другим представлением взаимодействуют (удерживайте нажатой кнопку без установленного набора exclusiveTouch, и те, у кого исключительный Touch не будет также получать события).

Вы по-прежнему можете установить кнопку в своем представлении для exclusiveTouch и взаимодействовать с другими, но не одновременно, как докажет этот простой тест UIViewController (как только правильные привязки в IB будут установлены как для Outlets, так и для Actions) :

#import "FTSViewController.h"

@interface FTSViewController ()
- (IBAction)button1up:(id)sender;
- (IBAction)button2up:(id)sender;
- (IBAction)button1down:(id)sender;
- (IBAction)button2down:(id)sender;

@property (nonatomic, strong) IBOutlet UIButton *button1, *button2;
@end

@implementation FTSViewController

- (IBAction)button1up:(id)sender {
    NSLog(@"Button1 up");
}

- (IBAction)button2up:(id)sender {
    NSLog(@"Button2 up");
}

- (IBAction)button1down:(id)sender {
    NSLog(@"Button1 down");
}

- (IBAction)button2down:(id)sender {
    NSLog(@"Button2 down");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Guarantees that button 1 will not receive events *unless* it's the only receiver, as well as
    // preventing other views in the hierarchy from receiving touches *as long as button1 is receiving events*
    // IT DOESN'T PREVENT button2 from being pressed as long as no event is being intercepted by button1!!!
    self.button1.exclusiveTouch = YES;
    // This is the default. Set for clarity only
    self.button2.exclusiveTouch = NO;
}
@end

В свете этого единственная веская причина, по которой IMHO для Apple не устанавливать для параметра exclusiveTouch значение YES для каждого подкласса UIView, заключается в том, что это сделало бы реализацию сложных жестов настоящей PITA, включая, возможно, некоторые из жестов, к которым мы уже привыкли в составных подклассах UIView (например, UIWebView), поскольку установка выбранных представлений на exclusiveTouch = NO (кнопка «Мне нравится») быстрее, чем выполнение рекурсивного exclusiveTouch = YES практически для всего, только для включения мультитача.

Недостатком этого является то, что во многих случаях противоречащее интуитивному поведению UIButtons и UITableViewCells (среди прочего ...) может привести к странным ошибкам и сделать тестирование более сложным (как это случилось со мной, как ... 10 минут назад? :().

Надеюсь, это поможет

0 голосов
/ 28 июня 2011

exclusiveTouch просто означает, что любой вид под вашей UIButton не получит сенсорные события.

По умолчанию установлено значение no, потому что вы обычно хотите, чтобы представление внизу получало эти события. Например, если у вас есть UIButton поверх представления прокрутки, и пользователь хочет прокрутить. Вы хотите, чтобы scrollView осуществлял прокрутку, даже если они начинаются с нажатия пальцем на кнопку UIB.

0 голосов
/ 28 июня 2011

Я только что читал заметки о выпуске для iOS 5, и с этой версии exclusiveTouch будет установлен в YES по умолчанию. Так что просто помните, что это изменится с новой версией iOS.

0 голосов
/ 28 июня 2011

свойство UIView exclusiveTouch означает, что представление (кнопка) является ЕДИНСТВЕННОЙ вещью в этом окне, с которой можно взаимодействовать, если для нее установлено значение YES.Как указано в документе: Установка этого свойства в YES приводит к тому, что получатель блокирует доставку событий касания другим представлениям в том же окне.Значением по умолчанию для этого свойства является NO.

. Таким образом, это обычное поведение, когда у вас может быть несколько кнопок или элементов управления / видов взаимодействия в окне, и вы хотите, чтобы exclusiveTouch было установлено на NO.

Если вы установите это свойство на YES для любого подкласса UIView в окне, вы не сможете взаимодействовать с чем-либо еще в окне, пока это свойство установлено на YES.Это означает, что если вы инициализируете кнопку с помощью exclusiveTouch = YES, но у вас также есть табличное представление или другая кнопка, или представление с прокруткой, или любое другое представление, основанное на взаимодействии, оно не будет реагировать на любые касания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...