Ответ 1
Измените свойство imageEdgeInsets
на UIButton
, а затем просто используйте setImage:forState:
У меня есть UIButton
, и я пытаюсь установить заголовок и изображение на нем.
Я хотел бы выровнять заголовок для UIButton
с левой стороны и поместить изображение вправо. Я пытаюсь получить внешний вид кнопки в приложении "Таймер в часах" (тот, который говорит "Когда таймер заканчивается" ).
Я решил использовать contentHorizontalAlignment
, contentEdgeInsets
, titleEdgeInsets
и imageEdgeInsets
для достижения моей цели, но безрезультатно. Документация также довольно редкая для того же самого.
Как я могу достичь того же?
Также связанные вопросы, приложение Timer in Clocks имеет два набора текста, один выровненный влево и другой выровненный справа с изображением? Как это можно сделать в 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, и поэтому вы можете добавлять в него subview, как и любое другое представление. В вашей ситуации вы создадите кнопку, затем добавьте 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];
Вы также можете переопределить методы 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)
Для использования на 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)
}
}
}
Я надеюсь, что это поможет кому-то в этом деле, как мне!
Здесь находится подкласс UIButton
в Swift, который выравнивает изображение слева и текст в центре. Установите 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)
}
}
}
Создайте подкласс UIButton и переопределите его метод layoutSubviews
, чтобы программно выровнять текст и изображение. Или используйте что-то вроде https://github.com/stevestreza/BlockKit/blob/master/Source/UIView-BKAdditions.h, чтобы вы могли реализовать layoutSubviews с помощью блока.