2012-10-05 15 views
7

Ich habe einen ViewController mit einem radialen Hintergrund mit Farbverlauf. Darin habe ich eine UITableView mit Zellen und Abschnitten. Jetzt möchte ich den Verlauf hinter der Tabellenansicht beim Scrollen anzeigen. Das Problem ist, dass wenn die Sektion oben gesperrt ist, Sie die Zellen hinter der Sektion sehen können. Ich würde die Schnitthintergrundfarbe einstellen, aber wenn ich das tue, entspricht es dem radialen Steigungshintergrund nicht. Gibt es trotzdem die Möglichkeit, die Zellen unter die Abschnitte zu schneiden, während der ClearColor-Hintergrund beibehalten wird?UITableView Abschnitt mit clearColor Hintergrund?

+0

können Sie einen Screenshot hochladen? Es ist schwer, dies zu visualisieren. –

+0

Sie können tableview.backgroundColor = [UIColor clearColor]; – kamleshwar

Antwort

8

Wenn ich es verstehe, möchten Sie eine vollständig klare Tabellenansicht und Tabellenansicht Zelle, so dass Sie den Hintergrund Ihres View-Controller sehen können.

Sie können dies erreichen, indem die Tableview Einstellung als

tableview.backgroundColor = [UIColor clearColor]; 
tableView.opaque = NO; 
tableView.backgroundView = nil; 

und auch die Zelle keinen Hintergrund mit

cell.backgroundColor = [UIColor clearColor] 

, wenn Sie auch den Abschnitt wollen transparent sein, Sie diese Methode verwenden können:

, um eine benutzerdefinierte Ansicht zu erstellen (zum Beispiel erstellen Sie eine Bildansicht mit einem transparenten t .png für den Hintergrund)

Ich hoffe, ich verstehe Ihre Frage richtig.


bearbeiten nach Klärung

den Anschein zu erwecken, dass die Zellen, bevor sie unter dem Abschnitt Kopf stoppen:

eine Klasse machen, die eine Unterklasse von UITableView mit diesem Ivar ist:

@interface CustomTableView : UITableView 
{ 
     CAGradientLayer* maskLayer; 
} 

offensichtlich wird dies einen Farbverlauf erstellen, aber wenn Sie wollten, könnten Sie es entweder zwicken oderverwendenund erstellen Sie anstelle der programmgesteuerten Erstellung der Maske ein PNG mit der korrekten Breite/Höhe des Abschnittsheaders.

ANYWAY: Wenn Sie die CAGradientLayer:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) 
    { 
     [self setupGradients]; //call your method 
    } 
    return self; 
} 

- (void)setupGradients 
{ 
    [self addObserver:self forKeyPath:@"contentOffset" options:0 context:nil]; 

    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 
    //maskLayer = [[CALayer layer] retain]; 
    //maskLayer.contents = (id) [UIImage imageNamed:@"maskLayer.png"].CGImage; 
    //maskLayer.backgroundColor = [UIColor clearColor].CGColor; 
    */ ***** if you choose to use CALayer instead of CAGradient ****** */ 

    maskLayer = [[CAGradientLayer layer] retain]; 

    CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor; 
    CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor; 

    maskLayer.colors = [NSArray arrayWithObjects:(id)outerColor, 
         (id)innerColor, (id)innerColor, (id)outerColor, nil]; 
    maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.0], 
          [NSNumber numberWithFloat:0.9], 
          [NSNumber numberWithFloat:1.0], nil]; //this creates a gradient  effect. Tweak these numbers for a hard line. 

    maskLayer.bounds = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); 
    maskLayer.anchorPoint = CGPointZero; 

    self.layer.mask = maskLayer; 
    } 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{   
    [CATransaction begin]; 
    [CATransaction setDisableActions:YES]; 
    maskLayer.position = CGPointMake(0, self.contentOffset.y); 
    [CATransaction commit]; 
} 

dann in Ihrem View-Controller:

CustomTableView *_tableView; //ivar 

    _tableView = [[CustomTableView alloc] initWithFrame:YOUR_FRAME]; 

Die Grundidee eine Maske ist, können Sie eine Maskenform auf der Oberseite Ihrer Tableview erstellen Das ist die gleiche Größe wie die Abschnittsüberschrift. Es wird erscheinen, dass die Zellen dahinter "verschwinden". Es ist ein bisschen schwierig, aber es wird funktionieren.

+2

Sie verstehen, was ich zu erreichen versuche, aber nicht das Problem, das ich habe. Das Problem ist, dass meine Abschnitte transparent sind, so dass Sie die Zellen sehen können, wenn sie hinter dem Abschnitt vorbeigehen. Dies erzeugt eine Mischung aus Zelle und Abschnitt, die schrecklich aussieht. Ich schätze die Antwort, danke, – Bobbake4

+0

ah verstehe ich jetzt. Interessante Frage. Ich habe eine Vorstellung davon, wie Sie es tun können, aber es ist ein bisschen hacky. Ich werde meine Antwort oben bearbeiten. – sixstatesaway

10

Einfache Möglichkeit, einen transparenten Abschnitt Header ohne eigene Header-Ansichten zu erstellen.

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
{ 
    if ([view isKindOfClass:[UITableViewHeaderFooterView class]]) { 
     UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view; 
     headerView.contentView.backgroundColor = [UIColor clearColor]; 
     headerView.backgroundView.backgroundColor = [UIColor clearColor]; 
    } 
} 

Dieses Stück Code funktioniert völlig in Ordnung in iOS 7.

EDIT Ich weiß, das ein wenig spät, aber zusammen mit diesem haben Sie 2 Zeilen hinzufügen, um die Hintergrundfarbe sicherstellen (und Hintergrundfarbe der Hintergrundansicht?) des uitableview ist auch klar.

tableView.backgroundColor = [UIColor clearColor]; 
tableView.backgroundView.backgroundColor = [UIColor clearColor]; 
+0

Perfekt! es hat für mich funktioniert. Vielen Dank –

Verwandte Themen