Отключить прокрутку стилусом на iPad

Я пытаюсь отменить прокрутку в UIScrollView, если она исходит от стилуса (Apple Pencil).

Любой совет?


person Heysem Katibi    schedule 22.04.2017    source источник


Ответы (2)


Вы можете установить свойство allowedTouchTypes в UIGestureRecognizer.

Например:

scrollView.panGestureRecognizer.allowedTouchTypes = [UITouchType.direct.rawValue as NSNumber]
person FriedPotato    schedule 24.04.2017

Вы можете узнать, является ли касание стилусом или пальцем, используя тип UITouch.

if (touch.type == UITouchTypeStylus) {
     //its touch from Stylus.
}

Теперь для прокрутки вы можете создать подкласс UIScrollview и реализовать метод TouchBegan.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch *touch = [[event allTouches] anyObject];
    if (touch.type == UITouchTypeStylus) {
       self.scrollEnabled = NO;
     }
    else
    {
       self.scrollEnabled = YES;
    }
    [super touchesBegan:touches withEvent:event];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [[event allTouches] anyObject];
    if (touch.type == UITouchTypeStylus) {
      self.scrollEnabled = NO;
    }
    else
   {
      self.scrollEnabled = YES;
   }
   [super touchesMoved:touches withEvent:event];

}

// редактор

Подкласс UIApplication:

 @interface MyUIApplication : UIApplication
  - (void)sendEvent:(UIEvent *)event {

        [super sendEvent:event];
        NSSet *allTouches = [event allTouches];
        if ([allTouches count] > 0) {

             / 
             UITouchPhase phase = ((UITouch *)[allTouches anyObject]).phase;
             if (phase == UITouchPhaseBegan){

                   UITouch *touch = [allTouches  anyObject];


                if (touch.type == UITouchTypeStylus) {


                   [[NSNotificationCenter defaultCenter] postNotificationName:@"DisableScroll"  object:self];
                 }
               else
                {

                   [[NSNotificationCenter defaultCenter] postNotificationName:@"EnableScroll"  object:self];
                 }
             }

        }
    }
    @end




int main(int argc, char *argv[])
    {
          @autoreleasepool {
                return UIApplicationMain(argc, argv, NSStringFromClass([MyUIApplication class]), NSStringFromClass([AppDelegate class]));
          }
    }

Добавьте наблюдателя для этих уведомлений в классе, содержащем представление прокрутки, и соответственно включите/отключите прокрутку.

person PlusInfosys    schedule 22.04.2017
comment
Я уже пробовал это, но по какой-то причине touchesBegan запускается после запуска прокрутки, поэтому scrollEnabled применяется в следующий раз, когда я касаюсь. (В первый раз, когда я прокручиваю стилусом, прокрутка работает) - person Heysem Katibi; 22.04.2017
comment
эта функция scrollViewWillBeginDragging (существует в делегате UIScrollView) запускается раньше всего (даже до touchesBegan). Если есть какой-либо способ получить тип касания на данный момент, я думаю, что это должно сработать. - person Heysem Katibi; 22.04.2017
comment
В этом случае вы можете создать подкласс UIApplication и использовать метод sendEvent. Позвольте мне добавить больше деталей в ответ. - person PlusInfosys; 22.04.2017