Я пишу приложение 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
занимается вуду с цепочкой ответчика...
Я был бы очень признателен за любой свет, который вы можете пролить на это!
backgroundView
, поэтому я перемещаю пользовательское свойство ячейкиUIView *frontView
. Вертикальное панорамирование должно прокручивать таблицу. - person Spencer Williams   schedule 02.04.2012