Свойство zoomScale UIScrollView не обновляется при отскоке - PullRequest
22 голосов
/ 03 февраля 2012

Прямо сейчас у меня есть представление, которое находится за пределами UIScrollView.По многим причинам это не может быть просто внутри прокрутки.Итак, сейчас я занимаюсь тем, что, поскольку UIScrollView масштабируется / панорамируется, я обновляю свой другой вспомогательный вид.Единственная проблема, с которой я сталкиваюсь, это то, что значение zoomScale не корректируется, пока представление возвращается к минимальному или максимальному масштабу.Любые предложения о том, как получить это значение во время анимации назад?

Пример кода:

self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, appSize.width, appSize.height)];
self.scrollView.contentSize = CGSizeMake(appSize.width * 2, appSize.height * 2);

self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.scrollView.delegate = self;
self.scrollView.bounces = YES;
self.scrollView.bouncesZoom = YES;
self.scrollView.alwaysBounceHorizontal = YES;
self.scrollView.alwaysBounceVertical = YES;
self.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;

self.scrollViewZoomView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,
                                                                   appSize.width * 2,
                                                                   appSize.height * 2)];
[[self scrollView] addSubview:self.scrollViewZoomView];

float minZoomScale = 2.0f;

self.scrollView.minimumZoomScale = minZoomScale;
self.scrollView.maximumZoomScale = 1.0f;
self.scrollView.zoomScale = self.scrollView.minimumZoomScale;

и затем на себя

-(void) scrollViewDidZoom:(UIScrollView *)scrollView {
    float scale = [scrollView zoomScale];
    [self updateAuxViewScale:scale];
}

Ответы [ 5 ]

5 голосов
/ 15 июня 2013

Благодаря этому ответу становится ясно, что можно использовать presentationLayer для получения правильных значений.Я создал UIScrollView category, чтобы добавить специальные методы получения для zoomScale, contentOffset и contentSize, которые возвращают правильные значения, даже если UIScrollView анимируется.

Вы можете найти репздесь: https://github.com/bddckr/BDDRScrollViewExtensions

5 голосов
/ 03 апреля 2013

Отскок назад от масштаба является анимацией, поэтому свойство zoomScale сразу является целевым значением анимации, даже если анимация все еще выполняется.Если вы хотите применить ту же шкалу масштабирования, что и при просмотре с прокруткой, к другому представлению, есть способ получить его:

  1. В -scrollViewDidScroll: проверьте, есть ли у представления содержимого анимации.*
  2. Если анимации нет, установите только новый масштаб.
  3. Если анимации есть, получите длительность одной из них (длительности должны быть одинаковыми) и анимируйте свой вид с помощью этогоПродолжительность до новой шкалы увеличения.

Этот подход не элегантен, но он работает.Вот некоторый код для начала работы:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat zoomScale = _scrollView.zoomScale;

    CALayer *layer = _contentView.layer;
    NSArray *animationKeys = [layer animationKeys];

    if (animationKeys.count == 0) {
        // set zoomScale on target view
    } else {
        CFTimeInterval duration = 0.0;
        for (NSString *animationKey in animationKeys) {
            CAAnimation *animation = [layer animationForKey:animationKey];
            duration = animation.duration;
            break;
        }
        // easeInEaseOut is the default animation when the zoom bounces
        [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            // set zoomScale on target view
        } completion:nil];
    }
}
2 голосов
/ 04 февраля 2012

Вы должны использовать другой метод UIScrollViewDelegate.

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    // Your code here
    float scale = [scrollView zoomScale];
    [self updateAuxViewScale:scale];
}

Согласно документам: https://developer.apple.com/library/ios/#documentation/uikit/reference/uiscrollviewdelegate_protocol/Reference/UIScrollViewDelegate.html

"Представление прокрутки также вызывает этот метод после любой анимации" отказов "."

1 голос
/ 03 апреля 2013

Хорошо, я думаю, что нашел что-то, что поможет вам.В этой связанной теме В iOS 4.0 почему UIScrollView zoomToRect: animated: не вызывает делегатов scrollViewDidScroll или scrollViewDidZoom во время анимации? , вам могут пригодиться два ответа.

  1. https://stackoverflow.com/a/15512253/1011213
  2. https://stackoverflow.com/a/7553969/1011213

Лично я думаю, что я бы дал шанс первому решению.Надеюсь, я понимаю вопрос, и это полезно.Если нет .. извинения и самое блаженное кодирование!

0 голосов
/ 02 апреля 2013

Насколько мне известно, если вы хотите узнать текущий уровень масштабирования, вы должны использовать следующий метод делегата для UIScrollView

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{

       NSLog(@"Zoomscale %f",scale);

}

Надеюсь, это будет полезно для вас.

Наслаждайтесь программированием !!

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