29

ストーリーボードを使用して、 を の中にimageViewとして配置しました。tableView's headerViewViewController

これが私のストーリーボードの設定方法です。

ここに画像の説明を入力

ユーザーが表示しているデータに応じて、 はviewControllerを表示または非表示にしheaderViewます。私の質問は、headerViewが表示され、ユーザーが を下にドラッグしたときに、と の間のスペースをカバーするためにサイズが変更されるときに、スティックを と の両方にtableView保持するにはどうすればよいかということです。imageViewnavigationBartableView

現在の動作は次のとおりです。

ここに画像の説明を入力

しかし、これは私がしようとしていることです:

ここに画像の説明を入力

どんな助けでも大歓迎です。私は視差ライブラリを見てきましたが、セクションタイトルをサポートしているものはなく、必ずしも視差効果を求めているわけでもありません。ユーザーが上にスクロールすると、通常のビューに戻り、headerView を非表示にしないようにします。ありがとう!

アップデート:

以下のダニーが投稿したアドバイスに従い、次のことを行いました。

-(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 の後ろの半分のように)、戻りません。どんなアドバイスでも大歓迎です!! ありがとう!

4

6 に答える 6

7

私は最近、役立つかもしれない制約を使用してこれを達成することについてのブログ投稿を投稿しましたが、それは非常に簡単であることがわかりました。

リンクは次のとおりです:制約を使用して UIScrollView に視差効果を作成する

于 2014-03-24T06:08:52.587 に答える
1

要件に従って同じ効果を実装するこのhttps://github.com/matteogobbi/MGSpotyViewControllerをご覧ください。

于 2015-07-23T07:59:45.860 に答える
1

このページの以前の解決策では、これをセクション タイトルとインデックス バーと一緒に機能させる必要があるときに問題が発生したため、次の代替案を自分で思いつきました。ご注意ください; 私は自分のプロジェクトで autolayout を使用しておらず、これを iOS9+ でのみテストしました。

プロジェクトのストーリーボードで:

  1. UIViewController 内に UITableView を作成します (または UITableViewController で試してください)。
  2. UIView を UITableView の上部 (ただし内部) にドロップすると、最初のセルの上のテーブル ヘッダーになります。
  3. このヘッダー ビューに希望の高さ (たとえば 200px など) を指定し、背景色を「クリア カラー」に設定します。クリアな色が重要です。ビューはシースルーである必要があります。
  4. テーブル ヘッダー UIView 内に 2 番目の UIView をドロップし、親と同じサイズにします。これが実際のヘッダーになるので、自由に色を付けたり、画像ビューやその他のコンテンツを設定したりしてください。
  5. この 2 番目の UIView を UIViewController IBOutlet に接続します。私の場合は「headerView」と名付けました。

次に、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 を使用できます。これは、セルとセクションのタイトルを一列に並べるためのスペーサーとして機能するため、テーブルに目的のヘッダーと同じ高さのクリアカラーヘッダービューが設定されていることを確認する限り.

編集:

これを達成するためのさらにクリーンな方法を見つけました。

  1. 上記のように、インターフェイス ビルダーでテーブル ヘッダーを作成します。
  2. 上記のコードをスキップしviewDidLoadます。UIView をコンテナーから引き出す必要はなく、テーブルの背景として設定する必要もありません。
  3. scrollViewDidScroll:メソッドを次のように変更します。

UIViewController.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;
    }
}

それでおしまい。他のソリューションとの視覚的な違いは、コンテンツが他のセルと重なるのではなく、残りのセルと一緒にスクロールアップすることだけです。

于 2016-06-11T05:16:16.117 に答える
0

これがあなたに役立つかどうかはわかりません..

スクロール デリゲートを自分自身に設定します。

そして、これを実装します:

-(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 
    }
}
于 2013-07-04T09:18:21.677 に答える