2010-12-01 6 views
36

나는 스크린 샷을보기 위해 AppStore 앱과 똑같은 효과를 만들려고합니다. UITableView 안에는 UITableViewCell의 사용자 정의 하위 클래스가 있습니다. 그 중 하나는 일부 제품 (예 : 4 개 이미지)의 미리보기를 표시하도록 설계되었습니다. AppStore가 앱의 스크린 샷을 보여주는 것과 같은 방식으로 보여주기를 바란다 : UISageControl이 부착 된 수평 UIScrollView 내부.UITableViewCell 안에 수평 UIScrollView

그래서 난 그냥 그렇게, 내있는 UIScrollView 내있는 UITableViewCell 내 UIPageControl을 추가

@implementation phVolumePreviewCell 
- (id)init { 
    if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kVolumePreviewCellIdentifier]) { 
     [self setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; 
     [self setSelectionStyle:UITableViewCellSeparatorStyleNone]; 

     previews = [[NSMutableArray alloc] initWithCapacity:4]; 
     for (int i = 0; i < 4; i++) { 
      [previews addObject:@"dummy"]; 
     } 

     scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; 
     [scrollView setPagingEnabled:YES]; 
     [scrollView setBackgroundColor:[UIColor grayColor]]; 
     [scrollView setIndicatorStyle:UIScrollViewIndicatorStyleBlack]; 
     [scrollView setShowsHorizontalScrollIndicator:YES]; 
     [scrollView setBounces:YES]; 
     [scrollView setScrollEnabled:YES]; 
     [scrollView setDelegate:self]; 
     [self.contentView addSubview:scrollView]; 
     [scrollView release]; 

     pageControl = [[UIPageControl alloc] initWithFrame:CGRectZero]; 
     [pageControl setNumberOfPages:[previews count]]; 
     [pageControl setBackgroundColor:[UIColor grayColor]]; 
     [self.contentView addSubview:pageControl]; 
     [pageControl release]; 
    } 
    return self; 
} 

