UIButtonにimageもtextも縦に表示させる

UIButtonにimageとtextを設定すると、横に並べて表示される。 縦に表示したい場合は一手間が必要(だと思う)

何も指定せずに表示してみる

何も指定せずにimageと適すを表示すると、imageとtextを横に並べてセンタリングされる

余白調整

縦に表示するためにそれぞれの余白を調整する

  • imageの余白指定 : imageEdgeInsets
  • textの余白指定 : titleEdgeInsets

※計算するまえに文字列を設定しても問題ない

実装

今回はUIButtonのカテゴリにレイアウト調整する関数を追加

@implementation UIButton (Layout)

- (void)verticalLayout
{
    float buttonHeight = CGRectGetHeight(self.frame);
    float imageHeight  = CGRectGetHeight(self.imageView.frame);
    float textHeight   = CGRectGetHeight(self.titleLabel.frame);

    float verticalMergin = (buttonHeight - imageHeight - textHeight) / 2.0f;

    float buttonWidht = CGRectGetWidth(self.frame);
    float imageWidht  = CGRectGetWidth(self.imageView.frame);
    float textWidht   = CGRectGetWidth(self.titleLabel.frame);

    float imageHorizonMergin = (buttonWidht - imageWidht) / 2.0f;

    self.contentEdgeInsets = UIEdgeInsetsZero;
    self.imageEdgeInsets
        = UIEdgeInsetsMake(verticalMergin,
                           imageHorizonMergin,
                           verticalMergin + textHeight,
                           imageHorizonMergin - textWidht);
    self.titleEdgeInsets
        = UIEdgeInsetsMake(verticalMergin + imageHeight,
                           -imageWidht,
                           verticalMergin,
                           0);
}

ハマったところ

  • Interface Builderで設定する場合は@2xをファイル名につけると画像が拡大されて表示される
  • 文字列は自動でセンタリングされるが、imageはセンタリングされない

0 件のコメント:

コメントを投稿

ReactNativeでAndroid対応する話

前提 ReactNativeでiOS版のアプリをリリースしていて、Android版をリリースする話 トラブルシューティング Build.VERSION_CODES.Q が存在しないエラー compileSdkVersionを29以上にすると解決 メモリー足りないエラー Execu...