0

가로 팬에 응답해야하는 표 셀이있는 iOS 5 앱 (스토리 보드 및 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에 구현되었습니다. 본질적으로 제스처에 대해 NO를 반환합니다. 그는 translationInView가 수평보다 수직이었다. 어쨌든, 나는 테이블을 스크롤 할 수 없습니다! gestureRecognizerShouldBegin:에서 YES를 반환하거나 UIGestureRecognizerDelegate 구현을 완전히 제거하면 팬 동작을 인식 할 수 있습니다.

가 난 여전히 아이폰 OS에서 초보자 해요, 그리고 오브젝티브 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; 
    } 
}