8

放射状グラデーションの背景を持つ ViewController があります。その中に、セルとセクションを含む UITableView があります。ここで、スクロール時にテーブル ビューの背後にグラデーションを表示したいと考えています。問題は、セクションが上部でロックされると、セクションの後ろにセルが表示されることです。セクションの背景色を設定しますが、そうすると、放射状のグラデーションの背景と一致しません。clearColor の背景を維持しながら、セルをセクションの下にクリップする方法はありますか?

4

2 に答える 2

10

独自のヘッダー ビューを作成せずに、透明なセクション ヘッダーを取得する簡単な方法。

- (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];
    }
}

このコードは、iOS 7 で問題なく動作します。

EDIT これは少し遅れていることは知っていますが、これに伴い、uitableviewの背景色(および背景ビューの背景色?)も明確になるように2行追加する必要があります。

tableView.backgroundColor = [UIColor clearColor];
tableView.backgroundView.backgroundColor = [UIColor clearColor];
于 2014-03-24T16:32:52.647 に答える
8

私がそれを理解していれば、View Controllerの背景を見ることができるように、完全に明確なテーブルビューとテーブルビューセルが必要です。

テーブルビューを背景なしに設定することでこれを実現できます

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

そしてセルも

cell.backgroundColor = [UIColor clearColor]

セクションも透明にしたい場合は、次の方法を使用できます。

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

カスタム ビューを作成する (たとえば、背景に透明な .png を使用してイメージ ビューを作成する)

あなたの質問を正しく理解していることを願っています。


明確化後に編集

セクション ヘッダーの下に移動する前にセルが停止するように表示するには、次のようにします。

この ivar を使用して、uitableview のサブクラスであるクラスを作成します。

@interface CustomTableView : UITableView
{
        CAGradientLayer* maskLayer;
}

明らかにこれによりグラデーションが作成されますが、必要に応じて微調整するかCALayer、プログラムでマスクを作成する代わりに使用して、セクションヘッダーの正しい幅/高さで .png を作成できます。

とにかく:を使用する場合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];
}

次に、View Controllerで次のようにします。

   CustomTableView *_tableView; //ivar

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

基本的な考え方はマスクです。テーブルビューの上部に、セクション ヘッダーと同じサイズのマスク形状を作成します。セルがその後ろに「消える」ように見えます。少しトリッキーですが、うまくいきます。

于 2012-10-05T18:01:16.887 に答える