Poziomy UIScrollView wewnątrz UITableViewCell

Próbuję stworzyć dokładnie taki sam efekt jak w aplikacji AppStore do przeglądania zrzutów ekranu: Wewnątrz UITableView, mam własne podklasy UITableViewCell ' s. jeden z nich jest przeznaczony do wyświetlania podglądów jakiegoś produktu, powiedzmy 4 zdjęcia. Chcę, aby pokazywały się w taki sam sposób, jak AppStore prezentuje zrzuty ekranu aplikacji: wewnątrz poziomego UIScrollView z dołączonym Uipagecontroll.

Więc dodaję mój UIScrollView i mój UIPageControl do mojego UITableViewCell, tak jak że:

@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;
}

(Uwaga: wypełniam" podgląd " fałszywymi danymi, aby mieć [liczba podglądów], która działa ; chcę wyświetlić wskaźnik przewijania widoku tylko do celów testowych, ukryję je później).

Mój problem polega na tym, że mogę przewijać cały UITableView zawierający ten phVolumePreviewCell( podklasa UITableViewCell), ale nie mogę przewijać UIScrollView. Jak mogę to osiągnąć?

Jedyna informacja, którą znalazłem jest tam: http://theexciter.com/articles/touches-and-uiscrollview-inside-a-uitableview.html Ale mówi o starych SDK (mianowicie 2.2) i jestem pewien, że istnieje bardziej "najnowsze" podejście do tego.

Niektóre precyzje:

  • mogę przewijać UIScrollView dwoma palcami. Nie tego chcę, chcę, żeby było w stanie przewijać tylko jednym palcem.
  • kiedy przewijam dwoma palcami, TableView nadal przechwytuje dotknięcia i przewija się trochę na górę lub na dno. Chciałbym, aby Widok TableView trzymał się swojej pozycji, gdy dotknę widoku przewijania.

Uważam, że muszę wymyślić, jak przechwycić dotyki na moim TableView, i jeśli dotyk jest na phVolumePreviewCell( niestandardowa podklasa UITableViewCell), przekazać go do komórki zamiast obsługiwać go na TableView.

Dla przypomnienia, mój TableView jest tworzony programowo w podklasie 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;
}

Dzięki za pomoc!

Author: Cyrille, 2010-12-01

1 answers

Znalazłem obejście.

Odtworzenie od podstaw bardzo prostego widoku UITableView (8 wierszy) i wstawienie UIScrollView tylko w drugim wierszu, działa doskonale. Zagnieżdżone widoki przewijania (TableView i ScrollView) przewijają się niezależnie zgodnie z oczekiwaniami. Wszystko to zostało wykonane w jednym pliku projektu testowego, w AppDelegate.

Więc... najpierw pomyślałem "To może być problem z delegacją", więc powiedziałem scrollView, że jego delegatem jest TableView, a nie mój Niestandardowy TableViewCell podklasa. Bez skutku.

Następnie zamiast uciekać się do niestandardowej, czystej podklasy TableViewCell, która po prostu dodaje ScrollView i PageControl, uciekłem się do tworzenia zwykłej TableViewCell w TableView ' s cellForRowAtIndexPath: metoda. Następnie tworzę UIScrollView zaraz po zainicjowaniu TableViewCell, a następnie dodaję go do TableViewCell i shazam... to działa!

Przed:

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

Po:

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;

Jak to się dzieje, że kiedy tworzę mój scrollView z podklasa TVCell nie gra ładnie , ale kiedy tworzę scrollView z TableView zaraz po utworzeniu" klasycznej " TVCell, to działa?

Może znalazłem rozwiązanie, ale nadal jestem zdziwiony powodem.

 21
Author: Cyrille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 17:13:29