3

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

我用 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:我刚刚使用了相同的语法而没有 else,突出显示的变为 NO。

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

更重要的是,如果我拿开其中一根手指,所有手指都会变得不突出,我知道所有这些的原因,但我不知道如何修复它并使其正常工作。

4

4 回答 4

2

我可能会完全放弃 UIButtons 并实现我自己的自定义触摸跟踪代码。请参阅文档中的处理多点触控事件。即,您将实施以下方法:

- (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 中使用图像、标题等设置视图,但在您的自定义子类中执行所有触摸跟踪。

于 2011-11-25T17:02:07.243 回答
0

恐怕本斯奈德是对的。但我会通过 GestureRecognizer 实现它:

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

非常有用,在需要开发帐户的Apple Developer Video Archive登录时:

  • WWDC2010:第 120 场会议 — 使用手势识别器简化触摸事件处理
  • WWDC2010: Session 121 — 高级手势识别
于 2011-11-25T17:12:21.157 回答
0

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

于 2011-11-25T18:07:59.793 回答
0

这是我制作的开源 iOS 钢琴应用程序的链接https://github.com/meech-ward/iOSPiano

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

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

于 2014-12-10T00:22:31.137 回答