iphone - 为 UIScrollView 实现自定义缩放

标签 iphone cocoa-touch uiscrollview

我有一个 UIScrollView,要求在缩放时,contentSize.height 应保持不变。例如,从 200x100 放大应该会导致新的 contentSize 为 400x100,而不是 400x200。我想在用户缩放时进行自己的绘图。

我认为我无法使用 UIScrollView 的正常缩放行为来实现此目的,因此我尝试推出自己的缩放行为。 (我可以让它做它的事情,然后在调用 -scrollViewDidEndZooming:withView:atScale: 时重新绘制我的内容,但这不会很漂亮)。

目前,我正在对 UIScrollView 进行子类化,并尝试在两根手指在屏幕上时进行自己的缩放:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] != 2) {
        [super touchesMoved:touches withEvent:event];
    } else {
     // do my own stuff
    }
}

我认为通过以这种方式覆盖touchesBegan:withEvent:、touchesMoved:withEvent:、touchesEnded:withEvent:和touchesCancelled:withEvent:应该可以工作,但事实并非如此。

早期的失败尝试是在 ScrollView 顶部放置一个透明 View 并将我不感兴趣的触摸发送到 ScrollView :

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if ([touches count] != 2) {
        [self.theScrollView touchesMoved:touches withEvent:event];
    } else {
     // do my own stuff
    }
}

如有任何帮助,我们将不胜感激。

谢谢, 托马斯

最佳答案

如果您尝试在捏缩放事件的每一帧上重新绘制内容,您可能无法在缩放过程中保持良好的性能。我建议采用让 UIScrollView 放大或缩小绘图的缩放版本的方法,然后在 -scrollViewDidEndZooming:withView:atScale: 委托(delegate)方法中在缩放结束时重新绘制内容以使其清晰。这就是我在应用程序中所做的,并且最终效果很好。

有一些技巧可以在缩放结束时正确调整内容 View 的大小,我在 this answer 中对此进行了描述。 。基本上,您需要拦截内容 View 的转换设置,以便在重绘内容时将其比例因子设置为 1。您还需要跟踪该比例因子(因为 UIScrollView 没有),并使用该比例因子来调整 UIScrollView 尝试通过后续缩放操作应用于内容 View 的变换。

您可以使用对此技术的修改来强制在捏缩放期间重绘内容,但在我的测试中,这最终变得太不稳定,无法提供良好的用户体验。

关于iphone - 为 UIScrollView 实现自定义缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1531698/

相关文章:

iphone - 使用哪个 ViewController 概念?

ios - 如何使用 Swift 滚动 TextView 时重复动画?

iphone - iOS从日期获取时间

iphone - 尝试通过 iPhone 模拟器播放声音

iphone - Xcode:如何将长字符串包裹到 Xcode 编辑器中的下一行

iphone - 获取 UIScrollView 相对于原始大小的缩放帧

iphone - 使用 Amazon IOS SDK 上传 S3

iphone - 2G/3G下使用UIImagePickerController选择视频

iphone - 等待值改变然后执行 block

cocoa-touch - 使用 initWithObjects 将图像加载到 NSArray 会崩溃,但使用 NSMutableArray 不会?