2015-10-08 6 views
2

Я попал в странную проблему, я делаю расширение клавиатуры, в котором мне нужно нарисовать выделение клавиши при касании. Я с успехом могу это сделать, как ни странно для некоторых клавиш в левом верхнем углу специально клавиши Q и A, не нажимайте выделение каждый раз. В основном мой код выглядит следующим образом ..drawRect не вызывается каждый раз

  1. На touchbegan - Draw Highlight по телефону [keysLayer setNeedsDisplay];
  2. На touchEnd - Удалить Выделить еще раз позвонив [keysLayer setNeedsDisplay];

Так в основном, функция drawRect Безразлично» t вызывается каждый раз на этих конкретных ключах, все остальное отлично работает, даже вызывается setNeedsDisplay.

Итак, я ищу помощь, что может сбой drawRect Функция вызова, я хочу знать список причин.

Если кто-нибудь может мне помочь.

Update


Добавление кода

В SuperView где была добавлена ​​KeysLayer вид.

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesBegan:touches withEvent:event]; 

    keysLayer.drawHighlight=YES; 
    keysLayer.touchLocation=[touch locationInView:self]; 
    [keysLayer setNeedsDisplay]; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesEnded:touches withEvent:event]; 

    keysLayer.drawHighlight=NO; 
    [keysLayer setNeedsDisplay]; 
} 

Внутри KeysLayer UIView класс

- (void)setTouchLocation:(CGPoint)location{ 
    self.touchLocation=location; 

    bezierPathForHighlight=[self createHighLightPath];//Creating simple path based on touch location. 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(context); 

    if(!self.drawHighlight) 
     [bezierPathForHighlight removeAllPoints]; 

    [bezierPathForHighlight stroke]; 
    CGContextRestoreGState(context); 

} 

Update 2


Итак, я нашел эту проблему, ее происходит только в моем iPhone6 ​​ с iOS9. 0. Я подтверждаю это с помощью этого test application. Удивительно, что в этом тестовом приложении я обнаружил особую сенсорную область, где iOS не вызывает drawRect a iOS BUG?

См. Прикрепленное изображение ниже, в котором объясняется, где на самом деле это происходит. У нас проблема, без решения. Нужна помощь.

enter image description here

Спасибо.

+2

Укажите фактический код, который вы используете, иначе он вряд ли сможет узнать причину. –

+0

Вы пытались добавить как subview вместо вызова setNeedsDisplay –

+0

@ Mr.T Да, он добавлен как subview, в котором у меня есть все обычные клавиши клавиатуры, каждый ключ получает выделение совершенно на ощупь, только два отдельных ключа иногда не могут выделить aka не вызывающий drawRect. – iphonic

ответ

4

Проблема, скорее всего, связана с iOS 9 и далее. Я могу воспроизвести его и на других устройствах. Проблема, похоже, связана с распознавателем жестов UIWindow. Пока я проверял ваш (@iphonic) образец кода, я обнаружил, что если я коснусь и удерживаю секунду в этом конкретном месте, то drawRect получает вызов :). Мне показалось, что в этих местах есть delay in touches.

Так что я начал отладки прикосновений для разных мест и нашел _UISystemGestureGateGestureRecognizer, который является частным класса, имеющий разные свойств в этой области и то, что я сделал, я просто петельным через жест recognisers прикрепленных к UIWindow и установите delaysTouchesBegan свойство NO и все.

Проблема решена. На самом деле проблема не специфична для этой конкретной области, а в левом углу экрана может быть Apple. Хотя сейчас он работает нормально. Я продолжу свои наблюдения, но на данный момент это ваше рабочее исправление для вас.

Вот небольшой пример кода, который вам нужно добавить.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    for (UIGestureRecognizer *gesture in self.view.window.gestureRecognizers) { 
     gesture.delaysTouchesBegan = NO; 
    } 
} 

Добавьте этот код в UIViewController после того, как появился его вид.

+0

И это действительно работает! Отлично. – iphonic

+0

Спасенный мой чувак! Ты КОРОЛЬ! –

Смежные вопросы