【问题标题】:The zoomScale property of UIScrollView isn't updated while zoom-bouncingUIScrollView 的 zoomScale 属性在缩放弹跳时不会更新
【发布时间】:2012-02-26 07:53:35
【问题描述】:

现在我有一个 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];
}

【问题讨论】:

  • scrollViewDidEndZooming:withView:atScale: 被调用时,您不能将辅助视图设置为最小/最大比例吗?我认为“反弹”动画的持续时间是固定的。

标签: iphone objective-c ios uiscrollview


【解决方案1】:

您应该使用不同的 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

“滚动视图也会在任何“反弹”动画之后调用此方法。”

【讨论】:

  • 直到现在我完全忘记了这篇文章。我一直在处理它,但希望在发布之前修复它。问题是,我可以确定用户主动缩放时的比例,以及“反弹”动画何时完成,但这是我希望转发的实际动画。在缩放弹跳动画期间,我想知道当前缩放是什么 - 即动画中特定间隔的缩放级别。
  • 我也很想解决这个问题。我现在正在研究 KVO 以观看视图的presentationLayer,但我也没有得到任何回调。很想解决这个问题。
【解决方案2】:

据我所知,如果你想知道当前的缩放级别,你应该使用下面的 UIScrollView 委托方法

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

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

}

希望这对你有用。

享受编程!

【讨论】:

  • 这个解决方案实际上并没有解决我的问题。我的问题是,我想知道在动画的反弹缩放部分中当前的缩放比例是多少。我尝试了每一个委托方法,以及 KVO 都无济于事。
  • 哦.. 为什么会这样。我只使用这个委托方法在我的应用程序中做了同样的事情.. !!
  • 因为我的视图在一个不可见的 UIScrollView 后面。我将 UIScrollView 用于其物理特性 - 所以我将比例因子从 UIScrollView 传递到辅助视图。这就是为什么我需要知道缩放比例是多少,即使它是从动画中反弹回来的。
【解决方案3】:

好的,我想我可能找到了一些对您有帮助的东西。在此相关线程In iOS 4.0, why does UIScrollView zoomToRect:animated: not trigger the scrollViewDidScroll or scrollViewDidZoom delegates while animating? 中,有两个答案可能对您有用。

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

就个人而言,我想我会尝试第一个解决方案。希望我理解这个问题,这很有帮助。如果不是......道歉和最幸福的编码!

【讨论】:

    【解决方案4】:

    缩放的反弹是一个动画,所以属性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];
        }
    }
    

    【讨论】:

    • 这看起来是一个很有前途的方法。你能解释一下为什么你存储 _previousZoomScale 我没有看到它在任何地方使用。
    • 好点,在我的测试项目中,我同时存储了旧值和新值,但如果你在另一个对象上设置缩放,你只需要新值。我会适应可能会相应地回答。
    【解决方案5】:

    感谢this answer,很明显可以使用presentationLayer 来获得正确的值。 我创建了一个UIScrollView category 来为zoomScalecontentOffsetcontentSize 添加特殊的getter,即使UIScrollView 是动画,它们也会返回正确的值。

    你可以在这里找到 repo:https://github.com/bddckr/BDDRScrollViewExtensions

    【讨论】:

    • 我正在使用这种方法,但我经常发现,表示层的最终值与应有的值不匹配。就好像它停了下来一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多