【问题标题】:How do I keep two UIScrollView instances zoomed to the same level?如何保持两个 UIScrollView 实例缩放到同一级别?
【发布时间】:2011-07-28 20:22:44
【问题描述】:

我有两个 UIScrollView 实例,我希望它们同时缩放。

有人有这方面的经验吗?

我正在使用NSNotificationCenter 告诉我的对象何时缩放。最初我以为我能以某种方式获得当前可见的矩形,然后打电话给zoomToRect:,但我没有办法做到这一点。我现在拥有的是设置 zoomScalecontentOffset 属性。它看起来像这样:

- (void)registerForZoomNotifications {
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(receiveZoomNotification:) 
                                             name:ZOOM_NOTIFICATION_IDENTIFIER 
                                           object:nil];
}

- (void)receiveZoomNotification:(NSNotification*)notification {

UIScrollView *currentScrollView = (UIScrollView*)[notification object];

// zoomLevel
[(UIScrollView*)self.view setZoomScale:currentScrollView.zoomScale animated:NO];

// contentOffset
[(UIScrollView*)self.view setContentOffset:currentScrollView.contentOffset animated:NO];
}

#pragma mark -
#pragma mark UIScrollViewDelegate

- (void)scrollViewDidZoom:(UIScrollView *)pageScrollView {

[[NSNotificationCenter defaultCenter] postNotificationName:ZOOM_NOTIFICATION_IDENTIFIER object:pageScrollView];

}

但它不起作用,而且看起来非常不稳定。任何人的想法?我应该采取不同的方法吗?

编辑:我应该澄清两个滚动视图不能同时显示。它们在完全同时滚动并不重要,只有滚动视图在滚动完成后与另一个滚动视图处于相同的缩放级别(和可见的矩形)。

【问题讨论】:

    标签: iphone objective-c uiscrollview


    【解决方案1】:

    一种更简单的方法是为管理 2 UIScrollView2 的 UIView 控件实现 UIScrollViewDelegate 协议

    在您的 .h 文件中添加 @interface 声明

    @interface yourUIViewControll : UIViewControll <UIScrollViewDelegate> {
        UIScrollView *aUIScrollView;
        UIScrollView *bUIScrollView;
    }
    

    现在,当用户滚动或缩放 2 UIScrollView 之一时,您可以使用所需的所有方法 因此,例如,您想知道一个何时缩放或滚动,并且想让另一个也缩放和滚动,您尤其需要这 2 个

    在.m:

    // called when a UIScrollView is zooming:
        - (void)scrollViewDidZoom:(UIScrollView *)zoomViewInUse{
        // just to test in log window:
        // NSLog(@"changing zoom...  scrollViewInUse.zoomScale: %.5f", zoomViewInUse.zoomScale);
        //force both UIScrollViews to zoom at the new value
            aUIScrollView.zoomScale = zoomViewInUse.zoomScale;
            bUIScrollView.zoomScale = zoomViewInUse.zoomScale;
        }
    
    
    // called when a UIScrollView is scrolling:
        - (void)scrollViewDidScroll:(UIScrollView *)scrollViewInUse{
           // just to test in log window:
           //  NSLog(@"scrollViewInUse..contentOffset.x:%.1f", scrollViewInUse.contentOffset.y);
           //force both UIScrollViews to scroll at the new value
            aUIScrollView.contentOffset = scrollViewInUse.contentOffset;
            bUIScrollView.contentOffset = scrollViewInUse.contentOffset;
        }
    

    【讨论】:

    • 嗯。这种方法需要我更改哪个类是我的代表。我现在有这种层次结构:ParentClass-&gt;ScrollContainerClassScrollContainerClass 是我的代表,对其他滚动视图一无所知。 (因此通知。)
    • 好吧,我想您可以从 ScrollContainerClass 访问 ParentClass(也许是 self.delegate?这可能是一种简单的方法),然后您可以在 ParentClass 中管理一个方法并在任何时候从任何 ScrollContainerClass 调用它你放大,然后从那个方法放大另一个……所以你必须多写一些段落,但意思是一样的……
    • 除非你有理由不这样做,否则这是正确的方法。
    • @Moshe 为什么代表比观察者更受欢迎?说我有可变数量的滚动视图并且它们是通过编程创建的,这是否会改变事情?我实际上正在考虑这个解决方案,因为我现在遇到了新滚动视图的初始显示问题,因为它们不是同时实例化的。 (所以有些对象需要跟踪所有对象的当前缩放和偏移量。也可以是父对象。)
    • 我对你的答案投了赞成票,因为虽然这不是我选择的答案,但它显然仍然是一个很好的方法。
    【解决方案2】:

    我目睹的不稳定行为是因为我在滚动时没有发送通知,只是放大了。当我添加以下附加委托方法时,一切正常:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
         [[NSNotificationCenter defaultCenter] postNotificationName:ZOOM_NOTIFICATION_IDENTIFIER object:scrollView];
    }
    

    【讨论】:

    • 我也在做同样的事情,但你能告诉我 ZOOM_NOTIFICATION_IDENTIFIER 是做什么的吗?是静态的还是#define ??
    • 在这个例子中,ZOOM_NOTIFICATION_IDENTIFIER 是一个#define。我对#defines 使用全部大写的约定。如果我没记错的话, postNotificationName:object: 需要一个NSString
    猜你喜欢
    • 2016-05-06
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多