在 UIScrollView 的子类中检测滚动

Posted

技术标签:

【中文标题】在 UIScrollView 的子类中检测滚动【英文标题】:Detect scrolling in Subclass of UIScrollView 【发布时间】:2011-04-15 08:06:35 【问题描述】:

早上好,

我创建了 UIScrollView 的子类,现在我想知道用户何时在我的子类中滚动。为此,我将其实现如下:

ImageScroller.h

@interface UIImageScroller : UIScrollView <UIScrollViewDelegate> 

ImageScroller.m(在@implementation 中)

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 

    NSLog(@"did scroll");

问题是,scrollViewDidScroll 方法似乎没有被触发。 有没有可能让它工作?

我也尝试将委托设置为自己,但它不起作用。

 - (id)initWithCoder:(NSCoder *)aDecoder 
    if ((self = [super initWithCoder:aDecoder])) 
        self.directionalLockEnabled = YES;
        [self setDelegate:self];
    
    return self;

我在我的 XIB 文件中添加了一个 ScrollView,并将 Class 设置为我的 ImageScroller。我还设置了 Fileowner 并在 ViewController 的 .h 文件中使用 UIScrollViewDelegate 以及在 .m 文件中实现方法 scrollViewDidScroll。

当我在 XIB 的 .m 文件的代码中设置 ImageScroller 的委托时,例如 [imageScroller setDelegate:imageScroller] scrollViewDidScroll 在我的 ImageScroller-Subclass 中被触发,但我的 ViewController 中的那个没有被触发,但我需要两者。

有什么解决办法吗?

提前感谢您的回答。

【问题讨论】:

【参考方案1】:

我在创建 UIScrollView 的子类时遇到了同样的问题,但通过这种方式解决了。如上所述,您可以将自己(子类实例)设置为委托,但这就是我所做的。

在子类中我覆盖了以下方法

//Override this to detect when the user is scrolling, this is also triggered during view
//layout.  Here you can check your deceleration rate and determine when the scrolling has
//grinded to a halt.
-(void)setContentOffset:(CGPoint)contentOffset

//Override this to detect when the view has been resized (just a handy override)
-(void)setFrame:(CGRect)frame;

就其他 UIScrollViewDelegate 方法而言,我认为应该由 View Controller 负责处理。

【讨论】:

【参考方案2】:

我认为你可以尝试设置 self.delegate = self;接收事件。

【讨论】:

我试过这样,但由于某种原因它不起作用。 - (id)initWithCoder:(NSCoder *)aDecoder if ((self = [super initWithCoder:aDecoder])) self.directionalLockEnabled = YES; [自我设置委托:自我]; 返回自我; 我在我的 XIB 文件中添加了一个 ScrollView,并将 Class 设置为我的 ImageScroller。我还设置了 Fileowner 并在 ViewController 的 .h 文件中使用 UIScrollViewDelegate 以及在 .m 文件中实现方法 scrollViewDidScroll。这可能是个问题吗? 我第一次没有得到它 :) 所以你的委托方法有效,但只在你的委托(滚动视图)中工作?事情本来就是这样,因为只有一个代表。我认为您可以将代理设置为您的控制器,并使其像这样- (void)scrollViewDidScroll:(UIScrollView *)scrollView //do controller stuff here [self.view scrollViewDidScroll:(UIScrollView *)self.view]; 但我仍然不确定这是否是问题所在。【参考方案3】:

如果有人正在寻找 Swift 的答案,就这么简单:

override var contentOffset: CGPoint 
    didSet 
        if contentOffset != oldValue 
            //same as scrollViewDidScroll
        
    

【讨论】:

以上是关于在 UIScrollView 的子类中检测滚动的主要内容,如果未能解决你的问题,请参考以下文章

检查 UIScrollView 是不是从子单元格滚动

子类 UIScrollView 检测按钮内的触摸,但对用户交互无响应

UI基础篇之UIScrollView

UIScrollView属性及其代理方法

为啥即使我覆盖 touchesMoved:withEvent:,UIScrollView 的子类仍会滚动?

UIScrollView 检测滚动