0

私のプロジェクトでは、iPhone 4 と iPhone 5 の両方でアプリを適切にスケーリングするために AutoLayout を有効にしました。そうすることですべてうまくいきましたが、対処方法がわからない新しい問題が見つかりました。

私のプロジェクトでは、ブール値がyesかnoかをチェックする通常のメソッドがあります.yesの場合、インターフェイスはインターフェイスにボタンを追加し、tableViewを現在の状態に保つ必要があります。しかし、メソッドが no を返した場合、ボタンは消えて、tableView の高さが高くなります! ボタンのすべてが正常に機能しますが、何らかの理由でAutoLayoutの使用を開始した後、tableViewの高さを上げるためのコードが機能しなくなりました(以前は機能していました)。

AutoLayout を使用している場合でも、tableView の高さを高くするにはどうすればよいですか? これが私のコードです:

- (void)viewWillAppear:(BOOL)animated
{
NSString *bookName = [self getCurrentBookName];

if([self isBlank:bookName])
{
    [self.currentBookLabel setText:NSLocalizedString(@"LabelNoBookChosen", nil)];
}
else
{
    [self.currentBookLabel setText:[self getCurrentBookName]];
}

[super viewWillAppear:animated];

  if([self isAppLicensed] != YES)   <------------------THIS IS WHERE I CHECK THE BOOLEAN METHOD!
{
    [actionAppStore setHidden:TRUE];

    CGRect framez =  [tableView frame]; <------------------ THIS CODE IS NOT WORKING ANY LONGER!
    [tableView setFrame:CGRectMake(framez.origin.x, framez.origin.y, framez.size.width, framez.size.height+77)];
}    
else
{
    [actionAppStore setHidden:FALSE];
}
}
4

2 に答える 2

3

次のいずれかを実行できます

  1. 自動レイアウトをオフにして、自動サイズ変更マスクを使用します。非自動レイアウトの自動サイズ変更マスクを使用すると、3.5 インチ画面と 4 インチ画面でコントロールのサイズを増減することについて、同じように制御できます。これはおそらく最も簡単な解決策です。また、iOS 5 デバイスとの互換性も提供します。

  2. IBOutlet自動レイアウトを使用する場合は、適切な制約の を作成し、それをプログラムで変更する必要があります。


後者の例では、テーブル ビューと下部にアプリ ストアのコントロールがあるレイアウトを考えてみましょう (これは変数名から推測しています)。下部のコントロールを表示または非表示にする方法は 2 つあります。1 つはそれを非表示にする (またはalpha0 または に設定するremoveFromSuperview) ことで、不要な制約を削除し、新しい適切な制約を再作成します。

それは機能しますが、面倒です。非表示にしたいものの高さをゼロに変更するか、すでに画面の端にある場合は、端からスライドさせて見えないようにすることをお勧めします。

したがって、アプリ ストア コントロールを視覚的に非表示にするには、hiddenそのプロパティをいじるのではなく、高さを 0 (または、表示するために 77) に変更します。そうすれば、他の制約によって他のコントロールのサイズが自動的に変更されます。したがって、次のように非表示にします。

        self.appStoreHeightConstraint.constant = 0.0;
        [self.view layoutIfNeeded];

そして、私は次のように示します:

        self.appStoreHeightConstraint.constant = 77.0;
        [self.view layoutIfNeeded];

その下のコントロールの高さの制約にリンクされているIBOutlet呼び出しでそれを行います。appStoreHeightConstraint

別の方法として (非表示になっているアイテムが下部にある場合のみ)、次のようにして、画面の下部からスライドさせることができます (今回IBOutletは下部の制約を使用)。

        self.appStoreBottomConstraint.constant = 77.0;
        [self.view layoutIfNeeded];

そしてそれを

        self.appStoreBottomConstraint.constant = 0.0;
        [self.view layoutIfNeeded];

完全な開示のために、制約の設計には細心の注意を払う必要があることを言及しておく必要があります。ただし、(b) レイアウトを完全に説明してください。恐ろしい矛盾や不満足な制約メッセージを避けたい.

縦方向の寸法のみに注目すると、次の制約があることを意味します。

  • テーブル ビューの上部の制約は、スーパービューの上部にありました。
  • テーブル ビューの下部の制約は、アプリ ストア ビューの上部にありました。
  • テーブル ビューには高さの制約があってはなりません(他の変更に合わせて変更する必要があるため)。
  • 下部のアプリストアコントロールには、テーブルビューにリンクされた上部の制約がありました。
  • スーパービューの下部にリンクされたアプリ ストアの下部制約。と
  • アプリ ストアの高さの制約は 77.0 に固定されています。

しかし、IB は常に (制約が明確であることを保証する誠実な努力で) 追加の制約 (テーブルビューの高さなど) を追加しようとしていることがわかりました。したがって、私は個人的に IB と格闘して、制約を適切に設定します (通常、テーブル ビューの高さの優先順位を下げることになり、他の作業がすべて完了したら、戻ってテーブル ビューの高さを取り除くことができます)。 .

制約を編集するのに手間取りすぎているのかもしれませんが、制約をすべて正確に取得しないと、1 つの制約を変更して UI を変更しようとしても、目的の結果が得られないため、これについて言及します。コツをつかめば、とても簡単で、それに応じてすべてが調整されるのを見るのは美しいことです (特に複雑なシーンでは)。しかし、最初の数回は面倒かもしれません。

于 2013-02-07T19:17:18.043 に答える
1

おそらく、を使用してサブビューをレイアウトするようにビューに指示する必要がありますlayoutIfNeeded

私が解決したばかりの私の質問を参照してください。この質問も関連しています。

于 2013-02-07T19:15:47.533 に答える