【发布时间】:2015-11-01 03:31:00
【问题描述】:
我正在尝试制作一个 UIButton,它在按钮标题的任一侧(左侧和右侧)都有一个 UIImage。理想情况下,图像将固定在按钮的左侧和右侧,并且标题将居中,但我可以忍受图像就在我想的标题标签旁边。我已经能够添加一张图片,它出现在标题之前,但我该如何添加第二张呢?
【问题讨论】:
标签: swift uibutton customization
我正在尝试制作一个 UIButton,它在按钮标题的任一侧(左侧和右侧)都有一个 UIImage。理想情况下,图像将固定在按钮的左侧和右侧,并且标题将居中,但我可以忍受图像就在我想的标题标签旁边。我已经能够添加一张图片,它出现在标题之前,但我该如何添加第二张呢?
【问题讨论】:
标签: swift uibutton customization
我知道这是一个老问题,但由于没有提供代码并且有人要求它,我想我会分享我的解决方案。
我所做的是创建一个子类 UIButton 的新类。我确保您也可以在界面构建器中立即看到您所做的所有更改。所以你可以只拖入一个 UIButton。将类指定为您自己的类,它将允许您设置图像并立即看到它被绘制
这是我为实现这一目标所做的工作
import UIKit
@IBDesignable
class AddProfilePictureView: UIButton {
@IBInspectable var leftHandImage: UIImage? {
didSet {
leftHandImage = leftHandImage?.withRenderingMode(.alwaysOriginal)
setupImages()
}
}
@IBInspectable var rightHandImage: UIImage? {
didSet {
rightHandImage = rightHandImage?.withRenderingMode(.alwaysTemplate)
setupImages()
}
}
func setupImages() {
if let leftImage = leftHandImage {
self.setImage(leftImage, for: .normal)
self.imageView?.contentMode = .scaleAspectFill
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.frame.width - (self.imageView?.frame.width)!)
}
if let rightImage = rightHandImage {
let rightImageView = UIImageView(image: rightImage)
rightImageView.tintColor = COLOR_BLUE
let height = self.frame.height * 0.2
let width = height
let xPos = self.frame.width - width
let yPos = (self.frame.height - height) / 2
rightImageView.frame = CGRect(x: xPos, y: yPos, width: width, height: height)
self.addSubview(rightImageView)
}
}
}
【讨论】:
我会把它分成一个集合视图中的两个按钮——它非常灵活,可以很好地处理这样的事情。
【讨论】:
通过addSubview为按钮添加一个带有图像的UIImageView,通过setImage为按钮添加另一个图像,可以通过titleEdgeInsets和imageEdgeInsets进行调整。
如果您需要代码示例,请告诉我。
希望对您有所帮助!
【讨论】:
Swift 5、XCode 11.6
请在您的扩展程序或自定义 UIButton 类中使用以下代码。我在我的自定义类中使用了以下代码。该函数将分别设置左或右图像并对齐文本。
/// Sets a left and right image for a button
/// - Parameters:
/// - right: right image
/// - left: left image
func setImages(right: UIImage? = nil, left: UIImage? = nil) {
if let leftImage = left, right == nil {
setImage(leftImage, for: .normal)
imageEdgeInsets = UIEdgeInsets(top: 5, left: (bounds.width - 35), bottom: 5, right: 5)
titleEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: (imageView?.frame.width)!)
contentHorizontalAlignment = .left
}
if let rightImage = right, left == nil {
setImage(rightImage, for: .normal)
imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: (bounds.width - 35))
titleEdgeInsets = UIEdgeInsets(top: 0, left: (imageView?.frame.width)!, bottom: 0, right: 10)
contentHorizontalAlignment = .right
}
if let rightImage = right, let leftImage = left {
setImage(rightImage, for: .normal)
imageEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: (bounds.width - 35))
titleEdgeInsets = UIEdgeInsets(top: 0, left: (imageView?.frame.width)!, bottom: 0, right: 10)
contentHorizontalAlignment = .left
let leftImageView = UIImageView(frame: CGRect(x: bounds.maxX - 30,
y: (titleLabel?.bounds.midY)! - 5,
width: 20,
height: frame.height - 10))
leftImageView.image?.withRenderingMode(.alwaysOriginal)
leftImageView.image = leftImage
leftImageView.contentMode = .scaleAspectFit
leftImageView.layer.masksToBounds = true
addSubview(leftImageView)
}
}
用法:
【讨论】: