Неполадки касания в приложении для фортепиано с помощью кнопок 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;
определить, касается ли пользователь в данный момент клавиши пианино. Это работает очень хорошо, даже с несколькими касаниями.