Подтвердить что ты не робот

Свойство zoomScale UIScrollView не обновляется во время масштабирования

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

Пример кода:

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;

а затем на self

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

Ответ 1

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

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

Ответ 2

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

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

Этот подход не изящный, но он работает. Вот вам какой-то код, чтобы вы начали:

- (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];
    }
}

Ответ 3

Вы должны использовать другой метод 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

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

Ответ 4

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

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

Ответ 5

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

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

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

}

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

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