Любой способ изменить продолжительность zoomToRect для UIScrollView? - PullRequest
6 голосов
/ 13 июля 2010

Есть ли способ указать продолжительность для анимации [UIScrollView zoomToRect:zoomRect animated:YES]?

На данный момент это либо быстрая animated:YES, либо мгновенная animated:NO.

Я бы хотелуказать продолжительность, например, [UIScrollView setAnimationDuration:2];или что-то подобное.

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 18 июля 2010

Используйте анимацию UIView.

Это немного долго объяснять, поэтому я надеюсь, что этот маленький пример немного прояснит ситуацию. Посмотрите документацию для дальнейших инструкций

[UIView beginAnimations: nil context: NULL];
[UIView setAnimationDuration: 2];
[UIView setAnimationDelegate: self];
[UIView setAnimationDidStopSelector: @selector(revertToOriginalDidStop:finished:context:)];

expandedView.frame = prevFrame;

[UIView commitAnimations];

Это из проекта, над которым я сейчас работаю, поэтому он немного конкретен, но я надеюсь, что вы можете увидеть основы.

0 голосов
/ 04 мая 2015

На самом деле эти ответы очень близки к тому, что я в итоге использовал, но я выложу свои отдельно, так как они разные.По сути, zoomToRect не работает правильно, если целевой масштаб масштабирования совпадает с текущим.

Вы можете попробовать scrollToRect, но мне не повезло с этим.

Вместо этого просто используйтеcontentOffset и установите его в zoomRect.origin и вложите его в блок анимации.

[UIView animateWithDuration:duration
                      delay:0.f
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
    if (sameZoomScale) {
        CGFloat offsetX = zoomRect.origin.x * fitScale;
        CGFloat offsetY = zoomRect.origin.y * fitScale;

        [self.imageScrollView setContentOffset:CGPointMake(offsetX, offsetY)];
    }
    else {
        [self.imageScrollView zoomToRect:zoomRect
                                animated:NO];
    }
                 }
                 completion:nil];
0 голосов
/ 24 августа 2010

Мне повезло с этим методом в подклассе UIScrollView:

- (void)zoomToRect:(CGRect)rect duration:(NSTimeInterval)duration
{
    [self setZoomLimitsForSize:rect.size];

    if (duration > 0.0f) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:duration];
    }
    [self zoomToRect:rect animated:NO];
    if (duration > 0.0f)
        [UIView commitAnimations];

    [self zoomToRect:rect animated:(duration > 0.0f)];
}

Это немного обманывает, но, похоже, в основном работает.Иногда это терпит неудачу, но я не знаю почему.В этом случае он просто возвращается к скорости анимации по умолчанию.

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