I have an image which height is about 1,5 screen on iPhone. I want to make it as a continuous background of UITableView. It have to scroll with the table. Is there any way to do it?
6 に答える
この画像を、テーブル ビューの背景として無期限に繰り返すことができるパターンに変えることができます。まず、これを行います:
UIColor *backgroundPatternColor = [UIColor colorWithPatternImage:myImage];
次に、テーブル ビューまたはその他のビューの背景色を に設定しますbackgroundPatternColor
。
簡単な解決策があります。
このコードを使用して、テーブル ビューの背景パターン イメージを設定します (パターン イメージは、並べて表示する小さなイメージの場合があります)。
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"back"]];
}
タイル張りの画像は、上下に無限にタイル張りされ、tableView でスクロールされます。
次に、次の重要なトリックを実行します。tableView backgroundColor を設定すると、タイル張りの背景もセルに設定されるため、透明な背景色をセルに設定します。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.backgroundColor = [UIColor clearColor];
}
単純な tableView セルにこのアプローチを使用します。そうしないと、複雑なセルの背景が透明になり、パフォーマンスが低下します。
テーブルビューのスクロールは、テーブルセルが使用されていないときにキューに入れられ、ユーザーがスワイプ/スクロールしたときに新しいセルが再び必要になったときにデキューされるという点で、主に幻想です。これは、画面に表示されているものがトレッドミルのベルトのようなトレッドミル効果と呼ばれることがよくあります。ビューポート内にのみ存在し、それ以外の場合は表示されますが、実際にはそれ以上スクロールしません。これは、テーブルビューの背景画像が所定の位置に固定され、セルと一緒にスクロールしないことを意味します。
画像がセルと一緒にスクロールする場所で必要なことを行う唯一の方法は、画像をセルのサイズに分割し、各セルの背景をそのインデックスパスの画像に設定することだと思います。
したがって、次のようなテーブルビューがあるとします。
CELLS INDEX PATH
|----------------------|
| | | 0, 0
|----------------------|
| / \ | 0, 1
|----------------------|
| YOUR IMAGE | 0, 2
|----------------------|
| HERE | 0, 3
|----------------------|
| \ / | 0, 4
|----------------------|
画像をセルに適した高さの同じサイズのパーツに事前にスライスします。次に、インデックスパスの行を取得し、それにcellForRowAtIndexPath
基づいてセルの背景画像を設定できます。画像の高さよりも多くのセルがある場合、最終的に画像が不足する可能性がありますが、これは非常に簡単に確認できます。
画像にbackground_0.png、background_1.pngなどの名前を付けた場合は、次のように必要な画像を取得できます。
UIImage *imageForCell = [UIImage imageNamed:[NSString stringWithFormat:@"background_%d", [indexPath row]]];
[[cell backgroundImageView] setImage:imageForCell];
backgroundImageView
カスタムセルに追加した画像ビューはどこにありますか。
テーブルのタイル張りのスクロール背景を求めています。タイルでスクロールするものに通常使用する UI はテーブルです。したがって、背景には表を使用してください:)
backgroundTableView と contentTableView の 2 つのテーブルが必要です。contentTableView は必要なものですが、セルとテーブルの背景色とビューを clear/nil に設定してください。
backgroundTableView にはタイル画像が含まれます。つまり、すべてのセルがタイル画像の高さであり、タイル画像が含まれている必要があります。
次に、contentTableView をスクロールするときに、一致するように backgroundTableView の contentOffset を更新します。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == self.contentTableView) {
self.backgroundTableView.contentOffset = self.contentTableView.contentOffset;
}
}
コントローラーを dataSource として設定し、両方のテーブルのデリゲートを確認してください。また、少なくとも contentTableView の最後までスクロールし続けることができるように、backgroundTableView に十分な「コンテンツ」(行数 * 高さ) があることを確認してください。
やった!
UITableView は UIScrollView を継承しています。画像を UITableView 階層のカスタム サブビューとして追加することをお勧めします。
UIImageView *imageView = [UIImageView alloc] initWithImage:myImage];
[self.tableView insertSubview:imageView atIndex:0];
ここで、UITableView をサブクラス化し、独自の実装を提供する必要がある場合があります。
- (void)layoutSubviews
{
[super layoutSubviews];
[self sendSubviewToBack:myImageView];
}
このコードを頭のてっぺんから引っ張り出したところなので、いじる必要があるかもしれません。
画像をテーブルの背景ビューとして設定するだけです。
self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"YOUR_BACKGROUND_IMAGE"]];