3

我最近遇到了一个问题,即无法touchesMovedUIScrollView. 在与很多人交谈并阅读了大量帖子之后,事实证明它UIScrollView本身不接受触摸,而是需要将触摸传递给UIScrollView子类。

我对objective-c非常陌生,并且在思考如何定义子类(在单独的.h / .m文件中或以某种方式在@interface或其他东西中)以及iOS如何处理响应者链时,我感到很痛苦.

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

我的应用程序中有一个页面,我将它的默认设置更改UIViewUIScrollView,所以如果我检查它,InterfaceBuidler我看到的只是我的SampleViewControllerand UIScrollView。我把我的链接UIScrollView到这样的:@InterfaceSampleViewControler.h

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

我这样引用了我UIScrollViewSampleViewController.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];
}

如果我将类更改UIScrollViewUIView,则检测到触摸并发出一些NSLog消息。但是,一旦UIView设置回UIScrollView,触摸将被忽略。

据我了解,我需要UIScrollView使用代码设置一个子类:

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

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

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

但是,我真的不明白 1)如何设置这样的子类,以及 2)为什么这会起作用,因为我不明白为什么[[self.nextResponder nextResponder] touchesMoved:touches withEvent:event];会首先从内部调用SampleViewController.m,因为我的类似NSLog(@"Movement!");语句从未执行过.

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

4

2 回答 2

1

你在想这个错误。如果您想知道滚动视图何时移动,则无需对其进行子类化。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

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

– scrollViewDidScroll:
– scrollViewWillBeginDragging:
– scrollViewWillEndDragging:withVelocity:targetContentOffset:
– scrollViewDidEndDragging:willDecelerate:
– scrollViewShouldScrollToTop:
– scrollViewDidScrollToTop:
– scrollViewWillBeginDecelerating:
– scrollViewDidEndDecelerating:
于 2013-06-13T00:04:11.627 回答
0

几天前我发布了一个类似问题的答案,它也可能对您有所帮助。看到这个问题我的回答

看起来你已经接近让它工作了,但是你对把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!");
}

(在你的问题中你有这两个相反的方式。)

于 2013-06-14T02:28:05.633 回答