UIButton为多行属性标题插入了bug

时间:2017-07-05 20:56:00

标签: swift uibutton swift-playground

我想设计一个符合这些规则的按钮:

  • 内容水平居中
  • 内容两侧的18px保证金
  • 图片与标题之间的10像素
  • 如果需要,标题将包含多行
  • 使用归因标题

我有一个使用的工作解决方案:

button.setTitle(title, for: .normal)

结果:

result obtained using setTitle

但是,如果我使用的话,我无法理解为什么它不起作用:

button.setAttributedTitle(NSAttributedString(string: title), for: .normal)

结果:

result obtained using setAttributedTitle

它不尊重10px和18px插图。另请注意,只有在标题变为多行时才会出现此问题。

以下是我用来确定问题的操场:

//: Playground - noun: a place where people can play

import UIKit
import PlaygroundSupport

extension UIImage {
    class func imageWithView(view: UIView) -> UIImage? {
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
        view.drawHierarchy(in: view.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }
}

class ActionBarView: UIView {
    // MARK: Properties

    private var icon: UIImage?

    private let stackView = UIStackView()
    private let proposeButton = UIButton()
    private let declineButton = UIButton()

    // MARK: Initialization

    override init(frame: CGRect) {
        super.init(frame: frame)

        designView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    // MARK: Design

    private func designView() {
        designIcon()

        designStackView()
        designProposeButton()
        designDeclineButton()
    }

    private func designIcon() {
        let image = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        image.backgroundColor = .magenta
        icon = UIImage.imageWithView(view: image)
    }

    private func designStackView() {
        stackView.addArrangedSubview(proposeButton)
        stackView.addArrangedSubview(declineButton)
        stackView.distribution = .fillEqually
        stackView.spacing = 1

        addSubview(stackView)
        stackView.frame = frame
    }

    private func designProposeButton() {
        design(button: proposeButton,
               icon: icon,
               title: "Propose   a task")
    }

    private func designDeclineButton() {
        design(button: declineButton,
               icon: icon,
               title: "Decline")
    }

    private func design(button: UIButton, icon: UIImage?, title: String) {
        button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 18, bottom: 0, right: 18)
        button.titleEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)
        button.imageEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10)

        button.titleLabel?.backgroundColor = .green
        button.imageView?.backgroundColor = .orange

        button.backgroundColor = .white
        button.setImage(icon, for: .normal)
//        button.setAttributedTitle(NSAttributedString(string: title), for: .normal)
        button.setTitle(title, for: .normal)
        button.titleLabel?.lineBreakMode = .byWordWrapping
    }
}

let view = ActionBarView(frame: CGRect(x: 0, y: 0, width: 320, height: 44))
PlaygroundPage.current.liveView = view

0 个答案:

没有答案
相关问题