iOS 使用带有 UILabel 的 UITapGestureRecognizer 滑动到下一页
Posted
技术标签:
【中文标题】iOS 使用带有 UILabel 的 UITapGestureRecognizer 滑动到下一页【英文标题】:iOS using UITapGestureRecognizer with UILabel to swipe to the next page 【发布时间】:2012-06-07 01:08:03 【问题描述】:抱歉,如果我忽略了对我的问题的潜在答案,但我在子视图 UIViewController 类中使用带有 UILabel 的 UITapGestureRecognizer 时遇到问题...
基本上,我创建了一个自定义 UIViewController,它有一个 UILabel 和一些其他不相关的元素。 但是,此自定义 UIViewController 位于启用了分页的自定义 UIScrollView 内,并且标签的偏移量刚好足以让您看到下一个 UIViewController 的标签。我想要做的是当用户触摸“下一个”标签时,scrollRectToVisible:animated: 方法会触发,本质上是在不滚动的情况下切换页面。 CustomViewController 的 UILabel 位于顶部。
下面是容器 UIScrollView 在将 UITapGestureRecognizer 添加到 CustomViewController 的 UILabel 时的示例代码:
[scrollView addSubview:CustomViewController];
- (void) addSubview: (CustomViewController *) view
// create view's frame here...
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fireScrollRectToVisible:view)]; // this is the current problem like a lot of people out there...
[view.Label addGestureRecognizer:tap];
// [super addSubview:view.view];
- (void) fireScrollRectToVisible: (CustomViewController *) cvc
CGRect frame = CGRectMake(cvc.view.frame.origin.x, cvc.view.frame.origin.y, 320, 480);
[scrollView scrollRectToVisible: frame animated:YES];
我最初认为这很容易,但由于@selector 不允许您放置参数,所以它变得异常困难。我想我需要的是访问 CustomViewController 的框架并将 scrollRectToVisible 设置为那个,但我不确定了......
我已经尝试过这篇文章,但我是 Objective-C 的新手,我不完全理解 hitTest:withEvent: 我假设 hitTest:(CGPoint) 与视图的边界有关?
UITapGestureRecognizer initWithTarget:action: method to take arguments?
如果有人能指出我正确的方向,那就太好了。 任何帮助将不胜感激!
【问题讨论】:
【参考方案1】:我根据你的代码做了一些改变
- (void) addSubview: (CustomViewController *) view
// create view's frame here...
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fireScrollRectToVisible:)]; // this is the current problem like a lot of people out there...
[view.Label addGestureRecognizer:tap];
// [super addSubview:view.view];
- (void) fireScrollRectToVisible: (UIGestureRecognizer *) gesture
UIView *view = [gesture.view superview];
CGRect frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, 320, 480);
[scrollView scrollRectToVisible: frame animated:YES];
希望对您有所帮助。
【讨论】:
太棒了!这是一个非常简单的解决方案,我完全忘记了 superview 属性。非常感谢!【参考方案2】:如果您需要包含包含手势识别器的标签的视图框架,您不能这样做:
gestureRecognizer.view.superview.frame;
获取框架?
手势识别器的选择器应采用以下形式
- (void)gestureRecognizerDidFire:(UIGestureRecognizer *)recognizer;
如果您将选择器设置为@selector(gestureRecognizerDidFire:)
,识别器将自动传递,您可以访问其中的视图属性。
【讨论】:
以上是关于iOS 使用带有 UILabel 的 UITapGestureRecognizer 滑动到下一页的主要内容,如果未能解决你的问题,请参考以下文章
iOS 使用带有 UILabel 的 UITapGestureRecognizer 滑动到下一页