ヘッダーでセルをマスクしますが、背景はマスクしません。
Appleの通知センター(iPhoneのステータスバーを下にスワイプしたとき)に似た透明なヘッダーとセルを備えたUITableViewがあります。セルをマスクして、スクロール時にヘッダーの下に表示されないようにする方法がわかりません。
テーブルビューのcontentInsetsを変更してみました。また、ヘッダービューのフレームを負の原点に変更してみました。
ヘッダーでセルをマスクしますが、背景はマスクしません。
Appleの通知センター(iPhoneのステータスバーを下にスワイプしたとき)に似た透明なヘッダーとセルを備えたUITableViewがあります。セルをマスクして、スクロール時にヘッダーの下に表示されないようにする方法がわかりません。
テーブルビューのcontentInsetsを変更してみました。また、ヘッダービューのフレームを負の原点に変更してみました。
UITableviewCell
これらのメソッドのサブクラスを作成して追加してみてください
- (void)maskCellFromTop:(CGFloat)margin {
self.layer.mask = [self visibilityMaskWithLocation:margin/self.frame.size.height];
self.layer.masksToBounds = YES;
}
- (CAGradientLayer *)visibilityMaskWithLocation:(CGFloat)location {
CAGradientLayer *mask = [CAGradientLayer layer];
mask.frame = self.bounds;
mask.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithWhite:1 alpha:0] CGColor], (id)[[UIColor colorWithWhite:1 alpha:1] CGColor], nil];
mask.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:location], [NSNumber numberWithFloat:location], nil];
return mask;
}
このデリゲートメソッドを追加しますUITableView
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
for (iNotifyTableViewCell *cell in self.visibleCells) {
CGFloat hiddenFrameHeight = scrollView.contentOffset.y + [iNotifyHeaderView height] - cell.frame.origin.y;
if (hiddenFrameHeight >= 0 || hiddenFrameHeight <= cell.frame.size.height) {
[cell maskCellFromTop:hiddenFrameHeight];
}
}
}
※[iNotifyHeaderView height]
の高さですHeaderView
。#import <QuartzCore/QuartzCore.h>
カスタムセルに使用します。
UITableViewCell のサブクラスの作成をスキップできる Alex Markman の回答を少し編集します。このアプローチの利点は、複数の異なる UITableViewCells に使用できることです。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
for (UITableViewCell *cell in self.tableView.visibleCells) {
CGFloat hiddenFrameHeight = scrollView.contentOffset.y + self.navigationController.navigationBar.frame.size.height - cell.frame.origin.y;
if (hiddenFrameHeight >= 0 || hiddenFrameHeight <= cell.frame.size.height) {
[self maskCell:cell fromTopWithMargin:hiddenFrameHeight];
}
}
}
- (void)maskCell:(UITableViewCell *)cell fromTopWithMargin:(CGFloat)margin
{
cell.layer.mask = [self visibilityMaskForCell:cell withLocation:margin/cell.frame.size.height];
cell.layer.masksToBounds = YES;
}
- (CAGradientLayer *)visibilityMaskForCell:(UITableViewCell *)cell withLocation:(CGFloat)location
{
CAGradientLayer *mask = [CAGradientLayer layer];
mask.frame = cell.bounds;
mask.colors = [NSArray arrayWithObjects:(id)[[UIColor colorWithWhite:1 alpha:0] CGColor], (id)[[UIColor colorWithWhite:1 alpha:1] CGColor], nil];
mask.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:location], [NSNumber numberWithFloat:location], nil];
return mask;
}
迅速なバージョン
func scrollViewDidScroll(_ scrollView: UIScrollView) {
for cell in tableView.visibleCells {
let hiddenFrameHeight = scrollView.contentOffset.y + navigationController!.navigationBar.frame.size.height - cell.frame.origin.y
if (hiddenFrameHeight >= 0 || hiddenFrameHeight <= cell.frame.size.height) {
maskCell(cell: cell, margin: Float(hiddenFrameHeight))
}
}
}
func maskCell(cell: UITableViewCell, margin: Float) {
cell.layer.mask = visibilityMaskForCell(cell: cell, location: (margin / Float(cell.frame.size.height) ))
cell.layer.masksToBounds = true
}
func visibilityMaskForCell(cell: UITableViewCell, location: Float) -> CAGradientLayer {
let mask = CAGradientLayer()
mask.frame = cell.bounds
mask.colors = [UIColor(white: 1, alpha: 0).cgColor, UIColor(white: 1, alpha: 1).cgColor]
mask.locations = [NSNumber(value: location), NSNumber(value: location)]
return mask;
}
クリーンスウィフト 3 バージョン:
extension YourViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
for cell in tableView.visibleCells {
let hiddenFrameHeight = scrollView.contentOffset.y + navigationController!.navigationBar.frame.size.height - cell.frame.origin.y
if (hiddenFrameHeight >= 0 || hiddenFrameHeight <= cell.frame.size.height) {
if let customCell = cell as? CustomCell {
customCell.maskCell(fromTop: hiddenFrameHeight)
}
}
}
}
}
class CustomCell: UITableViewCell {
public func maskCell(fromTop margin: CGFloat) {
layer.mask = visibilityMask(withLocation: margin / frame.size.height)
layer.masksToBounds = true
}
private func visibilityMask(withLocation location: CGFloat) -> CAGradientLayer {
let mask = CAGradientLayer()
mask.frame = bounds
mask.colors = [UIColor.white.withAlphaComponent(0).cgColor, UIColor.white.cgColor]
let num = location as NSNumber
mask.locations = [num, num]
return mask
}
}
私はこれを使用しただけで、魅力のように機能します。投稿の皆さんに感謝したいです!あちこちで投票!
セクション ヘッダーの高さを最小に設定し、UITableView の layoutSubviews をオーバーライドしてヘッダーを tableView のスーパービューに配置し、フレームの原点をその高さだけ上向きに調整しました。
私には2つの可能な解決策があり、コードはありません-アイデアだけです:
セクション ヘッダーを不透明にし、テーブルの背景パターンをセクション ヘッダーの背景として「複製」します。セクション ヘッダーのオフセットに応じて背景パターンを配置します。
すべてのセル レイヤーにアルファ マスクを追加します。セルの位置に応じてアルファ マスクを移動します。
(背景パターン/アルファマスク オフセットを維持するには、scrollViewDidScroll デリゲート メソッドを使用します)。
または、UI の見栄えだけが必要な場合は、
すばやく簡単な 2 つの手順 (iOS 6):
UITableView スタイルを UITableViewStyleGrouped に変更します。(ストーリーボード/NIB から、またはコードを介してこれを行うことができます。)
次に、テーブルビューのバックグラウンド ビューを空のビューに設定します [ viewDidAppearなどのメソッド または cellForRow メソッドのいずれかで (前者の方が望ましいですが)]。
yourTableView.backgroundView = [[UIView alloc] initWithFrame:listTableView.bounds];
これでテーブル ビューが作成されましたが、フローティング セクション ヘッダーはありません。セクション ヘッダーがセルと一緒にスクロールするようになり、面倒な UI の問題が解決されました。
これを試してみて、どうなるか教えてください。ハッピーコーディング:)
編集: iOS 7 の場合、テーブル ビュー スタイルを「UITableViewStyleGrouped」に変更し、ビューの色合いを「クリア カラー」に変更するだけです。