(참고 : 난 그냥 [미리보기를하기 위해 여기 더미 데이터로 "미리보기"를 채우는거야 카운트], 작동하도록 scrollView의 스크롤 표시기를 테스트 목적으로 만 보려면 나중에 숨길 것입니다.

내 문제는이 phVolumePreviewCell (UITableViewCell의 하위 클래스)가 포함 된 전체 UITableView를 스크롤 할 수 있지만 UIScrollView를 스크롤 할 수 없다는 것입니다. 이것을 어떻게 할 수 있습니까?

찾을 수있는 유일한 정보는 다음과 같습니다. http://theexciter.com/articles/touches-and-uiscrollview-inside-a-uitableview.html 하지만 오래된 SDK (즉, 2.2)에 대해 이야기하고 있으며이를 수행하는 데 "최근"의 접근 방법이있을 것입니다.

일부 정밀도 :

  • 나는 두 손가락으로있는 UIScrollView를 스크롤 할 수 있습니다. 그게 내가 원하는 건 아니에요, 한 손가락으로 만 스크롤 할 수 있기를 바랍니다.
  • 두 손가락으로 스크롤 할 때 TableView는 여전히 터치를 가로 채고 위쪽 또는 아래쪽으로 조금 스크롤합니다. 내가 ScrollView 만질 때 그 위치에 스틱 TableView 싶습니다.

나는 내가있는 TableView에 접촉을 차단하는 방법을 일해야 믿고, 터치가 phVolumePreviewCell (사용자 정의있는 UITableViewCell 서브 클래스)에있는 경우의 TableView에 처리하는 대신 셀에 전달합니다. 기록을 위해

은 내있는 TableView가있는 UITableViewController 하위 클래스에서 프로그래밍 방식으로 생성된다 : 어떤 도움

@interface phVolumeController : UITableViewController <UITableViewDelegate> { 
    LocalLibrary *lib; 
     NSString *volumeID; 
     LLVolume *volume; 
} 

- (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID; 
@end 

@implementation phVolumeController 

#pragma mark - 
#pragma mark Initialization 

- (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID { 
    if (self = [super initWithStyle:UITableViewStylePlain]) { 
     lib   = [newLib retain]; 
     volumeID  = newVolumeID; 
     volume  = [(LLVolume *)[LLVolume alloc] initFromLibrary:lib forID:volumeID]; 
     [[self navigationItem] setTitle:[volume title]]; 
    } 
    return self; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVolumePreviewCellIdentifier]; 
    if (cell == nil) { 
     cell = [[[phVolumePreviewCell alloc] init] autorelease]; 
    } 

    [(phVolumePreviewCell *)cell setVolume:volume]; 
    return (UITableViewCell *)cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return kVolumePreviewCellHeight; 
} 

감사합니다!

답변

21

해결 방법을 발견했습니다.

아주 간단한 UITableView (8 개 행)를 처음부터 다시 만들고 두 번째 행에 UIScrollView를 삽입하면 완벽하게 작동합니다. 중첩 된 스크롤 뷰 (TableView 및 ScrollView)는 예상대로 독립적으로 스크롤됩니다. 이 모든 작업은 AppDelegate의 단일 파일 테스트 프로젝트에서 수행되었습니다.

그래서 처음에는 "위임 문제 일 수 있습니다"라고 생각했기 때문에 위의 TableView는 내 custom TableViewCell 하위 클래스가 아니라 scrollView에 전달했습니다. 아무 소용이 없다.

그런 다음 ScrollView와 PageControl을 추가하는 사용자 정의 된 TableViewCell 하위 클래스 대신에 TableView의 cellForRowAtIndexPath : 메서드에서 일반 TableViewCell을 만드는 방법을 사용했습니다. 그런 다음 TableViewCell을 초기화 한 직후에 UIScrollView를 만든 다음 TableViewCell에 추가하고 shazam ... 작동합니다!

전 :

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVolumePreviewCellIdentifier]; 
if (cell == nil) { 
    cell = [[[phVolumePreviewCell alloc] init] autorelease]; 
} 

[(phVolumePreviewCell *)cell setVolume:volume]; 
// That does the job of creating the cell's scrollView and pageControl 

return (UITableViewCell *)cell 

후 :

도대체 내가 TVCell 서브 클래스에서 내있는 ScrollView를 만들 때, 그것은 좋은 재생되지 않습니다 오는 방법
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kvcPreviewRowIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kvcPreviewRowIdentifier] autorelease]; 

    previewScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, kvcPreviewScrollViewHeight)]; 
    [previewScrollView setContentSize:CGSizeMake(1000, kvcPreviewScrollViewHeight)]; 
    [[cell contentView] addSubview:previewScrollView]; 

    previewPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, kvcPreviewScrollViewHeight, tableView.frame.size.width, kvcPreviewPageControlHeight)]; 
    [previewPageControl setNumberOfPages:4]; 
    [[cell contentView] addSubview:previewPageControl]; 
} 

return (UITableViewCell *)cell; 

; 하지만 "클래식"TVCell을 만든 직후에 TableView에서 scrollView를 만들면 작동합니까?

나는 해결책을 찾았을지 모르지만, 나는 아직도 그 이유에 의아해하고있다.

+0

감사합니다. Cyrille !! 같은 문제가 있습니다. 당신의 솔루션은 절망적으로 많은 시간을 절약 해주었습니다 !! :-) –

+0

안녕하세요 Cyrille - 이건 오래된 질문입니다.하지만이 솔루션에 대한 샘플 앱이 있는지 궁금합니다. 감사합니다 .. – Craig

+0

@Craig : 샘플 앱이 없습니다, 죄송합니다. 이 코드는 그 이후로 발전했으며 더 이상이 코드를 사용하지 않습니다. 하지만 실제로이 상황을 재현하는 데 필요한 모든 코드가 제 게시물에 있습니다. – Cyrille