UIButton
があり、タイトルと画像を設定しようとしています。
UIButton
のタイトルを左側に揃え、画像を右側に配置したいと思います。タイマーアプリのタイマー(「タイマーが終了したとき」というボタン)のボタンのルックアンドフィールを取得しようとしています。
私はcontentHorizontalAlignment
、contentEdgeInsets
、titleEdgeInsets
およびimageEdgeInsets
をいじって、目標を達成しましたが、役に立ちませんでした。ドキュメントも同じようにかなりまばらです。
どうすれば同じことを達成できますか?
また、関連する質問です。Timerin Clocksアプリには、2つのテキストセットがあります。 UIButton
でそれを行うにはどうすればよいですか? (現時点ではその機能は必要ありません)。
imageEdgeInsets
のUIButton
プロパティを変更してから、setImage:forState:
これは私がそのために使用するコードです:
//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)];
次のコードは機能します。
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;
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];
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)
}
}
}
私と同じように誰かの助けになることを願っています!
titleRectForContentRect:
およびimageRectForContentRect:
UIButton
のメソッドを使用して、テキストと画像を好きな場所に配置します。
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)
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)
}
}
}