[英]Left-align image and center text on UIButton
我看過關於右 alignment 的帖子,但我無法讓左對齊工作。 我希望按鈕占據屏幕的寬度,左側是圖像,中間是標題/文本。
這不起作用(至少可靠):
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setImageEdgeInsets:UIEdgeInsetsMake(0, -60.0, 0, 0)];
button.frame = CGRectMake((self.view.frame.size.width - w ) / 2, self.view.frame.size.height - 140.0, self.view.frame.size.width - 10.0, 40.0);
此解決方案適用於 Swift 3 並尊重原始內容和圖像邊緣插入,同時保持標題標簽始終位於可用空間的中心,這使得調整邊距變得更加容易。
它覆蓋titleRect(forContentRect:)
方法並返回正確的框架:
@IBDesignable
class LeftAlignedIconButton: UIButton {
override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
let titleRect = super.titleRect(forContentRect: contentRect)
let imageSize = currentImage?.size ?? .zero
let availableWidth = contentRect.width - imageEdgeInsets.right - imageSize.width - titleRect.width
return titleRect.offsetBy(dx: round(availableWidth / 2), dy: 0)
}
}
以下插圖:
會導致這個:
已棄用的先前答案
這在大多數情況下都有效,但有些布局會導致layoutSubviews
在無限循環中遞歸調用自身,因此請謹慎使用。
@IBDesignable
class LeftAlignedIconButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
contentHorizontalAlignment = .left
let availableSpace = UIEdgeInsetsInsetRect(bounds, contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.right - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: availableWidth / 2, bottom: 0, right: 0)
}
}
此代碼將執行相同的操作,但將圖標與右邊緣對齊:
@IBDesignable
class RightAlignedIconButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
semanticContentAttribute = .forceRightToLeft
contentHorizontalAlignment = .right
let availableSpace = UIEdgeInsetsInsetRect(bounds, contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.left - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: availableWidth / 2)
}
}
正確的對齊版本使用semanticContentAttribute
因此它需要iOS 9+。
最后,我使用 UIEdgeInsetsMake 做到了這一點,計算左角使其居中。 我不確定是否真的有什么東西可以讓文本在中心對齊,但這對我有用。 確保通過計算寬度將左角設置到所需位置。 例如UIEdgeInsetsMake(0.0f, 42.0f, 0.0f, 0.0f)
UIButton *scanBarCodeButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
scanBarCodeButton.frame = CGRectMake(center, 10.0f, fieldWidth, 40.0f);
[scanBarCodeButton setImage:[UIImage imageNamed:@"BarCodeIcon.png"] forState:UIControlStateNormal];
[scanBarCodeButton setTitle:@"Scan the Barcode" forState:UIControlStateNormal];
scanBarCodeButton.titleEdgeInsets = UIEdgeInsetsMake(0.0f, 42.0f, 0.0f, 0.0f);
[scanBarCodeButton setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[scanBarCodeButton addTarget:self action:@selector(scanBarCode:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:scanBarCodeButton];
輸出看起來像,
在斯威夫特:
var scanBarCodeButton: UIButton = UIButton(type: .roundedRect)
scanBarCodeButton.frame = CGRectMake(center, 10.0, fieldWidth, 40.0)
scanBarCodeButton.setImage(UIImage(named: "BarCodeIcon.png"), for: UIControlStateNormal)
scanBarCodeButton.setTitle("Scan the Barcode", for: UIControlStateNormal)
scanBarCodeButton.titleEdgeInsets = UIEdgeInsetsMake(0.0, 42.0, 0.0, 0.0)
scanBarCodeButton.contentHorizontalAlignment = .left
scanBarCodeButton.addTarget(self, action: "scanBarCode:", for: UIControlEventTouchUpInside)
self.view.addSubview(scanBarCodeButton)
對於 Swift 4.0,這是一個有效的擴展 -
extension UIButton {
func leftImage(image: UIImage, renderMode: UIImage.RenderingMode) {
self.setImage(image.withRenderingMode(renderMode), for: .normal)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
self.titleEdgeInsets.left = (self.frame.width/2) - (self.titleLabel?.frame.width ?? 0)
self.contentHorizontalAlignment = .left
self.imageView?.contentMode = .scaleAspectFit
}
func rightImage(image: UIImage, renderMode: UIImageRenderingMode){
self.setImage(image.withRenderingMode(renderMode), for: .normal)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left:image.size.width / 2, bottom: 0, right: 0)
self.contentHorizontalAlignment = .right
self.imageView?.contentMode = .scaleAspectFit
}
}
用法:
myButton.rightImage(image: UIImage(named: "image_name")!, renderMode: .alwaysOriginal)
myButton.leftImage(image: UIImage(named: "image_name")!, renderMode: .alwaysOriginal)
renderMode
可以是.alwaysTemplate
或.alwaysOriginal
。 此外, myButton
應該是custom
類型UIButton
。
這個擴展的leftImage
和rightImage
也可以在使用UIButton
中UIBarButtonItem
的UINavigationBar
(注:由於iOS的11,導航欄下面自動布局,所以你需要寬度/高度限制添加到UIBarButtonItem
)。 要在導航欄上使用,請確保遵循 Apple 推薦的 @2x 和 @3x 圖像尺寸(即 50x50、75x75),並在 iPhone 6、7、8、6s、7s、8s、Plus 變體和 iPhone 上獲得更好的可訪問性x UIBarButton
的寬度和高度可以是高度 - 25 和寬度 - 55(或者任何你的應用需要的數字,這些數字是一些應該適用於大多數情況的基本數字)。
更新:在 Swift 4.2 中, UIImageRenderingMode
已重命名為UIImage.RenderingMode
extension UIButton {
func leftImage(image: UIImage, renderMode: UIImage.RenderingMode) {
self.setImage(image.withRenderingMode(renderMode), for: .normal)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: image.size.width / 2)
self.contentHorizontalAlignment = .left
self.imageView?.contentMode = .scaleAspectFit
}
func rightImage(image: UIImage, renderMode: UIImage.RenderingMode){
self.setImage(image.withRenderingMode(renderMode), for: .normal)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left:image.size.width / 2, bottom: 0, right: 0)
self.contentHorizontalAlignment = .right
self.imageView?.contentMode = .scaleAspectFit
}
}
我認為,好的解決方案必須對任何文本都有用,沒有插入的硬編碼值(這是關於 toytoy 提供的解決方案)。 我使用類似於此的代碼:
NSString *sometitle = @"blabla button title";
NSString *someimage = @"blablaimage";
UIImage *image = [[UIImage imageNamed:someimage];
int buttonWidth = A;
int buttonHeight = B;
int imageWidth =image.size.width;
int imageHeight = image.size.height;
int titleWidth = buttonWidth - imageWidth;
// create button and set image and title
buttonView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, buttonWidth, buttonHeight)];
[buttonView setImage:image forState:UIControlStateNormal];
[buttonView setTitle:sometitle forState:UIControlStateNormal];
// make button all content to be left aligned
[buttonView setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
// set title font
[buttonView.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:14]];
// calculate font text width with selected font
CGSize stringBoundingBox = [number sizeWithFont:[buttonView.titleLabel font]];
// make title inset with some value from left
// it place the title right on the center of space for the title
int titleLeft = (titleWidth - stringBoundingBox.width) / 2;
[buttonView setTitleEdgeInsets:UIEdgeInsetsMake(0, titleLeft, 0, 0)];
在 stringBoundingBox init 字符串之后,我還添加了一些這樣的字符串:
if (stringBoundingBox.width > titleWidth)
{
[_backgroundView.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:13]];
stringBoundingBox = [number sizeWithFont:[_backgroundView.titleLabel font]];
}
if (stringBoundingBox.width > titleWidth)
{
[_backgroundView.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:12]];
stringBoundingBox = [number sizeWithFont:[_backgroundView.titleLabel font]];
}
它允許我通過選擇一些較小的字體來設置比可用空間更長的標題。 我這樣做是因為另一種方式:
[buttonView.titleLabel setAdjustsFontSizeToFitWidth:YES];
效果不是很好,看起來它的字體大小一步小了 3-4 個點,所以一些不那么長的行變得太小了,比它必須的要小。
這段代碼允許我們將任何文本放在按鈕標題空間的中心位置。
我寫了一個 UIButton 擴展。
extension UIButton {
/// Add image on left view
func leftImage(image: UIImage) {
self.setImage(image, for: .normal)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: image.size.width)
}
}
你可以這樣使用:
yourButton.leftImage(image: yourImage)
瞧!
創建您的按鈕並將文本對齊設置為居中,然后添加:
UIImage *image = [UIImage imageNamed:@"..."];
CGSize imageSize = image.size;
CGFloat offsetY = floor((self.layer.bounds.size.height - imageSize.height) / 2.0);
CALayer *imageLayer = [CALayer layer];
imageLayer.contents = (__bridge id) image.CGImage;
imageLayer.contentsGravity = kCAGravityBottom;
imageLayer.contentsScale = [UIScreen mainScreen].scale;
imageLayer.frame = CGRectMake(offsetY, offsetY, imageSize.width, imageSize.height);
[self.layer addSublayer:imageLayer];
我已經嘗試了上面幾乎所有的解決方案,但沒有一個像我預期的那樣工作(我有兩個按鈕,每個按鈕都有不同的標題和不同的圖像寬度)。 所以我為 UIButton 編寫了我自己的擴展,它可以完美地處理不同的圖像寬度和不同的標題。
extension UIButton {
func moveImageLeftTextCenter(imagePadding: CGFloat = 30.0, titlePadding: CGFloat = 0.0, minImageTitleDistance: CGFloat = 10.0){
guard let imageViewWidth = imageView?.frame.width else{return}
guard let titleLabelWidth = titleLabel?.intrinsicContentSize.width else{return}
contentHorizontalAlignment = .left
let imageLeftInset = imagePadding - imageViewWidth / 2
var titleLeftInset = (bounds.width - titleLabelWidth) / 2 - imageViewWidth + titlePadding
if titleLeftInset - imageLeftInset < minImageTitleDistance{
titleLeftInset = imageLeftInset + minImageTitleDistance
}
imageEdgeInsets = UIEdgeInsets(top: 0.0, left: imageLeftInset, bottom: 0.0, right: 0.0)
titleEdgeInsets = UIEdgeInsets(top: 0.0, left: titleLeftInset, bottom: 0.0, right: 0.0)
}
}
用法: myButton.moveImageLeftTextCenter()
在沒有運氣的情況下嘗試了大多數答案。 大多數時候我得到的是藍色圖像,或者標題不在中心。 使用了一些答案中的代碼並編寫了這個擴展,就像一個魅力。
斯威夫特 4.2:
import UIKit
extension UIButton {
func moveImageLeftTextCenter(image : UIImage, imagePadding: CGFloat, renderingMode: UIImage.RenderingMode){
self.setImage(image.withRenderingMode(renderingMode), for: .normal)
guard let imageViewWidth = self.imageView?.frame.width else{return}
guard let titleLabelWidth = self.titleLabel?.intrinsicContentSize.width else{return}
self.contentHorizontalAlignment = .left
let imageLeft = imagePadding - imageViewWidth / 2
let titleLeft = (bounds.width - titleLabelWidth) / 2 - imageViewWidth
imageEdgeInsets = UIEdgeInsets(top: 0.0, left: imageLeft, bottom: 0.0, right: 0.0)
titleEdgeInsets = UIEdgeInsets(top: 0.0, left: titleLeft , bottom: 0.0, right: 0.0)
}
}
希望對一些人有所幫助!
這對我來說效果很好,對於幾個具有不同圖像寬度和不同標題長度的按鈕:
子類UIButton
,並添加以下方法:
override func layoutSubviews() {
super.layoutSubviews()
if let image = imageView?.image {
let margin = 30 - image.size.width / 2
let titleRect = titleRectForContentRect(bounds)
let titleOffset = (bounds.width - titleRect.width - image.size.width - margin) / 2
contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left
imageEdgeInsets = UIEdgeInsetsMake(0, margin, 0, 0)
titleEdgeInsets = UIEdgeInsetsMake(0, (bounds.width - titleRect.width - image.size.width - margin) / 2, 0, 0)
}
}
我迅速寫了一個 UIButton 擴展 -
extension UIButton {
func setLeftImage(imageName:String, padding:CGFloat) {
//Set left image
let image = UIImage(named: imageName)
self.setImage(image, forState: .Normal)
//Calculate and set image inset to keep it left aligned
let imageWidth = image?.size.width
let textWidth = self.titleLabel?.intrinsicContentSize().width
let buttonWidth = CGRectGetWidth(self.bounds)
let padding:CGFloat = 30.0
let rightInset = buttonWidth - imageWidth! - textWidth! - padding
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: rightInset)
}
}
我會以任何我想要的方式設置按鈕文本的樣式,並保持居中對齊。 然后我會在我的按鈕上調用這個方法,比如 -
myButton.setLeftImage("image_name", 30.0)
這將導致我的圖像與左邊框的一些填充左對齊。
1) button.frame = self.view.bounds;
2) setImageEdgeInsets
為負值,當你的按鈕填滿屏幕時,是瘋狂的。 重新考慮你在這里想要做什么?
3) UITextAlignmentCenter
現在是NSTextAlignmentCenter
4) button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
我在這里看到很多解決方案都專注於將圖標設置在左側。 我認為添加 UIImageView 更容易,將按鈕的左側和圖像對齊並將它們放在一起。 然后你可以稍微調整一下偏移量,讓它看起來不錯。
無需代碼,全部在 Interface Builder 中。
我知道這個答案有點晚了。 但是對於想要在帶有居中文本的 UIButton 的左側使用 UIImageView 添加圖像的人,我有一個非常簡單的解決方案。 全部以編程方式
class RandomVC: UIViewController{
var imageDemo: UIImageView = {
let img = UIImageView()
img.translatesAutoresizingMaskIntoConstraints = false
img.image = UIImage(named: "someImgFromAssets")
return img
}()
lazy var someButton: UIButton = { //lazy var: so button can have access to self class
let button = UIButton(type: .system)
button.setTitle("This is your title", for: UIControlState.normal)
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitleColor(UIColor.white, for: UIControlState.normal)
button.addTarget(self, action: #selector(handleButtonClick), for: .touchUpInside) //make sure you write function "handleButtonClick" inside your class
button.titleLabel?.textAlignment = .center
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubView(someButton)
someButton.addSubview(imageDemo)
imageDemo.centerYAnchor.constraint(equalTo: someButton.centerYAnchor).isActive = true
imageDemo.leftAnchor.constraint(equalTo: someButton.leftAnchor, constant: 10).isActive = true
imageDemo.heightAnchor.constraint(equalToConstant: 25).isActive = true
imageDemo.widthAnchor.constraint(equalToConstant: 25).isActive = true
}
}
以下擴展在 Swift 4.2 中對我有用
func leftImage(image: UIImage, padding: CGFloat, renderMode: UIImage.RenderingMode) {
self.setImage(image.withRenderingMode(renderMode), for: .normal)
contentHorizontalAlignment = .left
let availableSpace = bounds.inset(by: contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.right - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: availableWidth / 2, bottom: 0, right: 0)
imageEdgeInsets = UIEdgeInsets(top: 0, left: padding, bottom: 0, right: 0)
}
func rightImage(image: UIImage, padding: CGFloat, renderMode: UIImage.RenderingMode){
self.setImage(image.withRenderingMode(renderMode), for: .normal)
semanticContentAttribute = .forceRightToLeft
contentHorizontalAlignment = .right
let availableSpace = bounds.inset(by: contentEdgeInsets)
let availableWidth = availableSpace.width - imageEdgeInsets.left - (imageView?.frame.width ?? 0) - (titleLabel?.frame.width ?? 0)
titleEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: availableWidth / 2)
imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: padding)
}
我的SWIFT 5.2解決方案。
你必須繼承 UIButton 類。 無需像其他答案中的其他人那樣更改內容水平對齊方式,將其保持為“居中”(.center)。 標題將自動居中,而 imageRect() 的覆蓋將對圖像起到作用。
您要做的第一件事是將 CustomButton 類分配給故事板的 Identity Inspector 部分中的按鈕。 然后,您可以將“alignImageToLeft”切換到“屬性檢查器”部分的“開”或“關”(默認為“關”)。
class CustomButton : UIButton {
@IBInspectable var alignImageToLeft : Bool = false
override func imageRect(forContentRect contentRect: CGRect) -> CGRect {
if(alignImageToLeft){
let imageRect = super.imageRect(forContentRect: contentRect)
let offset = contentRect.minX - imageRect.minX
return imageRect.offsetBy(dx: offset, dy: 0.0)
}
return super.imageRect(forContentRect: contentRect)
}
}
一個技巧是:
titleRectForContentRect
以使按鈕的titleLabel
的frame
等於按鈕的邊界titleLabel
的textAlignment
為.Center
覆蓋imageRectForContentRect
指定origin.x
按鈕的的imageView
import UIKit class ButtonWithLeftAlignedImageAndCenteredText: UIButton { override init(frame: CGRect) { super.init(frame: frame) titleLabel?.textAlignment = .Center } override func imageRectForContentRect(contentRect: CGRect) -> CGRect { var imageFrame = super.imageRectForContentRect(contentRect) imageFrame.origin.x = 20 //offset from left edge return imageFrame } override func titleRectForContentRect(contentRect:CGRect) -> CGRect { var titleFrame = super.titleRectForContentRect(contentRect) titleFrame = self.bounds return titleFrame } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } }
您可以使用以下代碼在 UIButton 上左對齊圖像:-
第1步:
//create your UIButton
UIButton *post_bNeeds_BTN= [UIButton buttonWithType:UIButtonTypeRoundedRect];
post_bNeeds_BTN.frame= CGRectMake(160 ,5 ,150 ,40);
[post_bNeeds_BTN addTarget:self action:@selector(post_Buying_Needs_BTN_Pressed:) forControlEvents:UIControlEventTouchUpInside];
[post_bNeeds_BTN setBackgroundColor:[UIColor colorWithRed:243/255.0 green:131/255.0 blue:26/255.0 alpha:1.0f]];//230
[self.view addSubview:post_bNeeds_BTN];
post_bNeeds_BTN.autoresizingMask= UIViewAutoresizingFlexibleWidth;
第2步:
//Add UIImageView on right side the button
UIImageView *bNeedsIVw= [[UIImageView alloc] initWithFrame:CGRectMake(5,5,30,30)];
bNeedsIVw.image= [UIImage imageNamed:@"postRequir_30.png"];
bNeedsIVw.image= [bNeedsIVw.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
bNeedsIVw.tintColor= [UIColor whiteColor];
[post_bNeeds_BTN addSubview:bNeedsIVw];
第 3 步:
//also set UILable on UIButton
UILabel *bNeedsLbl= [[UILabel alloc] initWithFrame:CGRectMake(40 ,0 ,post_Prod_BTN.frame.size.width-40 ,post_Prod_BTN.frame.size.height)];
bNeedsLbl.text= @"Requirements";
bNeedsLbl.font= [UIFont systemFontOfSize:16];
bNeedsLbl.textColor= [UIColor whiteColor];
bNeedsLbl.textAlignment= NSTextAlignmentLeft;
[post_bNeeds_BTN addSubview:bNeedsLbl];
第四步:
-(void)post_Buying_Needs_BTN_Pressed:(id)sender{
//write your code action here,,
}
謝謝,
此代碼使您的按鈕圖像左對齊,標題標簽移動到按鈕的中心。 b 是按鈕 :)
b.contentHorizontalAlignment = .Left
let left = (b.frameWidth() - b.titleLabel!.frameWidth()) / 2 - CGRectGetMaxX(b.imageView!.frame)
b.titleEdgeInsets = UIEdgeInsetsMake(0, left, 0, 0)
可以使用擴展來應用此解決方案。 不需要子類化。
警告:每次更新文本/圖像時都必須調用它。
let width = frame.width
guard let imageWidth = imageView?.frame.width, let labelWidth = titleLabel?.frame.width else {
return
}
titleEdgeInsets = UIEdgeInsets(top: 0, left: (width - labelWidth)/2.0 - imageWidth, bottom: 0, right: 0)
您可能會忘記 UIEdgeInsets 並簡單地覆蓋 UIButton 子類中 layoutSubviews() 中的框架。
要使 titleLable 居中,只需通過 super.bounds.midX 和 titleLabel.frame.midX 之間的差異向 titleLabel 框架添加水平偏移量
override func layoutSubviews() {
super.layoutSubviews()
if let label = titleLabel {
label.frame = label.frame.offsetBy(dx: super.bounds.midX -
label.frame.midX , dy: 0)
}
// Available space to the left of the titleLabel is simply:
let leftAvailableWidth = label.frame.minX
imageView?.frame = CGRect(x: 0, y: 0, width: <Some width smaller than leftAvailableWidth>, height: super.bound.height)
}
@trishcode 回答對我有用。 我只是將它與 UIButton 的擴展一起使用。
這是代碼:
extension UIButton {
func centerImageLeft(padding: CGFloat = 30.0){
let buttonWidth = self.frame.width
let textWidth = self.titleLabel?.intrinsicContentSize.width ?? 0
let imageViewWidth = self.imageView?.frame.size.width ?? 0
let offsetToLeftButtonEdge = buttonWidth - textWidth - imageViewWidth
let offset = offsetToLeftButtonEdge - padding
self.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: 0, bottom: 0.0, right: offset)
}
}
然后你可以在 viewDidAppear 方法中這樣調用它:
button.centerImageLeft()
Swift 5:您可以通過使用 UIButton 的自定義類來實現這一點。
class CustomButton: UIButton {
var imageV = UIImageView()
var titleV = UILabel()
override func awakeFromNib() {
self.imageView?.isHidden = true
self.titleLabel?.isHidden = true
imageV.frame = CGRect(x: 0, y: 0, width: 40, height: self.bounds.height)
imageV.contentMode = .scaleAspectFit
titleV.frame = CGRect(x: 40, y: 0, width: self.bounds.width - 40, height: self.bounds.height)
titleV.font = self.titleLabel?.font
titleV.textAlignment = .center
self.addSubview(imageV)
self.addSubview(titleV)
imageV.image = self.imageView?.image; titleV.text = self.titleLabel?.text
imageV.translatesAutoresizingMaskIntoConstraints = false
imageV.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
imageV.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
imageV.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0).isActive = true
imageV.trailingAnchor.constraint(equalTo: titleV.leadingAnchor, constant: 0).isActive = true
imageV.widthAnchor.constraint(equalToConstant: 40).isActive = true
titleV.translatesAutoresizingMaskIntoConstraints = false
titleV.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
titleV.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
titleV.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
}
}
稍后您可以像這樣設置圖像和文本。
button.imageV.image = myImage
button.titleV.text = myText
結果
這對我來說適用於不同的按鈕文本大小。
獲得准確按鈕文本寬度的關鍵是獲取內在內容大小。 由於我對按鈕寬度使用自動布局,因此我必須從 viewDidAppear 而不是 viewDidLoad 運行此代碼,以便按鈕已經繪制,因此按鈕框架大小將是准確的。
private func calculateAccountButtonImageViewOffset(button: UIButton, padding: CGFloat = 30.0) -> CGFloat {
let buttonWidth = button.frame.width
let textWidth = button.titleLabel?.intrinsicContentSize.width ?? 0
let imageViewWidth = button.imageView?.frame.size.width ?? 0
let offsetToLeftButtonEdge = buttonWidth - textWidth - imageViewWidth
return offsetToLeftButtonEdge - padding
}
用法:
let imageViewOffset = calculateAccountButtonImageViewOffset(button: button)
button.imageEdgeInsets = UIEdgeInsets(top: 0.0, left: 0, bottom: 0.0, right: imageViewOffset)
最好創建一個自定義 UIButton 子類來以更好的方式解決此問題。 Apple 可能正在“重置”您的設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.