가로 팬에 응답해야하는 표 셀이있는 iOS 5 앱 (스토리 보드 및 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
에 구현되었습니다. 본질적으로 제스처에 대해 NO를 반환합니다. 그는 translationInView
가 수평보다 수직이었다. 어쨌든, 나는 테이블을 스크롤 할 수 없습니다! gestureRecognizerShouldBegin:
에서 YES를 반환하거나 UIGestureRecognizerDelegate
구현을 완전히 제거하면 팬 동작을 인식 할 수 있습니다.
가 난 여전히 아이폰 OS에서 초보자 해요, 그리고 오브젝티브 C에, 그래서 난 단지 내가 읽은 것들을 기반으로 직감을 가지고, 내가 범인이다 similar problem에서 인상 해요 UIScrollViewPanGestureRecognizer
와 부두를하고 리스폰 더 체인 ...
나는이 빛을 비춰 줄 수있는 모든 빛을 매우 감사 할 것입니다!
당신은 셀에서보기를 이동하려고하거나 수평 셀의 내용을 스크롤하려고를? – NJones
가로 팬은 셀의 뷰를 이동해야합니다. 나는'backgroundView'를 보여주기 위해 셀의 내용과 어떻게 상호 작용 하는지를 알 수 없었기 때문에,'UIView * frontView' 셀의 커스텀 속성을 움직이고 있습니다. 수직 팬은 테이블을 스크롤해야합니다. –