有很多关于根据标题文本对齐按钮图像的线程,但我找不到任何关于将图像对齐到按钮右侧的信息。
这没有效果:
button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 50);
如何右对齐按钮的图像?可以在情节提要中完成吗?
有很多关于根据标题文本对齐按钮图像的线程,但我找不到任何关于将图像对齐到按钮右侧的信息。
这没有效果:
button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 50);
如何右对齐按钮的图像?可以在情节提要中完成吗?
我发现了一个棘手的方法更新UIImageView
按钮的约束
尝试这个
button.imageView?.trailingAnchor.constraint(equalTo: button.trailingAnchor, constant: -8.0).isActive = true
button.imageView?.centerYAnchor.constraint(equalTo: button.centerYAnchor, constant: 0.0).isActive = true
但不要忘记添加它以使约束有效
button.translatesAutoresizingMaskIntoConstraints = false
button.imageView?.translatesAutoresizingMaskIntoConstraints = false
有几种不同的选择可以做到这一点。
利用semanticContentAttribute
button.semanticContentAttribute = .forceRightToLeft
您也可以从界面(故事板)布局中设置语义属性。
或
使用包含 UIButton 和 UIImage 的 UIView,如此快照所示。
这将使处理按钮操作、属性和根据您的要求自定义图像位置和大小变得容易。尝试这个。
试试下面的代码:
btn.contentHorizontalAlignment = .right
在 Swift 中做到这一点的干净方法
button.semanticContentAttribute = .forceRightToLeft
希望这可以帮助
简单的方法
使用扩展在右侧使用自定义偏移设置图像
extension UIButton {
func addRightImage(image: UIImage, offset: CGFloat) {
self.setImage(image, for: .normal)
self.imageView?.translatesAutoresizingMaskIntoConstraints = false
self.imageView?.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0.0).isActive = true
self.imageView?.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -offset).isActive = true
}
}
使其成为默认语义,即未指定或强制从左到右
并在 button.imageEdgeInsets 中将其设置为
UIEdgeInsets(top: 0, left: self.view.frame.size.width - (图片尺寸+对齐空间), bottom: 0, right: 0)
这将确保无论视图大小是多少,它都会始终从按钮的右侧对齐图像
它对我有用:
self.acceptButton.setImage(UIImage(named: image), for: UIControl.State.normal)
self.acceptButton.semanticContentAttribute = .forceRightToLeft
self.acceptButton.imageEdgeInsets = UIEdgeInsets(top: 0, left: 9, bottom: 0, right: 0)
像这样:
btn.imageView?.translatesAutoresizingMaskIntoConstraints = false
btn.imageView?.centerYAnchor.constraint(equalTo: btn.centerYAnchor, constant: 0.0).isActive = true
btn.imageView?.trailingAnchor.constraint(equalTo: btn.trailingAnchor, constant: 0.0).isActive = true
btn.imageView?.contentMode = .right
斯威夫特 5
button.imageEdgeInsets = UIEdgeInsets(top: 0, left: (bounds.width - 16), bottom: 0, right: 0)
这对我有用
btn.imageView?.translatesAutoresizingMaskIntoConstraints = false
btn.imageView?.centerYAnchor.constraint(equalTo: self.centerYAnchor, constant: 0.0).isActive = true
btn.imageView?.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -20).isActive = true
将 UIButton 扩展用于右侧的图像
extension UIButton {
func imageToRight() {
transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
titleLabel?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
imageView?.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
}
}
如何使用
yourButton.imageToRight()
这通过设置为我工作:
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
然后对于内部图像,我将右插图设置为 0。
button.imageEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 10.0, 0);
在 iOS 15.0 中,您可以简单地使用新的配置 API来指定图像放置,在本例中为:trailing。如果您需要支持早期版本,另一种方法是将NSTextAttachment(自 iOS 7.0 起可用)附加到 NSMutableAttributedString 并将其用作按钮的标题。
正如其他响应中所建议的那样,为此使用语义内容属性并强制它从右到左是一个坏主意。该 API 不适用于该用例,可能会产生意想不到的后果。在这种情况下,它会破坏可访问性,尤其是使用 VoiceOver 的导航。原因是如果您向右滑动以到达屏幕中的下一个元素,并且该元素被迫从右到左,VoiceOver 也会反转,如果您再次向右滑动,它将转到上一个元素而不是下一个。如果再次向右滑动,您将返回从右到左的元素。等等等等。用户陷入了焦点陷阱,这可能会非常混乱。
所以代码可能看起来像这样:
if #available(iOS 15.0, *) {
var configuration = UIButton.Configuration.plain()
let image = UIImage(systemName: "applelogo")
configuration.image = image
configuration.imagePadding = 8.0
configuration.imagePlacement = .trailing
button.configuration = configuration
button.setTitle("Apple", for: .normal)
} else {
let buttonTitle = "Apple"
let titleAttributedString = NSMutableAttributedString(string: buttonTitle + " ")
let textAttachment = NSTextAttachment(image: UIImage(systemName: "applelogo")!)
let textAttachmentAttributedString = NSAttributedString(attachment: textAttachment)
titleAttributedString.append(textAttachmentAttributedString)
button.setAttributedTitle(titleAttributedString, for: .normal)
// When using NSTextAttachment, configure an accessibility label manually either
// replacing it for something meaningful or removing the attachment from it
// (whatever makes sense), otherwise, VoiceOver will announce the name of the
// SF symbol or "Atachement.png, File" when using an image
button.accessibilityLabel = buttonTitle
}