Неполадки касания в приложении для фортепиано с помощью кнопок UIB

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

Я создал вид вручную с помощью кнопок 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 ответа

Решение

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

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

Требуется очень полезный логин с учетной записью разработчика:

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

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

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

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

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

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

Другие вопросы по тегам