Неполадки касания в приложении для фортепиано с помощью кнопок UIB - PullRequest
3 голосов
/ 25 ноября 2011

Я работаю над приложением для полупиано с другой раскладкой клавиатуры, чем обычно.

Я создал вид вручную с помощью кнопок UIB, моя проблема была в том, что я не знал, как скользитьиз 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: я только что использовал тот же синтакс без остального, и выделенный стал НЕТ.

Наверхздесь легко, но потом, когда я пытаюсь сделать мультитач, я могу скользить только одним касанием, а остальные должны оставаться в том же положении.

И даже больше, если я беру одинвсе пальцы становятся не подсвеченными, я знаюпричины всего этого, но я не знаю, как это исправить и заставить его работать.

Ответы [ 4 ]

2 голосов
/ 25 ноября 2011

Я бы, вероятно, вообще отошел от кнопок UIB и внедрил бы свой собственный код отслеживания касания.См. Обработка событий с несколькими касаниями в документации.А именно, вы будете реализовывать следующие методы:

- (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 с изображениями, заголовками и т. Д., Но все отслеживание касаний будет выполнено в вашем подклассе.

0 голосов
/ 10 декабря 2014

Вот ссылка на приложение пианино с открытым исходным кодом, которое я сделал https://github.com/meech-ward/iOSPiano

Я использовал CALayers для клавиш пианино и использовал - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

, чтобы определить, является ли пользователь в данный моменткасаясь клавиши пианино.Он работает очень хорошо, даже с несколькими касаниями.

0 голосов
/ 25 ноября 2011

Я бы использовал один вид для всех кнопок и вручную реализовал бы сенсорное отслеживание, как сказал Бенснидер. Вручную рисование фонов / названий также не так сложно.

0 голосов
/ 25 ноября 2011

Боюсь, Бенснидер прав.Но я бы реализовал это через GestureRecognizer:

Каждый ключ имеет один TapRecognizer, в то время как родительское представление имеетSwipeRecognizer для обнаружения слайдов, образующих один ключ к другому.

Очень полезно при Видеоархив Apple Developer требуется вход в систему с учетной записью разработчика :

  • WWDC2010: Сессия 120 - Упрощение обработки сенсорных событий с помощью устройств распознавания жестов
  • WWDC2010: Сессия 121 - Расширенное распознавание жестов
...