每个 UIView 的 ExclusiveTouch

Posted

技术标签:

【中文标题】每个 UIView 的 ExclusiveTouch【英文标题】:ExclusiveTouch per UIView 【发布时间】:2012-04-02 19:48:08 【问题描述】:

我有两个 UIViews 填充了 UIButtons。我只想允许一个按钮一次接受每个 UIView 的触摸。也就是说,如果您在每组按钮中有一个手指,但如果您的两个手指在同一组中,我希望多点触控工作。

当然,在按钮上设置的 ExclusiveTouch 可确保一次只触摸一个按钮,但它会在整个窗口中进行。有没有办法让每个 UIView 只允许一次触摸而不是整个窗口?

更新:这样可以更好地理解所需的功能。我希望用户能够使用多点触控选择红色和蓝色卡片。简单的。但我不希望他们能够选择两张红牌或类似的东西。问题是如果我在卡片上打开 ExclusiveTouch,一次只能选择整个窗口中的一张卡片。所需的功能是让 ExclusiveTouch 仅操作 PER UIVIEW,每组卡片已经包装在自己的 UIView 中。

更新 2: 只是想说明一下,我正在尝试找到一个不涉及子类化或以其他方式覆盖 UIView 的触摸控制器的解决方案。这是最后的手段。

【问题讨论】:

【参考方案1】:

当你触摸一个按钮时,你可以将另一个按钮的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

【讨论】:

我不能同时按下并抓住按钮吗?我已经禁用了修饰按钮,但如果我同时松手,它仍然允许选择器同时触发。 好吧,我真的不明白,你到底想要什么。您可以发布一些代码和(理想的)屏幕截图吗? 我刚刚验证过。禁用触地时的所有按钮不会阻止同时触摸。因此,如果我触摸一个,那么另一个是的,这是可行的。但如果我两次触摸的时间完全相同,我仍然选择两个按钮。我会用截图更新我的问题。 是的,恐怕这行不通。我尝试了类似的东西,我只是尝试了您的确切代码。同时接触仍然难倒它。如果您在完全相同的时间触地并在完全相同的时间触地,您最终仍然会触发两次 touchDown 和 TouchUp 方法。 嗯,这几乎可以工作了。夫妇的事情。如果你拖掉一个按钮,那么 touchUp 就不会被调用。这意味着按钮现在被永久禁用。其次,如果你同时点击没有按钮被选中,我猜是因为两个按钮都被另一个 lol 禁用了。这两个问题都会导致触摸时感觉非常不自然。【参考方案2】:

没有尝试过,但无论如何。 您可以在主视图上制作两个 UIView,一个用于红色按钮,一个用于蓝色按钮。并为您的按钮设置专属触控?

【讨论】:

这就是我开始做的事情。独占触摸总是指窗口而不是父视图。

以上是关于每个 UIView 的 ExclusiveTouch的主要内容,如果未能解决你的问题,请参考以下文章

每个被点击的链接的 Xcode UIView

绘制两个形状的共同轮廓,每个形状在不同的 UIView - ObjC

UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”

动画 UIView setFrame 在每个动画帧上强制 drawRect

链式 UIView 动画,每个动画都包含循环内的完成块 [重复]

在 iOS 中,每个 UIView 都应该有一个 UIViewController 吗?