web-dev-qa-db-ja.com

UIButtonのタイトルと画像の配置クエリ

UIButtonがあり、タイトルと画像を設定しようとしています。

UIButtonのタイトルを左側に揃え、画像を右側に配置したいと思います。タイマーアプリのタイマー(「タイマーが終了したとき」というボタン)のボタンのルックアンドフィールを取得しようとしています。

私はcontentHorizontalAlignmentcontentEdgeInsetstitleEdgeInsetsおよびimageEdgeInsetsをいじって、目標を達成しましたが、役に立ちませんでした。ドキュメントも同じようにかなりまばらです。

どうすれば同じことを達成できますか?

また、関連する質問です。Timerin Clocksアプリには、2つのテキストセットがあります。 UIButtonでそれを行うにはどうすればよいですか? (現時点ではその機能は必要ありません)。

28
siasl

imageEdgeInsetsUIButtonプロパティを変更してから、setImage:forState:

35
Bill

これは私がそのために使用するコードです:

//Right-align the button image
CGSize size = [[myButton titleForState:UIControlStateNormal] sizeWithFont:myButton.titleLabel.font];
[myButton setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, -size.width)];
[myButton setTitleEdgeInsets:UIEdgeInsetsMake(0, 0, 0, myButton.imageView.image.size.width + 5)];
49
ingham

次のコードは機能します。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = buttonRect;
[button setTitle:@"A title" forState:UIControlStateNormal];
[button setImage:buttonImage forState:UIControlStateNormal];
button.imageEdgeInsets = UIEdgeInsetsMake(0.0, WIDTH(button.titleLabel) + 10.0, 0.0, 0.0);
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
14
yaris

UIButtonはUIViewを継承しているため、他のビューと同じようにサブビューを追加できることに注意してください。あなたの状況では、ボタンを作成してから、UILabelを左側に追加し、UIImageを右側に追加します。

// Create the button
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

// Now load the image and create the image view
UIImage *image = [UIImage imageNamed:@"yourImage.png"];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(/*frame*/)];
[imageView setImage:image];

// Create the label and set its text
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(/*frame*/)];
[label setText:@"Your title"];

// Put it all together
[button addSubview:label];
[button addSubview:imageView];
9
Tim

IOS 9で使用するために、このスレッドで多くの答えを試しましたが、どれも自分に適したものではありませんでした。私は次のように自分のための答えを見つけました:

class MyButton: UIButton {

  override func layoutSubviews() {
    super.layoutSubviews()

    self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left

    if self.imageView?.image != nil {
      // Move icon to right side
      self.imageEdgeInsets = UIEdgeInsets(
        top: 0,
        left: self.bounds.size.width - self.imageView!.image!.size.width,
        bottom: 0,
        right: 0)

      // Move title to left side
      self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0)

    }
  }
}

Swift 3:

class MyButton: UIButton {

    override func layoutSubviews() {
        super.layoutSubviews()

        self.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left

        if self.imageView?.image != nil {
            // Move icon to right side
            self.imageEdgeInsets = UIEdgeInsets(
                top: 0,
                left: self.bounds.size.width - self.imageView!.image!.size.width,
                bottom: 0,
                right: 0)

            // Move title to left side
            self.titleEdgeInsets = UIEdgeInsetsMake(0, -self.imageView!.frame.size.width + 8, 0, 0)

        }
    }
}

私と同じように誰かの助けになることを願っています!

4
Quang Tran

titleRectForContentRect:およびimageRectForContentRect:UIButtonのメソッドを使用して、テキストと画像を好きな場所に配置します。

4
ohnit

Swift気にする人のために(10pt間隔で):

let size = (self.titleForState(UIControlState.Normal)! as NSString).sizeWithAttributes([NSFontAttributeName:self.titleLabel!.font])
let offset = (size.width + 10)
self.imageEdgeInsets = UIEdgeInsetsMake(0, offset, 0, -offset)
self.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 0, self.imageView!.frame.size.width + 10)
4
Brenden

Swift)のUIButtonのサブクラスを以下に示します。これは、左側の画像と中央のテキストを揃えます。imageLeftInsetを目的の値に設定します。

class LeftImageAlignedButton : UIButton {

var imageLeftInset : CGFloat = 10.0

override func layoutSubviews() {
    super.layoutSubviews()
    self.contentHorizontalAlignment = .Left
    if let font = titleLabel?.font {
        let textWidth = ((titleForState(state) ?? "") as NSString).sizeWithAttributes([NSFontAttributeName:font]).width
        let imageWidth = imageForState(state)?.size.width ?? 0.0
        imageEdgeInsets = UIEdgeInsets(top: 0, left: imageLeftInset, bottom: 0, right: 0)
        titleEdgeInsets = UIEdgeInsets(top: 0, left: bounds.width/2 - textWidth/2.0 - imageWidth, bottom: 0, right: 0)
    }
}
}
1
Mike Pollard