为啥我的子类 UItableView 不滚动?

Posted

技术标签:

【中文标题】为啥我的子类 UItableView 不滚动?【英文标题】:Why isn't my subclassed UItableView scrolling?为什么我的子类 UItableView 不滚动? 【发布时间】:2012-03-31 00:26:56 【问题描述】:

我正在编写一个 ios 5 应用程序(在 Xcode 4.3 中,使用 Storyboards 和 ARC),它有一些需要响应水平平移的表格单元格。我有一个工作得很好的表格设置,但是我需要在另一个场景中实现相同的行为。我认为最佳实践方法是将手势识别和处理代码抽象到子类中。但是现在tableView不会滚动了,我在老方法下解决这个问题的方法也没有帮助。

我有一个RestaurantViewController,它继承自UIViewController,并有一个属性ULPanningTableView *tableView。一些表格的单元格是MenuItemCells 并继承自ULPanningTableViewCell。表的委托和数据源是RestaurantViewController

ULPanningTableViewCell 继承自 UITableViewCell 并且非常接近原始版本,唯一的区别是它具有跟踪单元格的正面和背面视图以及自定义背景的属性。

ULPanningTableView 有点复杂,因为它必须设置识别和处理。

ULPanningTableView.h:

#import <UIKit/UIKit.h>

@interface ULPanningTableView : UITableView <UIGestureRecognizerDelegate>

@property (nonatomic) float openCellLastTX;
@property (nonatomic, strong) NSIndexPath *openCellIndexPath;

- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier;
- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer;
// ... some helpers for handlePan:

@end

ULPanningTableView.m:

#import "ULPanningTableView.h"
#import "ULPanningTableViewCell.h"

@implementation ULPanningTableView

@synthesize openCellIndexPath=_openCellIndexPath, openCellLastTX=_openCellLastTX;

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;


#pragma mark - Table View Helpers

- (id)dequeueReusablePanningCellWithIdentifier:(NSString *)identifier

    ULPanningTableViewCell *cell = (ULPanningTableViewCell *)[self dequeueReusableCellWithIdentifier:identifier];

    UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
    [panGestureRecognizer setDelegate:self];
    [cell addGestureRecognizer:panGestureRecognizer];

    return cell;


#pragma mark - UIGestureRecognizerDelegate protocol

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    // for testing: only allow UIScrollViewPanGestureRecognizers to begin
    NSString *gr = NSStringFromClass([gestureRecognizer class]);
    if ([gr isEqualToString:@"UIScrollViewPanGestureRecognizer"]) 
        return YES;
     else 
        return NO;
    


#pragma mark - panhandling

- (void)handlePan:(UIPanGestureRecognizer *)panGestureRecognizer

    // ...

// ... some helpers for handlePan:

@end

我玩过gestureRecognizerShouldBegin:,因为当这些不是单独的类时,我就是这样解决这个问题的(ULPanningTableView 的东西是在RestaurantViewController 中实现的,ULPanningTableViewCell 是在@ 中实现的东西987654339@。对于translationInView 比水平更垂直的手势,我基本上会返回 NO)。无论如何,我无法让表格滚动!如果我从 gestureRecognizerShouldBegin: 返回 YES,或者如果我完全删除 UIGestureRecognizerDelegate 实现,我可以识别平移手势。

我仍然是 iOS 和 Objective-C 的初学者,所以我只有根据我读过的东西的预感,我从 similar problem 的印象中认为罪魁祸首是 UIScrollViewPanGestureRecognizer用响应者链做巫术......

如果您能对此有所了解,我将不胜感激!

【问题讨论】:

您是要在单元格中移动视图还是要水平滚动单元格的内容? 水平平移应该移动单元格中的视图。我不知道如何与单元格的内容交互以显示其backgroundView,因此我正在移动单元格UIView *frontView 的自定义属性。垂直平移应该滚动表格。 【参考方案1】:

好吧,所以我觉得很傻。 -handlePan: 已经是一个方法了!我将其更改为-handleCustomPan:,它将正常处理其他平底锅。我不确定为什么它没有崩溃,但它确实存在。哦,我不得不将 UIScrollViewPanGestureRecognizer 边缘案例保留在-gestureRecognizerDidBegin:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer

    NSString *gr = NSStringFromClass([gestureRecognizer class]);
    if ([gr isEqualToString:@"UIScrollViewPanGestureRecognizer"]) 
        // allow scroll to begin
        return YES;
     else if ([gr isEqualToString:@"UIPanGestureRecognizer"])
        UIPanGestureRecognizer *panGR = (UIPanGestureRecognizer *)gestureRecognizer;
        // allow horizontal pans to begin
        ULPanningTableViewCell *cell = (ULPanningTableViewCell *)[panGR view];
        CGPoint translation = [panGR translationInView:[cell superview]];
        BOOL should = (fabs(translation.x) / fabs(translation.y) > 1) ? YES : NO;

        if (!should) 
            [self closeOpenCellAnimated:YES];
        

        return should;

     else 
        NSLog(@"%@",gestureRecognizer);
        return NO;
    

【讨论】:

以上是关于为啥我的子类 UItableView 不滚动?的主要内容,如果未能解决你的问题,请参考以下文章

我的 UITableView 不会向下滚动到数据的末尾!为啥?

如何让 UI 组件与我的 UITableView 一起滚动

我的可滚动 ui 堆栈视图中有空格,我不知道为啥

为啥我的 UITableView 单元格在滚动时重叠?

为啥我的 UITableView 滚动偏移在返回其视图时最终落在 UISearchController 后面?

为啥第一次滚动到另一个 UITableView 中的 UICollectionView 中的 UITableView 不加载数据?