我想使用UIScrollView的滚动/平移功能,但我想自己处理所有缩放和缩放。我目前的计划是拥有一个viewController,它拥有一个UIView(我称之为view1),其中包含多个UIViews和UIScrollViews作为子项。
view1是否可以处理所有多点触控事件(为了手动渲染其所有孩子的缩放状态)并将结果绘制到每个相应的滚动视图上以允许用户滚动结果?
(好奇的是,应用程序正在绘制多个热图,每个热图都有自己的一组轴。在缩放或滚动时,轴需要自行更新以正确标记数据区域(滚动视图)中表示的范围。我无法使用scrollView免费提供的默认上下文图像缩放缩放的原因是在上下文中绘制的任何内容都会缩放(包括像参考线这样的东西)。缩放操作实际上并不是要让事情变大,而是调整可查看的数据范围。)
答案 0 :(得分:4)
您确实可以让主要主机视图拦截多点触控事件,并以编程方式对基础UIViews进行缩放。这是我在my application的OpenGL显示部分中所做的(源可用here)。您仍然可以将单点触摸事件传递给基础滚动视图以进行平移等。
但是,仍然可能有一种方法可以在不拦截触摸事件的情况下执行您所描述的操作。 UIScrollView通过将转换应用于内容视图来执行其默认缩放。在回复this question时,我描述了一种在缩放缩放完成后以新比例重新渲染内容视图的方法。这样,一旦完成缩放,您就可以使用清晰的网格线刷新绘图。
此外,如果您没有真正进行缩放,并且想要通过缩放缩放来更改视图的其他属性,则可以执行我在该问题中描述的内容并截取内容视图上的变换设置,仅限于应用变换。您可以从该转换中提取UIScrollView要设置的比例,并在响应中自行重新绘制视图。
答案 1 :(得分:0)
感谢你的建议。我最终使用的解决方案是扩展UIScrollView并覆盖touchesMoved:withEvent:方法:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
if ([[event touchesForView:self] count] == 1)
[super touchesMoved:touches withEvent:event];
[content touchesMoved:touches withEvent:event];
}
其中“content”是指向我的scrollview的内容子视图的指针。我必须这样做,因为我的内容需要缩放到点(即,用户手指下的数据空间中的点不应该改变)。发送到setTransform的信息:只能告诉我内容框架的大小,但我也需要偏移量。