如何设置UIScrollView的子类来响应触摸事件?

时间:2013-06-12 23:49:37

标签: ios objective-c uiview uiscrollview

我最近遇到的问题是无法在touchesMoved内注册触摸事件(UIScrollView等)。在与很多人交谈并阅读大量帖子之后,事实证明UIScrollView不接受触摸本身,而是需要将触摸传递给UIScrollView子类。

我对objective-c非常新,并且我正在围绕如何定义子类(在单独的.h / .m文件中或以某种方式在@interface或其他内容中)以及iOS如何处理这个非常糟糕的时间与响应者链。

请让我描述一下我的确切情况,任何愿意解释我需要做什么的人都会非常感激。

我的应用中有一个页面,我将其默认UIView更改为UIScrollView,因此,如果我在InterfaceBuidler中进行检查,我看到的只是SampleViewControllerUIScrollView。我将UIScrollView@Interface的{​​{1}}关联起来,如下所示:

SampleViewControler.h

我在#import <UIKit/UIKit.h> @interface SampleViewController : UIViewController { } @property (strong, nonatomic) IBOutlet UIScrollView *mainScroller; @end 中引用了UIScrollView,就像这样:

SampleViewController.m

如果我将#import "SampleViewController.h" @interface SampleViewController () @end @implementation SampleViewController @synthesize mainScroller = _mainScroller; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"Movement!"); } -(void)viewWillAppear:(BOOL)animated { [_mainScroller setContentOffset:CGPointMake(0,0) animated:YES]; } 的类更改为UIScrollView,则会检测到触摸并触发一些UIView消息。但是,将NSLog设置回UIView后,将忽略触摸。

根据我的理解,我需要使用代码

设置UIScrollView的子类
UIScrollView

...然后将我的SampleViewController.m更改为代码:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Movement!");
}

然而,我真的不明白1)如何设置这样一个子类,2)为什么这会起作用,因为我不明白为什么- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event]; } 首先从内部被调用[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];,因为我的类似SampleViewController.m语句从未执行过。

我已经尝试了所有可以找到的教程,并且正在转向SE的专业知识!感谢。

2 个答案:

答案 0 :(得分:1)

你在考虑这个错误。如果您想知道scrollView何时移动,则无需对其进行子类化。 iOS已在UIScrollViewDelegate内设置了您需要的所有方法。如果您想说,请在scrollView中为物品选择touchEvents,那就完全可以了。然后,您需要将scrollView中的项子类化,然后在相应的类中拾取touchEvents。但是对于标准的scrollView方法,您应该将其设置为:

·H

  #import <UIKit/UIKit.h>
  @interface SampleViewController : UIViewController<UIScrollViewDelegate>
  {
  }
  @property (strong, nonatomic) IBOutlet UIScrollView *mainScroller;
  @end

.M

#import "SampleViewController.h"

@interface SampleViewController ()
@end

@implementation SampleViewController
@synthesize mainScroller = _mainScroller;

-(void)viewDidLoad
{
   self.mainScroller.delegate=self;//Adopt the delegate for the scrollView..this is the important line
}

然后只需实现UIScrollViewDelegateMethods来抓取移动等。当试图在scrollView / tableView中拾取touchEvents时会发生未定义的行为,因为scrollView本身已经在幕后实现了那些touchEvents

查看Developer站点上的所有方法,并在.M文件中实现它们。由于您已在viewDidLoad中采用了委托,因此这些将是您的scrollView回调。我之前已经列出了其中一些,但继续查看UIScrollViewDelegate Protocol site

– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewWillEndDragging:withVelocity:targetContentOffset:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:

答案 1 :(得分:0)

我几天前发布了一个类似问题的答案,可能对你有所帮助。请参阅this questionmy answer

看起来你已经接近工作了,但你对于放置touchesMoved方法的位置感到有些困惑。

UIScrollView的子类中,您应该:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];
}

SampleViewController.m文件中:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Movement!");
}

(在你的问题中你有另外两种方式。)