0

私は、水平パンに応答する必要があるいくつかのテーブルセルを持つiOS 5アプリ(StoryboardsとARCを使って、Xcode 4.3で)を書いています。私は本当にうまく動作するテーブル設定をしていましたが、別のシーンで同じ動作を実装する必要がありました。ベストプラクティスの方法は、ジェスチャ認識と処理のコードをサブクラスに抽象化することだと思いました。しかし、今、tableViewはスクロールせず、私が以前の方法でこの問題のために持っていた解決策は役に立たない。サブクラス化されたUItableViewがスクロールしないのはなぜですか?

私はUIViewControllerを継承し、ULPanningTableView *tableViewの属性を持っています。RestaurantViewControllerです。表のセルの一部はMenuItemCellで、ULPanningTableViewCellから継承しています。テーブルの代理人とデータソースはRestaurantViewControllerです。

ULPanningTableViewCellUITableViewCellから継承されており、セルの前後のビューとカスタム背景を追跡するためのプロパティを持っていることが唯一の違いです。

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ものRestaurantViewControllerULPanningTableViewCell内に実装されていたものはMenuItemCellに実装されていました。彼はtranslationInViewが水平よりも垂直でした)。とにかく、私はテーブルをスクロールすることはできません!私がgestureRecognizerShouldBegin:からYESを返した場合、またはUIGestureRecognizerDelegateの実装を完全に削除した場合、パンのジェスチャーを認識させることができます。

が、私はまだiOS版では初心者だし、Objective-Cで、私は唯一の私が読んだものに基づいて勘を持っている、と私は犯人であるsimilar problemからの印象の下だUIScrollViewPanGestureRecognizerでブードゥー教をしていますレスポンダーチェーン...

私はあなたがこれに流すことができるすべての光に感謝します!

+0

あなたは、細胞内のビューを移動しようとしています。また、水平方向のセルの内容をスクロールしようとしていますか? – NJones

+0

水平パンでは、セル内のビューを移動する必要があります。私は 'backgroundView'を表示するためにセルの内容とやりとりする方法を理解できませんでしたので、' UIView * frontView'セルのカスタムプロパティを移動しています。垂直パンはテーブルをスクロールする必要があります。 –

答えて

0

私は本当にばかだと感じます。 -handlePan:は既に方法です!私はそれを-handleCustomPan:に変更し、通常は他のパンを扱います。なぜそれがクラッシュしていないのか分かりませんが、そこにはあります。ああ、私は-gestureRecognizerDidBegin:にUIScrollViewPanGestureRecognizerエッジケースを維持しなければならなかった:

- (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; 
    } 
} 
関連する問題