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 滑动到下一页的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UILabel 可点击?

iOS 使用带有 UILabel 的 UITapGestureRecognizer 滑动到下一页

如何在IOS中制作带有圆形边框的填充UILabel

iOS:多行 uilabel 仅显示带有自动布局的一行

iOS UITextView 或 UILabel 带有可点击的动作链接[重复]

带有背景的 UILabel 换行