如果可以避免,我不想使用子视图。我想要一个带有背景图像,文本和图像的UIButton。现在,当我这样做的时候,图像在文本的左边。背景图像、文本和图像都有不同的高亮状态。


当前回答

扩展的方法

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

   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
    }
}

其他回答

从2016年1月开始,所有这些答案都是不必要的。在接口构建器中,将视图语义设置为强制从右向左,或者如果你更喜欢编程的方式,semanticContentAttribute = . forcerighttolefleft这将导致图像出现在文本的右侧。

对于这个问题,你可以在“label with UIImage view”中创建UIView,并将UIView类设置为UIControl,并创建IBAction为tuch up inside

子类化和覆盖layoutSubviews可能是你最好的方法。

引用自:iPhone UIButton -图像位置

更新XCODE 9(通过接口生成器)

在Interface Builder中有一个更简单的方法。

选择UIButton并在View Utilities > Semantic中选择这个选项:

就是这样!很好很简单!

可选-第二步:

如果你想调整图像和标题之间的间距,你可以在这里更改图像插入:

尽管一些建议的答案非常有创意和聪明,但最简单的解决方案如下:

button.semanticContentAttribute = UIApplication.shared
    .userInterfaceLayoutDirection == .rightToLeft ? .forceLeftToRight : .forceRightToLeft

就这么简单。作为奖励,在从右到左的区域中,图像将位于左侧。

编辑:这个问题已经被问过几次了,这是iOS 9 +。