Подтвердить что ты не робот

Запрос заголовка заголовка и изображения UIButton

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

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

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

Как я могу достичь того же?

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

4b9b3361

Ответ 1

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

Ответ 2

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

//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)];

Ответ 3

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

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;

Ответ 4

Помните, что 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];

Ответ 5

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

Ответ 6

В 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)

Ответ 7

Для использования на 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)

        }
    }
}

Я надеюсь, что это поможет кому-то в этом деле, как мне!

Ответ 8

Здесь находится подкласс 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)
    }
}
}

Ответ 9

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