Масштабирование только по горизонтали в UIScrollView

Я использую UIPinchGestureRecognizer для настройки ширины (а не высоты) представления в UIScrollView. Он работает со свойством scale жеста сжатия, но contentOffset прокрутки не меняется, поэтому вид всегда увеличивается справа. Это выглядит немного лучше, если я масштабирую contentOffset вместе с шириной, так как тогда вид увеличивается с самой левой стороны экрана.

Проблема в том, что местоположение щипка игнорируется - поэтому всегда кажется, что щипок находится в левой части экрана.

Мне нужно каким-то образом учесть расположение зажима для регулировки contentOffset, чтобы можно было отрегулировать смещение, чтобы содержимое в точке зажима оставалось в одном и том же месте.

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


person Jason Moore    schedule 02.07.2014    source источник
comment
В суперклассе UIPinchGestureRecognizer есть несколько методов, которые могут помочь, например -locationInView:. (Вы спрашиваете, как найти щепотку? Это не совсем ясно)   -  person Justin Johns    schedule 02.07.2014
comment
Да, фотографии помогли бы прояснить этот вопрос. В итоге я использовал locationInView: для определения точки защемления, нормализовал ее (0..1), изменил размер вида, вычислил новую точку защемления, а затем установил смещение так, чтобы точка защемления находилась под точкой касания.   -  person Jason Moore    schedule 02.07.2014
comment
можешь опубликовать свое решение?   -  person Peter Lapisu    schedule 06.08.2015
comment
Обработчик Pinch размещен ниже.   -  person Jason Moore    schedule 06.08.2015


Ответы (1)


Я щипком масштабировал график, поэтому щипок регулирует ограничение ширины в представлении графика.

Вот обработчик пинча:

- (void) doPinch:(UIPinchGestureRecognizer*)pinch;
{        
    CGFloat width = self.graphWidthConstraint.constant;
    CGFloat idealWidth = 1500;
    CGFloat currentScale = width / idealWidth;
    CGFloat scale = currentScale - (1.0 - pinch.scale);

    CGFloat minScale = 0.5;
    CGFloat maxScale = 3.0;
    scale = MIN(scale, maxScale);
    scale = MAX(scale, minScale);

    CGPoint locationScrollview = [pinch locationInView:self.graphScrollView];
    CGFloat pinchXNormalized = locationScrollview.x / width;

    CGPoint locationView = [pinch locationInView:self.view];

    // resize
    CGFloat newWidth = idealWidth * scale;
    self.graphWidthConstraint.constant = newWidth;

    // set offset to position point under touch
    CGFloat pinchXScaled = newWidth * pinchXNormalized;
    CGFloat x = pinchXScaled - locationView.x;
    self.graphScrollView.contentOffset = CGPointMake(x, 0);

    pinch.scale = 1;
}
person Jason Moore    schedule 06.08.2015