Я не хочу использовать подпредставление, если я могу избежать этого. Я хочу UIButton
с фоновым изображением, текстом и изображением в нем. Прямо сейчас, когда я это делаю, изображение находится на левой стороне текста. Фоновое изображение, текст и изображение имеют разные состояния подсветки.
ios
user-interface
layout
uibutton
jasongregori
источник
источник
Ответы:
Несмотря на то, что некоторые из предложенных ответов очень креативны и чрезвычайно умны, самое простое решение заключается в следующем:
Так просто, как, что. В качестве бонуса, изображение будет слева на правой стороне слева.
РЕДАКТИРОВАТЬ : как вопрос был задан несколько раз, это iOS 9 + .
источник
semanticContentAttribute
- это просто взлом / обходной путь, а не реальное решение.Самое простое решение:
iOS 10 и выше, Swift:
До iOS 10, Swift / Obj-C:
источник
button.ImageEdgeInsets = new UIEdgeInsets(0, -leftPadding, 0, leftPadding); button.ContentEdgeInsets = new UIEdgeInsets(0, 0, 0, leftPadding);
. Это в Xamarin, но достаточно легко перевести на Swift / Obj-C.Есть более простой способ от Interface Builder .
Выберите UIButton и выберите эту опцию в View Utilities> Semantic :
Это оно! Красиво и просто!
Если вы хотите настроить расстояние между изображением и заголовком, вы можете изменить здесь вставку изображения :
Надеюсь, это поможет!
источник
Подкласс UIButton совершенно не нужен. Вместо этого вы можете просто установить высокое левое значение для вставки изображения и маленькое правое значение для заголовка. Что-то вроде этого:
источник
Я отдаю Inspire48 честь этому. Основываясь на его предложении и глядя на этот другой вопрос, я придумал это. Подкласс UIButton и переопределить эти методы.
источник
buttonWithType
If you subclass UIButton, this method does not return an instance of your subclass. If you want to create an instance of a specific subclass, you must alloc/init the button directly
иbackgroundRectForBounds
подклассы , которые обеспечивают пользовательские фоновые украшения могут переопределить этот метод и возвращать измененные границы не прямоугольник , чтобы предотвратить кнопку от рисования на любом пользовательском content.` Ни упоминают те конкретные методы, но я предполагаю, что они не возражают против подклассов.frame.origin.x = CGRectGetMaxX(contentRect) - CGRectGetWidth(frame) - self.imageEdgeInsets.right + self.imageEdgeInsets.left - frame.origin.x;
она работает лучше и дляUIControlContentHorizontalAlignmentCenter
других ...Просто обновите вставки, когда название будет изменено. Вы должны компенсировать вставку с помощью равной и противоположной вставки с другой стороны.
источник
[thebutton.titleLabel sizeToFit];
раньше. Ширина может быть нулевой, если вы не запустили макет. То же самое касается размера изображения (просто используйте UIImage.size вместо размера imageView)titleWidth = [self.titleLabel sizeThatFits:CGSizeMake(CGFLOAT_MAX, self.bounds.size.height)].width;
(или если вы обеспокоены тем, что рамка кнопки еще не установлена, используйте CGFLOAT_MAX для высоты) иimageWidth = self.currentImage.size.width;
layoutSubviews
моемUITableViewCell
подклассе, но это работает хорошо. Спасибо!Все эти ответы по состоянию на январь 2016 года не нужны. В Интерфейсном Разработчике установите View Semantic на
Force Right-to-Left
, или, если вы предпочитаете программный способ,semanticContentAttribute = .forceRightToLeft
Это приведет к тому, что изображение появится справа от вашего текста.источник
UIBarButtonItem(customView: button)
, но сработает, если вы поместите кнопку в какое-то пустое представлениеВ конструкторе интерфейса вы можете настроить параметры Edge Insets для UIButton, отдельно для каждой из трех частей: контент, изображение, заголовок
Xcode 8:
источник
Обновление: Swift 3
Оригинальный ответ для Swift 2:
Решение, которое обрабатывает все горизонтальные выравнивания, с примером реализации Swift. Просто переведите на Objective-C, если это необходимо.
Также стоит отметить, что он хорошо обрабатывает вставки изображений и заголовков.
Вдохновленный ответом jasongregori;)
источник
@IBDesignable
в класс и увидеть, что он перевернулся во время разработки.Если это нужно сделать в UIBarButtonItem , следует использовать дополнительное обтекание.
Это будет работать
Это не сработает
источник
Вот решение для
UIButton
контента с выравниванием по центру. Этот код выравнивает изображение по правому краю и позволяет использовать егоimageEdgeInsets
иtitleEdgeInsets
для драгоценного позиционирования.Подкласс
UIButton
с вашим пользовательским классом и добавить:источник
Поскольку решение для преобразования не работает в iOS 11, я решил написать новый подход.
Регулировка кнопок
semanticContentAttribute
дает нам хорошее изображение справа без необходимости ретрансляции, если текст изменяется. Из-за этого это идеальное решение. Однако мне все еще нужна поддержка RTL. Тот факт, что приложение не может изменить направление компоновки в одном сеансе, легко решает эту проблему.С учетом сказанного, это довольно просто.
источник
Путь расширения
Используя расширение, чтобы установить изображение на правой стороне с пользовательским смещением
источник
Swift-Расширить UiButton и поставить эти строки
источник
Опираясь на элегантное решение Петра Томазика: если вы хотите немного увеличить расстояние между надписью кнопки и изображением , то включите это в свои вставки по краям следующим образом (скопируйте мой код, который отлично работает для меня):
Спасибо Петр за ваше решение!
Erik
источник
Сделай сам. Xcode10, swift4,
Для программного дизайна пользовательского интерфейса
для дизайна пользовательского интерфейса StoryBoard
источник
Создание подклассов и переопределение layoutSubviews - это, вероятно, ваш лучший путь.
Ссылка от: iPhone UIButton - положение изображения
источник
Взял ответ @ Piotr и превратил его в расширение Swift. Обязательно установите изображение и заголовок, прежде чем вызывать его, чтобы размер кнопок соответствовал требованиям.
}
источник
Быстрый вариант, который делает то, что вы хотите, не играя ни с какими вставками:
источник
Решения, упомянутые здесь, перестали работать, как только я включил Auto Layout . Я должен был придумать свой собственный:
Подкласс UIButton и
layoutSubviews
метод переопределения :Результат:
источник
Swift 3.0 Решение для миграции предоставлено jasongregori
источник
Я решил не использовать стандартный вид изображения кнопки, потому что предложенные решения для его перемещения казались хакерскими. Это дало мне желаемую эстетику, и было интуитивно понятно изменить положение кнопки, изменив ограничения:
источник
Свифт 3:
источник
Как насчет ограничений? В отличие от semanticContentAttribute, они не меняют семантику. Возможно, что-то вроде этого:
или в Objective-C:
Предостережения: не проверено, iOS 9+
источник
Чтобы выровнять изображение в UIButton, попробуйте код ниже
источник
Попробовав несколько решений по всему интернету, я не достиг точного требования. Таким образом, я закончил писать собственный код утилиты. Публикация, чтобы помочь кому-то в будущем. Проверено на Swift 4.2
источник
для этой проблемы вы можете создать UIView внутри «метки с представлением UIImage» и установить класс UIView в качестве UIControl и создать IBAction так, чтобы он был в стороне
источник
Свифт 4 и 5
Изменить направление изображения UIButton (RTL и LTR)
источник
Utility
?Xcode 11.4 Swift 5.2
Для тех, кто пытается отразить стиль кнопки «Назад» с помощью шеврона, вот так:
Реализация:
источник
Я закончил тем, что создал пользовательскую кнопку, которая позволяет установить изображение из инспектора. Ниже мой код:
Вы можете настроить значение Gap Padding в Inspector, чтобы настроить расстояние между текстом и изображением.
PS: использовал часть кода из ответа @Mark Hennings
источник