2

ラベルのサイズを変更する方法に関するリンクは多数ありますが、ラベルのサイズに応じて UIButton のサイズを変更する方法に関する情報が不足しています。現在、自動レイアウト (すべてのシステム制約が IB から追加されます) で設定された画面ビューがあり、すべて正常に動作しますが、画面の下部に動的コンテンツを追加する必要があります。ランダムな長さのタイトルを持つランダムな数のボタンを作成して追加する必要があります。したがって、ボタンを作成して追加するためのコードフラグメントは次のとおりです。

// Loop
  UIButton *myButton = [UIButton new];

  UIButton.frame = CGRectMake(0, previousButtonOriginY, self.view.bounds.size.width, 20);
  myButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
  myButton.titleLabel.textAlignment = NSTextAlignmentLeft;
  myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
  [myButton setTitle:@"very long title..." forState:UIControlStateNormal];
  myButton.titleLabel.numberOfLines = 0;

  [self.footerView addSubview:myButton];

問題は、ボタンのフレームの高さが 20px のままですが、ラベル文字列が 3 行で表示されるため、他のボタン タイトルと重なってしまうことです。[myButton sizeToFit] を追加すると、すべてのテキストが 1 行に収まるようにボタンの幅が変更され、タイトルが画面からはみ出します。

[myButton sizeThatFits:CGSizeMake(320, 100)] を追加すると、サイズ変更がまったく機能しません。sizeToFit は自動レイアウトの一部ではないため、まったく呼び出すべきではないことはわかっていますが、ボタンをラベルを画面の 320 幅に合わせる方法を簡単に提案する必要があります。

コードからシステム制約を追加する必要があると感じていますが、それを行ったことがないため、どのように見えるかわかりません。この単純なことを機能させるには、おそらくコードから大量の制約を追加する必要があります:)

4

2 に答える 2

0

Autolayoutを使用する代わりに、ボタンなどの要素をレイアウトするためのより良いオプションであるコレクション ビューを使用することができます。

回転中のレイアウトもより適切に処理できます。

または、このコードを使用できます。私にとってはうまくいきました...

たとえば、必要なパディング値を次のように置き換えます。

UIButton* myButton = [[UIButton alloc] init];

// setup some autolayout constraints here
myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding,
                                            -desiredRightPadding,
                                            -desiredTopPadding,
                                            -desiredLeftPadding);

適切な自動レイアウトの制約と組み合わせると、画像とテキストを含む自動サイズ変更ボタンになります!

于 2013-11-13T14:03:22.900 に答える
0

この種のカスタマイズでは、UIButton のサブクラスを作成する必要があります。サブクラスでは、ニーズに合わせてカスタマイズされたラベルを追加できます。setTitle:forState メソッドをオーバーライドして、カスタマイズしたラベルを自動的に更新することもできます。

于 2013-11-13T14:10:07.437 に答える