UIButton заголовок и запрос выравнивания изображения - PullRequest
28 голосов
/ 12 июля 2009

У меня есть UIButton, и я пытаюсь установить заголовок и изображение на нем.

Я хотел бы выровнять заголовок для UIButton по левой стороне и поместить изображение по правому краю. Я пытаюсь получить представление о кнопке в приложении «Таймер в часах» («Когда заканчивается таймер»).

Я возился с contentHorizontalAlignment, contentEdgeInsets, titleEdgeInsets и imageEdgeInsets, чтобы достичь своей цели, но безрезультатно. Документация также довольно скудна для того же.

Как мне добиться того же?

Также связанные вопросы, приложение Timer in Clocks имеет два набора текста, один выровнен по левому краю, а другой выровнен по правому краю с изображением? Как это можно сделать за UIButton? (Мне пока не нужна эта функциональность).

Ответы [ 9 ]

49 голосов
/ 07 ноября 2011

Вот код, который я использую для этого:

//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)];
35 голосов
/ 25 октября 2010

Измените свойство imageEdgeInsets на UIButton, а затем просто используйте setImage:forState:

14 голосов
/ 10 июля 2012

работает следующий код:

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;
9 голосов
/ 12 июля 2009

Помните, что 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];
4 голосов
/ 30 сентября 2016

Для использования на 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 голосов
/ 12 января 2016

В 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 голосов
/ 09 августа 2013

Вы также можете переопределить titleRectForContentRect: и imageRectForContentRect: методы UIButton, чтобы расположить текст и изображение в любом месте.

1 голос
/ 13 мая 2015

Вот подкласс 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)
    }
}
}
0 голосов
/ 01 марта 2012

Создайте подкласс UIButton и переопределите его метод layoutSubviews для программного выравнивания текста и изображения. Или используйте что-то вроде https://github.com/stevestreza/BlockKit/blob/master/Source/UIView-BKAdditions.h, чтобы вы могли реализовать layoutSubviews, используя блок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...