Пользовательский "Swipeable" UIScrollView не работает должным образом на iPad - отлично работает на iPhone - PullRequest
0 голосов
/ 29 августа 2010

Я работаю над тем, чтобы приложение для iPhone было совместимо с iPad.Пользователь может нажать или провести пальцем по экрану, чтобы активировать определенные функции, и он отлично работает на моей версии iPhone.На странице есть UIScrollView, который я разделил на подклассы, чтобы сделать его «смахиваемым», то есть он передает все свои сенсорные функции своему суперпредставлению следующим образом:

 @implementation SwipeableScrollView

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

    [self.superview touchesBegan:touches withEvent:event];

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

    [self.superview touchesMoved:touches withEvent:event];
}

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

    [self.superview touchesEnded:touches withEvent:event];
} 

@end

Это отлично работает в версии для iPhone,пропуская оба касания и жесты, но на iPad я получаю следующее странное поведение:

  1. Касания правильно передаются в суперпредставление.
  2. Но жесты скольжения не передаются привсе.

Есть идеи, почему это будет работать на iPhone, но не на iPad?

Ответы [ 3 ]

0 голосов
/ 12 октября 2010

Проблема в том, что UIScrollView на iPad очень быстро отменяет прикосновения к контенту, даже если для canCancelContentTouches установлено значение NO. Также не помогает перезапись -touchesShouldCancelInContentView:. Подробнее здесь: текст ссылки

0 голосов
/ 25 июля 2012

вы можете сделать пользовательский uiscrollView и реализовать его делегат, чтобы вы могли делать то, что вы хотите с scrollview, он прекрасно работает со мной

 #import <UIKit/UIKit.h>
         @protocol ScrollingDelegate <NSObject>
         @required
        - (void)scrolltouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
        - (void)scrolltouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
        - (void)scrolltouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
         @end

Осуществление

 @interface CustomScrollView : UIScrollView
 {
  id <ScrollingDelegate> delegate;

  }
  @property (nonatomic,strong) id scrollDelegate;
  @end

   #import "CustomScrollView.h"

   @implementation CustomScrollView
   @synthesize scrollDelegate;
   - (id)initWithFrame:(CGRect)frame
   {
  self = [super initWithFrame:frame];
  if (self) {
    // Initialization code
   }
   return self;
   }

  - (id)initWithCoder:(NSCoder *)aDecoder
  {
  self=[super initWithCoder:aDecoder];
  if (self)
  {
  }
  return self;
  }
  -(BOOL)touchesShouldCancelInContentView:(UIView *)view
  {
   return NO;
  }

   - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
   {
    [self.scrollDelegate scrolltouchesBegan:touches withEvent:event];
    }

    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
   {
   [self.scrollDelegate scrolltouchesMoved:touches withEvent:event];
    }

   - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
    {
    [self.scrollDelegate scrolltouchesEnded:touches withEvent:event];

    }

    -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
    {
    }
    @end
0 голосов
/ 29 августа 2010

Хотя для iPhone было необходимо переопределить сенсорные события, для iPad компания Apple представила UIGestureRecognizer , которые делают подобные задачи намного проще и проще в реализации.Вам, вероятно, придется реорганизовать свой код, чтобы использовать их.

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