放射状グラデーションの背景を持つ ViewController があります。その中に、セルとセクションを含む UITableView があります。ここで、スクロール時にテーブル ビューの背後にグラデーションを表示したいと考えています。問題は、セクションが上部でロックされると、セクションの後ろにセルが表示されることです。セクションの背景色を設定しますが、そうすると、放射状のグラデーションの背景と一致しません。clearColor の背景を維持しながら、セルをセクションの下にクリップする方法はありますか?
2 に答える
独自のヘッダー ビューを作成せずに、透明なセクション ヘッダーを取得する簡単な方法。
- (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];
私がそれを理解していれば、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];
基本的な考え方はマスクです。テーブルビューの上部に、セクション ヘッダーと同じサイズのマスク形状を作成します。セルがその後ろに「消える」ように見えます。少しトリッキーですが、うまくいきます。