Почему моя проклассифицированная прокрутка UItableView не выполняется? - PullRequest
0 голосов
/ 31 марта 2012

Я пишу приложение для 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 делает вуду с цепочкой респондента ...

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

1 Ответ

0 голосов
/ 02 апреля 2012

Хорошо, я чувствую себя очень глупо.-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;
    }
}
...