ExclusiveTouch per UIView - PullRequest
       24

ExclusiveTouch per UIView

0 голосов
/ 02 апреля 2012

У меня есть два UIViews, заполненные UIButton. Я хочу, чтобы только одна кнопка принимала касания за раз. То есть я хочу, чтобы мультитач работал, если у вас есть один палец в каждой группе кнопок, но нет, если у вас есть оба пальца в одной группе.

Конечно, набор exclusiveTouch на кнопках гарантирует, что нажата только одна кнопка за раз, но он делает это для всего окна. Есть ли способ разрешить только одно касание для UIView вместо всего окна?

Обновление: Таким образом, чтобы лучше понять желаемую функцию. Я хочу, чтобы пользователь мог выбрать красную и синюю карту, используя мультитач. Легко. НО я не хочу, чтобы они могли выбирать две красные карточки или что-то подобное. Проблема в том, что, если я включаю на карточках exclusiveTouch, за раз можно выбрать только одну карту из ВСЕГО ОКНА. Желаемая функциональность заключается в том, чтобы эксклюзивный Touch работал только на UIVIEW, каждый набор карт которого уже обернут в свой собственный UIView.

Обновление 2: Просто хочу добавить, что я пытаюсь найти решение, которое НЕ включает в себя создание подклассов или иное переопределение сенсорных контроллеров UIView. Это последнее средство.

Here is an image

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012

При касании одной из ваших кнопок вы можете установить userInteractionEnabled свойство другой кнопки на NO и установить обратно на YES при касании.

ОБНОВЛЕНИЕ 1

Извините, я был идиотом.

ОБНОВЛЕНИЕ 2

...

ОБНОВЛЕНИЕ 3

Наконец-то я вернулся в XCode. Этот код работает (если я правильно понял вашу цель):

@interface ViewController : UIViewController {
    NSMutableArray *leftButtonsArray;
    NSMutableArray *rightButtonsArray;
}

@end

//

@implementation ViewController

#pragma mark - Objects Processing

- (void)buttonDownAct:(UIButton *)sender {
    sender.backgroundColor = [UIColor greenColor];

    NSArray *targetArray = nil;
    if ([leftButtonsArray indexOfObject:sender] == NSNotFound)
        targetArray = rightButtonsArray;
    else
        targetArray = leftButtonsArray;

    for (UIButton *button in targetArray)
        if (button != sender)
            button.userInteractionEnabled = NO;
}
- (void)buttonUpAct:(UIButton *)sender {
    NSArray *targetArray = nil;
    if ([leftButtonsArray indexOfObject:sender] == NSNotFound) {
        targetArray = rightButtonsArray;
        sender.backgroundColor = [UIColor blueColor];
    }
    else {
        targetArray = leftButtonsArray;
        sender.backgroundColor = [UIColor redColor];
    }

    for (UIButton *button in targetArray)
        button.userInteractionEnabled = YES;
}

#pragma mark - View lifecycle

- (void)loadView {
    leftButtonsArray = [[NSMutableArray alloc] init];
    rightButtonsArray = [[NSMutableArray alloc] init];

    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    self.view.backgroundColor = [UIColor whiteColor];
    float desiredWidth = self.view.frame.size.width / 4, desiredHeight = self.view.frame.size.height / 2;

    for (int i = 0; i < 4; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectInset(CGRectMake(desiredWidth * (i % 2), desiredHeight * (i / 2), desiredWidth, desiredHeight), 10, 10);
        [button setBackgroundColor:[UIColor redColor]];
        [button addTarget:self action:@selector(buttonDownAct:) forControlEvents:UIControlEventTouchDown];
        [button addTarget:self action:@selector(buttonUpAct:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];

        [self.view addSubview:button];
        [leftButtonsArray addObject:button];
    }

    for (int i = 0; i < 4; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectInset(CGRectOffset(CGRectMake(desiredWidth * (i % 2), desiredHeight * (i / 2), desiredWidth, desiredHeight), self.view.frame.size.width / 2, 0), 10, 10);
        [button setBackgroundColor:[UIColor blueColor]];
        [button addTarget:self action:@selector(buttonDownAct:) forControlEvents:UIControlEventTouchDown];
        [button addTarget:self action:@selector(buttonUpAct:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchUpOutside];

        [self.view addSubview:button];
        [rightButtonsArray addObject:button];
    }
}

@end
0 голосов
/ 04 апреля 2012

Не пробовал, но все равно. Можете ли вы сделать два UIView на главном экране, один для красных кнопок и один для синих. И установить эксклюзивные прикосновения для ваших кнопок?

...