ストーリーボードを使用して、imageView
をheaderView
内にtableView's
ViewController
として配置しました。
これは私のストーリーボードの設定方法です:
ユーザーが表示しているデータに応じて、viewController
はheaderView
を表示または非表示にします。私の質問は、headerView
が表示されていて、ユーザーがtableView
を下にドラッグすると、imageView
を両方のnavigationBar
とtableView
は、その間のスペースをカバーするようにサイズ変更されますか?
これが現在行っていることです:
しかし、これは私が目指していることです:
どんな助けでも大歓迎です。私は視差ライブラリを見てきましたが、sectionTitlesをサポートしているものはなく、必ずしも視差効果を使用する必要もありません。ユーザーが上にスクロールしたときに、headerViewを非表示にせずに、regularViewに跳ね返してほしい。ありがとう!
更新:
私は以下のダニーが投稿したアドバイスに従い、以下を行いました:
-(void)scrollViewDidScroll:(UIScrollView*)scrollView { CGRect initialFrame = CGRectMake(0, 0, 320, 160); if (scrollView.contentOffset.y < 0) { initialFrame.size.height =! scrollView.contentOffset.y; childHeaderView.frame = initialFrame; } }
childHeaderViewはimageViewであり、何らかの理由で下にドラッグすると、画像が(navBarの後ろの半分のように)上に移動して戻りません。何かアドバイスをいただければ幸いです!!ありがとう!
私は最近、制約を使用してこれを達成することについてブログ投稿を投稿しましたが、これは役立つ可能性があります。
これがリンクです: IScrollViewでの制約を使用した視差効果の作成
最初に、ヘッダーからUIImageView
を削除し、UIImageView
の上に単純なUITableView
として追加する必要があります。その後、UITableViewDelegate
プロトコルはUIScrollViewDelegate
プロトコルに準拠しているため、scrollViewDidScroll:
メソッドは、tableView
が下にスクロールしており、bouncing
の効果があるかどうかを確認します。このようなもの:
-(void)someInitMethod {
initialFrame = yourHeaderView.frame;
}
-(void)scrollViewDidScroll:(UIScrollView*)scrollView {
if(scrollView.contentOffset.y < 0) {
initialFrame.size.height -= scrollView.contentOffset.y;
yourHeaderView.frame = initialFrame;
}
}
また、contentMode
に適切なUIImageView
を設定してください。また、この実装はバウンス効果を生み出すと思いますが、今はテストできないのでわかりませんが、これはあなたにとって良い出発点だと思います。
これは私がそれを達成した方法です、私の場合、私は上部のマップビューを使用していました:
viewDidLoad
に以下を追加します:tableView.contentInset = UIEdgeInsetsMake(200, 0, 0, 0)
where 200
はビューの高さです。これにより、テーブルビューのコンテンツが下にプッシュされます。ビューコントローラーで、スクロールに基づいてビューのサイズを変更する次のコードを追加します。
func scrollViewDidScroll(scrollView: UIScrollView) {
var scrollOffset = scrollView.contentOffset.y
var headerFrame = mapView.frame
if (scrollOffset < 0) {
// Adjust map
headerFrame = CGRect(x: mapView.frame.Origin.x,
y: mapView.frame.Origin.y,
width: mapView.frame.size.width,
height: -scrollOffset)
} else {
// Adjust map
headerFrame = CGRect(x: mapView.frame.Origin.x,
y: mapView.frame.Origin.y,
width: mapView.frame.size.width,
height: 0)
}
mapView.frame = headerFrame
}
ストーリーボードからcontentInset
を設定できれば、さらにきれいになります
このページの以前の解決策では、これをセクションタイトルやインデックスバーと一緒に使用する必要があるときに問題が発生したため、次の代替案を自分で考えました。ご注意ください;私のプロジェクトではautolayoutを使用せず、iOS9以降でのみテストしました。
プロジェクトのストーリーボード:
次に、UIViewController.m:に移動します
- (void)viewDidLoad
{
[super viewDidLoad];
// Remove view from table header and place it in the background instead.
[self.headerView removeFromSuperview];
UIView *backgroundView = [UIView new];
[backgroundView addSubview:self.headerView];
self.tableView.backgroundView = backgroundView;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/* Set initialScrollOffset ivar to start offset, because in my case
the scroll offset was affected by the statusbar + navigation bar heights
and the view controller's "extend edges under top bars" option. */
initialScrollOffset = self.tableView.contentOffset.y;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
/* Modify headerView height only if the table content gets pulled
beyond initial offset. */
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height + -scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
この実装が必要だったのは、背景色とラベルが付いたストレッチヘッダーだけです。ただし、このヘッダーにUIImageViewを追加するのは簡単です。
また、手順1〜5は完全にオプションです。プログラムでヘッダービューを作成するか、代わりにXIBを使用できます。セルとセクションのタイトルを揃えるためのスペーサーとして機能するため、目的のヘッダーと同じ高さのクリアカラーのヘッダービューがテーブルに設定されていることを確認する限り。
編集:
私はこれを達成するためのもっとすっきりした方法を見つけました。
viewDidLoad
コードをスキップしてください。UIViewをコンテナーから取り出す必要はなく、テーブルの背景として設定する必要もありません。scrollViewDidScroll:
これにメソッド:IViewController.m:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.y < initialScrollOffset) {
CGRect frame = self.headerView.frame;
frame.size.height = self.tableView.tableHeaderView.frame.size.height - scrollView.contentOffset.y;
frame.Origin.y = self.tableView.tableHeaderView.frame.Origin.y + scrollView.contentOffset.y;
self.headerView.frame = frame;
}
}
それでおしまい。他のソリューションとの視覚的な違いは、コンテンツが他のセルと重なるのではなく、残りのセルとともに上にスクロールすることです。
これを見てください https://github.com/matteogobbi/MGSpotyViewController これは、要件ごとに同じ効果を実装します。
これがあなたに役立つかどうかはわかりません。
自分のスクロールデリゲートを設定します。
そしてこれを実装します:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
float scrollViewHeight = scrollView.frame.size.height;
float scrollContentSizeHeight = scrollView.contentSize.height;
float scrollOffset = scrollView.contentOffset.y;
if (scrollOffset == 0)
{
// then we are at the top
}
else if (scrollOffset + scrollViewHeight == scrollContentSizeHeight)
{
// then we are at the end
// Do what you need here
}
}