0

他社製アプリのiOS6対応を作成中です。自動サイズ変更マスクを使用してボタン/UI要素を作成することに慣れていますが、プログラムでボタンを作成するときにそれらがどのように機能するかはよくわかりません。

例えば:

- (UIButton*) createSampleButton {
    UIButton* b = createSampleViewButton(CGRectMake(67, 270, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    b.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
    [self attachButton:b];
    return b;
}

すべてが「正しく見える」までポイントを任意に選択するのではなく、スケール/マージンに従って配置されるようにこれらのボタンを変更するにはどうすればよいですか?

私は次のようなことを考えていました:

- (UIButton*) createSampleButton {
    CGFloat height = self.bounds.size.height;
    CGFloat bottomBound = 80;
    UIButton* b = createSampleViewButton(CGRectMake(67, height-bottomBound, 191, 45), 
                                          @"btn_shuffle", 
                                          @"btn_shuffle_active",
                                          self,
                                          @selector(sampleAction));
    [self attachButton:b];
    return b;
}

これにより、ボタンが毎回画面の下部から 80 ポイントの位置に配置されることが保証されます。これを行うためのより優雅な、または意図的な方法はありますか?

4

1 に答える 1

0

マスクは、IB またはコードで作成された場合と同じです。ただし、コードで確実に行いたいことは、フレームが適切にプロポーションされていることを確認することです。あなたの場合、はい、UIViewAutoResizingFlexibleTopMargin が必要であり、y = parentView.bounds.size.height - (説明した x ポイント) に関して原点に正しい y 値を設定するだけで十分です。

編集:更新された質問によると、これが役立つかもしれません。ボタンのサイズが一定の場合は、ボタンを作成するときに CGPointZero を原点としてフレームをそのサイズに設定します。UIView がボタンを所有している場合は、このコードを layoutSubviews に配置します。UIViewController がボタンを所有している場合は、self.bounds を self.view.bounds に置き換え、これを view(Will/Did)LayoutSubviews に配置します (iOS5 以降を想定)。

    // Aligning the button at it's current x value, current size, with its bottom border margin pizels from the bottom of the parent view.
    CGFloat margin = 10;
    CGRect buttonFrame = button.frame;
    buttonFrame.origin.y = self.bounds.size.height - buttonFrame.size.height - margin;
    button.frame = buttonFrame;

また、実装ファイルの先頭で定数値を定義します。次のような読みやすさのための便利なメソッドを自由に作成してください(これが読みやすく、1行でやりすぎない場合)

    CGRect CGSetYInRect(CGFloat y, CGRect rect)
    ...
    button.frame = CGSetYInRect(self.bounds.size.height - button.frame.size.height - margin, button.frame);

適切な場合は AutoResizing を使用して、layoutSubviews の明示的なロジックを回避します。

iOS 6 + のみに移行する場合は、AutoLayout を使用します。

于 2012-10-05T20:38:00.933 に答える