1

編集: 2013 年 1 月 12 日

重複した (回答された) 質問デモ プロジェクトのソースが反映されるように更新されました。
この質問を閉じて、適切な「複製」リンクを付けたいと思いますが、どちらの評判もありません。私はなんて悲しい小さな男だ...


免責事項: これは、見当違いの意図で取り組んでいる可能性のある非常に複雑なビューです。私は、これを機能させるために必要な重要な情報/ノウハウを欠いている可能性、iOS が単にできないことをしようとしている可能性、または完全に間違っている可能性を非常に受け入れています。これらのいずれかが当てはまる場合、私はそのように私を納得させる答えを喜んで受け入れるか、RTFMに行くかもしれないページ番号を付けて頭にドキュメント/重い本を投げます.

一般的な問題

大規模なアプリの 1 つのビューとして、4 つの主要な要素を備えた垂直スクロール画面をユーザーに表示しようとしています。上から下にリストすると、次のようになります。モノに関する一般的な情報 (UITextView)、関連するもののリスト (それぞれが実際のアプリの潜在的なセグエを表す UITableView)、その他の情報 (例では UILabel)、およびアクション可能なボタン (a UIButton)。関連する Stuff の TableView 内のセルの数は、提示される Thing によって異なります。そこで、tableView のサイズを調整し、それに応じて UILabel と UIButton を移動する方法を考え出しました (以下で詳しく説明します。viewDidAppear:)。それはすべてうまく機能し、ダンディでスクロールし、私を幸せにしますが、ボタンを押すと、フレームへのプログラムによる変更を完全に無視して、Interface Builder ビューで占める位置に戻ります。

質問)

なんで?
修正できますか (もしそうなら、どのように)?
異なる方法やより良い方法はありますか?

正確に何が起こっているかを示す写真を投稿したかったのですが、評判がないので、デモ プロジェクトの完全なソースを用意してください (上記を参照)。自由にコードをいじって、何が起こっているのかを直接確認してください。

すべての詳細

(これらは飛ばしてもかまいません)
私が Interface Builder (およびコード) でまとめた画面は、次のように構成されています。

View Controller -- Doing what it does.
* UIView -- Used to set a static background.
  * UIScrollView -- Sized to the parent view, used for scrolling
    * UIView -- Width equal to ScrollView, height is arbitrarily large (1200 in my project)
                We shall call him "subScrollView"
      * Content
      * More Content

ViewController のviewDidAppear:メソッドでコンテンツ ビューのサイズ/位置の変更を実行する必要があります。変更をすぐに行うと、ビューが実際に表示されるまでには至らないためです。
subScrollView が必要な (または単に持っている?) 理由は、すべてのコンテンツ ビューが ScrollView のサブビューである場合、スクロールが発生するたびに上記の問題が発生するためです。たとえば、ビューが表示され、テーブルのサイズが変更され、ボタンが移動します。 、次にユーザーがシーンをスクロールすると、テーブルは Interface Builder で指定されたサイズに戻り、ボタンは元の位置に戻ります。

コンテンツビューを調整するために使用しているコードは次のとおりです。

なぜEvenViewController.h

@interface whyEvenViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (weak, nonatomic) IBOutlet UILabel *wasteMoreSpaceLabel;
@property (weak, nonatomic) IBOutlet UIButton *aButton;

@property (nonatomic) NSInteger tableViewRowCount;

@end

なぜEvenViewController.m

- (void)viewDidAppear:(BOOL)animated
{
    // Here's where we resize and move everything. If we attempt to make these
    // changes before this (e.g. in viewDidLoad, viewWillAppear:, or even
    // viewDidLayoutSubviews) they get changed back before this view transitions
    // onto the screen, be it from a Navigation Bar push, or opening the app.

    [super viewDidAppear:animated];

    // Get used to this guy. He's going to be helping us resize frames.
    CGRect newFrame;

    // Set the tableView's frame height to the height of its contentSize which
    // so the entire table (no mater how large it is) is visible.
    newFrame = self.tableView.frame;
    newFrame.size.height = self.tableView.contentSize.height;
    self.tableView.frame = newFrame;

    // Move the wasteMoreSpaceLabel to just below the tableView
    newFrame = self.wasteMoreSpaceLabel.frame;
    newFrame.origin.y = self.tableView.frame.origin.y + self.tableView.frame.size.height - 20;
    self.wasteMoreSpaceLabel.frame = newFrame;

    // Move aButton to just below the wasteMoreSpaceLabel
    newFrame = self.aButton.frame;
    newFrame.origin.y = self.wasteMoreSpaceLabel.frame.origin.y + self.wasteMoreSpaceLabel.frame.size.height + 8;
    self.aButton.frame = newFrame;

    // Set the size of the scroll view such that it ends 20 points below aButton.
    CGSize newSize = self.scrollView.contentSize;
    newSize.height = self.aButton.frame.origin.y + self.aButton.frame.size.height + 20;
    self.scrollView.contentSize = newSize;
}

このテキストの壁を乗り越えてくれてありがとう、そしてあなたの時間をありがとう。

4

0 に答える 0