我正在制作一个半钢琴应用程序,它具有不同的键盘布局,然后是常用的。
我用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。
到这里很容易, 但是当我尝试多点触摸时,我只能滑动其中一个触摸,其他的必须保持在同一位置。
更重要的是,如果我拿走其中一根手指,所有手指都会变得不突出显示, 我知道所有这些的原因,但我不知道如何解决它并让它发挥作用。
答案 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;
检测用户当前是否正在触摸钢琴键。 即使有多次触摸,它也能很好地工作。