Cra*_*aig 42 iphone objective-c uiscrollview
我在我的主视图,可同时接收应用程序touchesBegan和touchesMoved,因此,需要在单手指触摸,并拖动.我想实现一个UIScrollView,我有它的工作,但它覆盖了拖动,因此我的contentView永远不会收到它们.我想实现一个UIScrollview,其中双指拖动指示滚动,并且单指拖动事件被传递到我的内容视图,因此它正常执行.我需要创建自己的子类UIScrollView吗?
这是我appDelegate实现的代码UIScrollView.
@implementation MusicGridAppDelegate
@synthesize window;
@synthesize viewController;
@synthesize scrollView;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after app launch
//[application setStatusBarHidden:YES animated:NO];
//[window addSubview:viewController.view];
scrollView.contentSize = CGSizeMake(720, 480);
scrollView.showsHorizontalScrollIndicator = YES;
scrollView.showsVerticalScrollIndicator = YES;
scrollView.delegate = self;
[scrollView addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)dealloc {
[viewController release];
[scrollView release];
[window release];
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
小智 64
在SDK 3.2中,UIScrollView的触摸处理使用Gesture Recognizers处理.
如果要进行双指平移而不是默认的单指平移,可以使用以下代码:
for (UIGestureRecognizer *gestureRecognizer in scrollView.gestureRecognizers) {
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *) gestureRecognizer;
panGR.minimumNumberOfTouches = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
Gut*_*ujo 37
对于iOS 5+,设置此属性与Mike Laurence的答案效果相同:
self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
Run Code Online (Sandbox Code Playgroud)
panGestureRecognizer会忽略一个手指拖动,因此单指拖动事件将传递到内容视图.
Mik*_*nce 14
在iOS 3.2+中,您现在可以轻松实现双指滚动.只需在滚动视图中添加一个平移手势识别器,并将其maximumNumberOfTouches设置为1.它将声明所有单指滚动,但允许2个手指滚动将链向上传递到滚动视图的内置平移手势识别器(从而允许正常的滚动行为).
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(recognizePan:)];
panGestureRecognizer.maximumNumberOfTouches = 1;
[scrollView addGestureRecognizer:panGestureRecognizer];
[panGestureRecognizer release];
Run Code Online (Sandbox Code Playgroud)
And*_*sov 10
你需要子类UIScrollView(当然!).然后你需要:
使单指事件转到您的内容视图(简单),和
使双指事件滚动滚动视图(可能很容易,可能很难,可能是不可能的).
Patrick的建议通常很好:让你的UIScrollView子类知道你的内容视图,然后在触摸事件处理程序中检查手指的数量并相应地转发事件.只需确保(1)您发送到内容视图的事件不会通过响应器链回送到UIScrollView(即确保全部处理它们),(2)尊重触摸事件的常规流程(即touchesBegan,而不是一些{touchesBegan,touchesMoved,touchesEnded},用touchesEnded或touchesCancelled完成,特别是在处理UIScrollView时.#2可能很棘手.
如果您确定该事件是针对UIScrollView,另一个技巧是让UIScrollView相信您的双指手势实际上是单指手势(因为UIScrollView无法用两根手指滚动).尝试只将一个手指的数据传递给super(通过过滤(NSSet *)touches参数 - 请注意它只包含已更改的触摸 - 并完全忽略错误手指的事件).
如果这不起作用,你就麻烦了.从理论上讲,您可以尝试通过创建类似于UITouch的类来创建人工触摸以提供给UIScrollView.基础C代码不检查类型,因此可能会将(YourTouch*)转换为(UITouch*),并且您将能够欺骗UIScrollView来处理实际没有发生的触摸.
您可能想阅读有关高级UIScrollView技巧的文章(并在那里查看一些完全不相关的UIScrollView示例代码).
当然,如果你不能让它工作,总是可以选择手动控制UIScrollView的移动,或使用完全自定义编写的滚动视图.Three20库中有TTScrollView类; 它对用户来说并不好,但对程序员来说确实感觉很好.
这个答案很乱,因为你只能通过阅读所有其他答案和评论找到正确的答案(最接近的答案得到了倒退的问题).接受的答案太模糊而无用,并提出了一种不同的方法.
合成,这是有效的
// makes it so that only two finger scrolls go
for (id gestureRecognizer in self.gestureRecognizers) {
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
UIPanGestureRecognizer *panGR = gestureRecognizer;
panGR.minimumNumberOfTouches = 2;
panGR.maximumNumberOfTouches = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
这需要两个手指进行滚动.我已经在子类中完成了这个,但如果没有,只需替换self.gestureRecognizers,myScrollView.gestureRecognizers你就可以了.
我添加的唯一一件事是使用id避免丑陋的演员:)
如果您希望UIScrollView也可以进行缩放,那么这可能会变得非常混乱...手势无法正常工作,因为捏缩放和滚动对抗它.如果我找到合适的答案,我会更新.
| 归档时间: |
|
| 查看次数: |
23965 次 |
| 最近记录: |