私は、水平パンに応答する必要があるいくつかのテーブルセルを持つiOS 5アプリ(StoryboardsとARCを使って、Xcode 4.3で)を書いています。私は本当にうまく動作するテーブル設定をしていましたが、別のシーンで同じ動作を実装する必要がありました。ベストプラクティスの方法は、ジェスチャ認識と処理のコードをサブクラスに抽象化することだと思いました。しかし、今、tableViewはスクロールせず、私が以前の方法でこの問題のために持っていた解決策は役に立たない。サブクラス化されたUItableViewがスクロールしないのはなぜですか?
私はUIViewController
を継承し、ULPanningTableView *tableView
の属性を持っています。RestaurantViewController
です。表のセルの一部は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
:それはこれらが別々のクラスがなかったとき、私は戻って、この問題を解決する方法だったので、私は、gestureRecognizerShouldBegin:
の周りプレイしました
#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
(ULPanningTableView
ものRestaurantViewController
とULPanningTableViewCell
内に実装されていたものはMenuItemCell
に実装されていました。彼はtranslationInView
が水平よりも垂直でした)。とにかく、私はテーブルをスクロールすることはできません!私がgestureRecognizerShouldBegin:
からYESを返した場合、またはUIGestureRecognizerDelegate
の実装を完全に削除した場合、パンのジェスチャーを認識させることができます。
が、私はまだiOS版では初心者だし、Objective-Cで、私は唯一の私が読んだものに基づいて勘を持っている、と私は犯人であるsimilar problemからの印象の下だUIScrollViewPanGestureRecognizer
でブードゥー教をしていますレスポンダーチェーン...
私はあなたがこれに流すことができるすべての光に感謝します!
あなたは、細胞内のビューを移動しようとしています。また、水平方向のセルの内容をスクロールしようとしていますか? – NJones
水平パンでは、セル内のビューを移動する必要があります。私は 'backgroundView'を表示するためにセルの内容とやりとりする方法を理解できませんでしたので、' UIView * frontView'セルのカスタムプロパティを移動しています。垂直パンはテーブルをスクロールする必要があります。 –