Прокрутка двумя пальцами с помощью UIScrollView - PullRequest
42 голосов
/ 24 апреля 2009

У меня есть приложение, в котором мой основной вид принимает и touchesBegan, и touchesMoved, и, следовательно, принимает касания одним пальцем и перетаскивает. Я хочу реализовать UIScrollView, и он у меня работает, но он переопределяет перетаскивания, и поэтому мой contentView никогда не получает их. Я хотел бы реализовать UIScrollview, где перетаскивание двумя пальцами указывает на прокрутку, а событие перетаскивания одним пальцем передается в мое представление содержимого, поэтому оно работает нормально. Нужно ли создавать свой собственный подкласс UIScrollView?

Вот мой код из моего appDelegate, где я реализую UIScrollView.

@implementation MusicGridAppDelegate

@synthesize window;
@synthesize viewController;
@synthesize scrollView;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // Override point for customization after app launch    
    //[application setStatusBarHidden:YES animated:NO];
    //[window addSubview:viewController.view];

    scrollView.contentSize = CGSizeMake(720, 480);
    scrollView.showsHorizontalScrollIndicator = YES;
    scrollView.showsVerticalScrollIndicator = YES;
    scrollView.delegate = self;
    [scrollView addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [viewController release];
    [scrollView release];
    [window release];
    [super dealloc];
}

Ответы [ 14 ]

1 голос
/ 03 ноября 2009

Плохие новости: iPhone SDK 3.0 и выше, больше не касайтесь методов подклассов -touchesBegan: и - touchesEnded: **UIScrollview**. Вы можете использовать разные методы touchesShouldBegin и touchesShouldCancelInContentView.

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

В вашем подклассе UIScrollView переопределите метод hitTest следующим образом:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

  UIView *result = nil;
  for (UIView *child in self.subviews)
    if ([child pointInside:point withEvent:event])
      if ((result = [child hitTest:point withEvent:event]) != nil)
        break;

  return result;
}

Это передаст вам подкласс этого касания, однако вы не можете отменить касания до UIScrollView суперкласса.

0 голосов
/ 22 декабря 2017

Кенши ответ в Swift 4

for gestureRecognizer: UIGestureRecognizer in self.gestureRecognizers! {
    if (gestureRecognizer is UIPanGestureRecognizer) {
        let panGR = gestureRecognizer as? UIPanGestureRecognizer
        panGR?.minimumNumberOfTouches = 2
    }
}
0 голосов
/ 15 декабря 2011

Проверьте мое решение :

#import “JWTwoFingerScrollView.h”

@implementation JWTwoFingerScrollView

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];
    if (self) {
        for (UIGestureRecognizer* r in self.gestureRecognizers) {
            NSLog(@“%@”,[r class]);
            if ([r isKindOfClass:[UIPanGestureRecognizer class]]) {
                [((UIPanGestureRecognizer*)r) setMaximumNumberOfTouches:2];
                [((UIPanGestureRecognizer*)r) setMinimumNumberOfTouches:2];
            }
        }
    }
    return self;
}

-(void)firstTouchTimerFired:(NSTimer*)timer {
    [self setCanCancelContentTouches:NO];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self setCanCancelContentTouches:YES];
    if ([event allTouches].count == 1){
        touchesBeganTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(firstTouchTimerFired:) userInfo: nil repeats:NO];
        [touchesBeganTimer retain];
        [touchFilter touchesBegan:touches withEvent:event];
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [touchFilter touchesMoved:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@“ended %i”,[event allTouches].count);
    [touchFilter touchesEnded:touches withEvent:event];
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@“canceled %i”,[event allTouches].count);
    [touchFilter touchesCancelled:touches withEvent:event];
}

@end

Не задерживает первое касание и не останавливается, когда пользователь касается одного пальца после использования одного. Тем не менее, он позволяет отменить только что запущенное событие одним касанием, используя таймер.

0 голосов
/ 25 апреля 2009

Да, вам нужно создать подкласс UIScrollView и переопределить его методы - touchesBegan: и -touchesEnded:, чтобы передать касания "вверх". Это, вероятно, также будет включать в себя подкласс, имеющий переменную-член UIView, чтобы он знал, что он должен передать касания до.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...