iOS: могу ли я переопределить поведение ввода / вывода UIScrollView? - PullRequest
5 голосов
/ 30 июня 2011

Я рисую график на UIView, который содержится в UIScrollView, так что пользователь может прокручивать горизонтально, чтобы просмотреть весь график.

Теперь я хочу увеличить график, когда пользователь сжимает два пальца, но вместо увеличения вида с одинаковой скоростью для направления X и Y, я хочу увеличить только в направлении X, изменяя масштаб X , без изменения шкалы Y.

Я думаю, что мне нужно перехватить жест ввода / вывода и перерисовать график, переопределяя поведение масштабирования по умолчанию.

Но есть ли способ сделать это?

Мне было очень трудно поймать жест щипка на UIScrollView, так как он отменяет касания, когда он начинает прокручиваться. Я хочу, чтобы масштабирование работало даже после того, как UIScrollView отменяет касания. (

Спасибо, Куры

Ответы [ 4 ]

12 голосов
/ 17 июля 2011

Хотя вы не можете удалить существующий распознаватель жестов, вы можете отключить его и добавить свой собственный:

// Disable existing recognizer
for (UIGestureRecognizer* recognizer in [_scrollView gestureRecognizers]) {
    if ([recognizer isKindOfClass:[UIPinchGestureRecognizer class]]) {
        [recognizer setEnabled:NO];
    }
}

// Add our own
UIPinchGestureRecognizer* pinchRecognizer = 
  [[UIPinchGestureRecognizer alloc] initWithTarget:self 
                                            action:@selector(pinch:)];
[_scrollView addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];

Тогда в

- (void) pinch:(UIPinchGestureRecognizer*)recognizer { .. }

использовать

[recognizer locationOfTouch:0 inView:..]
[recognizer locationOfTouch:1 inView:..]

чтобы выяснить, зажимает ли пользователь горизонтально или вертикально.

5 голосов
/ 30 июня 2011

Вместо этого вы должны получить доступ к gestureRecognizers (определенному в UIView), есть несколько из них, используемых представлением прокрутки,

выясните, какой из них является распознавателем пинча, и вызовите removeGestureRecognizer: в представлении прокрутки, затем создайте свое собственное и заставьте его работать, добавьте его обратно addGestureRecognizer:.

это все публичные API, распознаватели и в каком порядке они не находятся (в настоящее время), поэтому программируйте с защитой при обращении к ним

(это совершенно правильный способ манипулирования представлениями UIKit, и у Apple не будет / не должно быть проблем с ним - хотя они не будут гарантировать его работоспособность в любом будущем выпуске)

1 голос
/ 30 июня 2011

Вы должны иметь возможность создать подкласс UIScrollView и переопределить метод touchesBegan :.Не вызывайте [super touchesBegan:], а вместо этого настройте масштаб по своему усмотрению:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //Anything you want. Probably you would want to store all the touches
    //or their values, so that you can compare them to the touches
    //in the touchesEnded: method, 
    //thus letting you know what the pinch amount was
}

Если хотите, вы можете судить, щепотка это или нет, а если нет, вызвать суперметод, и обрабатывать его только для пользовательских зажимов.

0 голосов
/ 27 февраля 2013

Ответы Edsko и bshirley хороши, но они не говорят, где разместить код.

Сначала я поместил его в метод viewDidLoad, но в просмотре прокрутки не было обнаружено распознавателя жестов Pinch (возможно, потому что мое представление прокрутки является IBOutlet).

Затем я попытался в viewWillAppear или viewDidAppear, и UIPinchGestureRecognizer был здесь.

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