12

UIButton を含む UIView があります。UIButton には、UIControlStateNormal ("Follow") および UIControlStateSelected ("Following") 状態用に設定された 2 つのタイトルがあります。UIButton で自動レイアウトを使用していますが、スーパービューの上部から一定の距離にあるという制約と、スーパービューの左側から一定の距離にあるという制約があります。「コンテンツに合わせたサイズ」も使用しました。

コードからボタンを選択状態に設定すると、タイトルは正しく変更されますが、UIButton の固有の幅は変更されないため、「フォロー」から「フォロー」に変更するとテキストが省略されます。

self.selected = self.following;

ここに画像の説明を入力ここに画像の説明を入力

別の方法で問題に取り組み、誰かがボタンを押したときに UIControlStateNormal のテキストを変更するだけで、ボタンのサイズが正しく変更されます。

NSString *title = (self.following) ? @"Following" : @"Follow"
[self setTitle:title forState:UIControlStateNormal];

ここに画像の説明を入力ここに画像の説明を入力

これは UIKit のバグですか? 特に2つのボタン状態のテキスト以外に変更したいものがあるため、状態が変化したときにテキストの新しいサイズを正しく反映するようにボタンの固有のサイズが変更されることを期待します。

4

4 に答える 4

23

David Caunt がコメントで指摘したように、呼び出すinvalidateIntrinsicContentSizeと、autolayout がボタンのサイズを変更して新しいコンテンツに合わせます。

self.selected = self.following;
[self invalidateIntrinsicContentSize];

PS。デビッド、あなたのコマンドを回答として投稿したい場合は、私のものを削除します。

于 2013-12-23T23:50:51.387 に答える
1

私にとってcontentEdgeInsetsを設定することで、唯一の信頼できる解決策が得られました。

背景画像付きのカスタムボタンを使用しています。それで、スライスが写真に入ります。画像をどのようにスライスするかによって、固有のコンテンツ サイズにも影響が及ぶことがわかりました。試して!そのため、異なる状態の画像間で同じようにスライスしていることを確認する必要がありました。属性付き文字列も使用しています。ここに投稿された解決策は、私の場合はうまくいきませんでした。

1 日 (!) 実験した結果、ボタンに十分な contentEdgeInsets 値を設定すると、自動レイアウトを使用してタイトルが変更されたときにボタンが正しく動作することがわかりました。これを行う場合、固有のコンテンツ サイズを無効にしたり、レイアウト コードを呼び出したりする必要はありません。

コードまたは IB で contentEdgeInsets を設定できます。

self.button.contentEdgeInsets = UIEdgeInsetsMake(10.0, 16.0, 10.0, 16.0);

var 属性を除いて、Swift コードは同じだと思います。

Apple はドキュメントで次のように述べています。

ここに画像の説明を入力

于 2015-03-19T21:11:21.823 に答える
1

ストーリーボードで UIButton を選択し、上部でエディター - >サイズを選択してコンテンツのサイズに合わせます。

編集:これを試してください:

[self.myButton setTitle:@"Following" forState:UIControlStateSelected];
[self.myButton sizeToFit];
于 2013-07-31T22:16:59.427 に答える