Почему мой подкласс UItableView не прокручивается?

Я пишу приложение iOS 5 (в Xcode 4.3, используя раскадровки и ARC), в котором есть несколько ячеек таблицы, которые должны реагировать на горизонтальные панорамы. У меня была настройка стола, которая работала очень хорошо, но затем мне нужно было реализовать такое же поведение в другой сцене. Я решил, что лучшим способом будет абстрагировать код распознавания и обработки жестов в подклассы. Но теперь tableView не будет прокручиваться, и решение, которое у меня было для этой проблемы по старому методу, не помогает.

У меня есть RestaurantViewController, который наследуется от UIViewController и имеет свойство ULPanningTableView *tableView. Некоторые из ячеек таблицы имеют номер MenuItemCell и наследуются от 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 были реализованы в MenuItemCell. По сути, я возвращал NO для жестов, где translationInView был более вертикальным, чем горизонтальным). Во всяком случае, я не могу заставить таблицу прокручиваться! Я могу заставить жесты панорамирования распознаваться, если я верну YES из gestureRecognizerShouldBegin: или полностью удалю реализацию UIGestureRecognizerDelegate.

Я все еще новичок в iOS и в Objective-C, поэтому у меня есть только догадки, основанные на том, что я читал, и я под впечатлением от похожая проблема, что виновник UIScrollViewPanGestureRecognizer занимается вуду с цепочкой ответчика...

Я был бы очень признателен за любой свет, который вы можете пролить на это!


person Spencer Williams    schedule 31.03.2012    source источник
comment
Вы пытаетесь переместить представление в ячейке или пытаетесь прокрутить содержимое ячейки по горизонтали?   -  person NJones    schedule 01.04.2012
comment
Горизонтальное панорамирование должно перемещать представление в ячейке. Я не мог понять, как взаимодействовать с содержимым ячейки, чтобы показать ее backgroundView, поэтому я перемещаю пользовательское свойство ячейки UIView *frontView. Вертикальное панорамирование должно прокручивать таблицу.   -  person Spencer Williams    schedule 02.04.2012


Ответы (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;
    }
}
person Spencer Williams    schedule 02.04.2012