每个 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的主要内容,如果未能解决你的问题,请参考以下文章
绘制两个形状的共同轮廓,每个形状在不同的 UIView - ObjC
UISlider 约束以编程方式:“约束项必须每个都是 UIView 或子类的实例”
动画 UIView setFrame 在每个动画帧上强制 drawRect