25

有很多关于根据标题文本对齐按钮图像的线程,但我找不到任何关于将图像对齐到按钮右侧的信息。

这没有效果:

button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 50);

如何右对齐按钮的图像?可以在情节提要中完成吗?

4

16 回答 16

63

语义:在视图上强制从右到左对我有用在此处输入图像描述

于 2017-01-12T14:36:36.113 回答
26

我发现了一个棘手的方法更新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
于 2017-03-16T11:59:20.970 回答
19

有几种不同的选择可以做到这一点。

利用semanticContentAttribute

button.semanticContentAttribute = .forceRightToLeft

您也可以从界面(故事板)布局中设置语义属性。

在此处输入图像描述


使用包含 UIButton 和 UIImage 的 UIView,如此快照所示。

  • 在 UIView 中设置图像右侧并禁用用户交互,因此用户操作/点击将传递给按钮。
  • 在 UIView 中添加与 UIView 大小相同的按钮,具有透明背景颜色和覆盖图像。
  • 设置按钮的内容偏移量,如此快照所示。

在此处输入图像描述

这将使处理按钮操作、属性和根据您的要求自定义图像位置和大小变得容易。尝试这个。

于 2018-03-09T05:25:26.903 回答
17

故事板

属性选项卡 > 确保为“图像”选择了内容边缘选项卡:

1

然后你改变'Left'属性不正确,这就是你以编程方式做的事情。所以换句话说,你从左边填充它

UIEdgeInsetsMake = TOP | 左 | 底部 | 正确的

以编程方式:

button.imageEdgeInsets = UIEdgeInsetsMake(0, 100, 0, 0);

注意:您可能还需要更改标题插图,具体取决于它与您的图像相关的位置

于 2015-09-03T02:55:28.257 回答
14

试试下面的代码:

btn.contentHorizontalAlignment = .right
于 2018-08-21T05:06:13.947 回答
13

在 Swift 中做到这一点的干净方法

button.semanticContentAttribute = .forceRightToLeft

希望这可以帮助

于 2017-12-29T13:09:17.473 回答
10

简单的方法

使用扩展在右侧使用自定义偏移设置图像

   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
    }
}
于 2019-01-09T13:10:33.683 回答
5

使其成为默认语义,即未指定或强制从左到右

并在 button.imageEdgeInsets 中将其设置为

UIEdgeInsets(top: 0, left: self.view.frame.size.width - (图片尺寸+对齐空间), bottom: 0, right: 0)

这将确保无论视图大小是多少,它都会始终从按钮的右侧对齐图像

于 2017-10-03T13:30:15.513 回答
4

它对我有用:

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)
于 2019-05-09T12:14:39.500 回答
1

要将图像右对齐,“语义”选项似乎是最好的,“强制从右到左”。此外,我还想补充一件事。您可以通过此选项保持按钮图像的形状。 用户定义的运行时属性

于 2019-04-24T08:00:56.453 回答
1

像这样:

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
于 2019-02-12T13:27:29.393 回答
0

斯威夫特 5

button.imageEdgeInsets = UIEdgeInsets(top: 0, left: (bounds.width - 16), bottom: 0, right: 0)
于 2020-09-11T16:09:00.250 回答
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
于 2020-05-04T18:36:36.280 回答
0

将 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()
于 2021-09-14T10:45:23.943 回答
0

这通过设置为我工作:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;

然后对于内部图像,我将右插图设置为 0。

button.imageEdgeInsets = UIEdgeInsetsMake(10.0, 10.0, 10.0, 0);
于 2019-06-15T17:00:37.497 回答
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
}
于 2022-02-22T16:56:09.027 回答