半钢琴应用程序触摸UIButtons的麻烦

时间:2011-11-25 16:50:59

标签: iphone objective-c cocoa-touch touches piano

我正在制作一个半钢琴应用程序,它具有不同的键盘布局,然后是常用的。

我用UIButtons手动创建了视图, 我的问题是我不知道如何从UIButton滑到另一个, 我想通过addTarget选择withEvent,这让我可以访问这些内容。

现在,我添加了这样的目标后:

[C addTarget:self action:@selector(outsideOfKey: forEvent:) forControlEvents:UIControlEventTouchDragOutside|UIControlEventTouchDragInside];
[C addTarget:self action:@selector(keyGetsLeft: forEvent:) forControlEvents:UIControlEventTouchUpOutside | UIControlEventTouchUpInside];

(也适用于所有其他键),

我想让它们滑动,

outsideOfKey:forEvent:如下:

-(void) outsideOfKey:(id)sender forEvent:(UIEvent *)event
{    
    for(UITouch *t in [event allTouches])
    {

            CGPoint touchPoint = [t locationInView:window];
            if(CGRectContainsPoint(C.frame, touchPoint))
             {
                 C.highlighted = YES;
             }
            else{
                C.highlighted = NO;
            }

(完成所有其他键) 我可以从其他键中滑动,当我将它们放在keyGetsLeft:forEvent中时:我刚刚使用了相同的语法而没有其他,并且突出显示为NO。

到这里很容易, 但是当我尝试多点触摸时,我只能滑动其中一个触摸,其他的必须保持在同一位置。

更重要的是,如果我拿走其中一根手指,所有手指都会变得不突出显示, 我知道所有这些的原因,但我不知道如何解决它并让它发挥作用。

4 个答案:

答案 0 :(得分:2)

我可能会完全放弃UIButtons并实现我自己的自定义触摸跟踪代码。请参阅文档中的Handling Multitouch Events。也就是说,您将实现以下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

我可能只是实现了你可以在IB中设置的命中区域,可能还有一个自定义的UIView触摸覆盖(只有一个带有自定义子类的UIView)。这样您就可以在IB中使用图像,标题等设置视图,但可以在自定义子类中完成所有触摸跟踪。

答案 1 :(得分:0)

我担心,bensnider是对的。但我会通过GestureRecognizer实现它。

每个键都有一个TapRecognizer,而父视图有一个SwipeRecognizer来检测幻灯片从一个键到另一个键。

非常有用的登录需要开发帐户

答案 2 :(得分:0)

我会为所有按钮使用一个视图,并手动实现触摸跟踪,如bensnider所说。手动绘制背景/标题也不是那么困难。

答案 3 :(得分:0)

这是我创建https://github.com/meech-ward/iOSPiano

的开源iOS钢琴应用程序的链接

我使用CALayers作为钢琴键,我使用过 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

检测用户当前是否正在触摸钢琴键。 即使有多次触摸,它也能很好地工作。