Ios 多行UIButton,每行独立截断

Ios 多行UIButton,每行独立截断,ios,uibutton,uilabel,truncate,Ios,Uibutton,Uilabel,Truncate,我试图通过子类化UIButton来创建一个多行按钮。为了避免绘制两个自定义的UILabel(我对Swift/Xcode还是很陌生),我将属性字符串用于现有的UILabel,并使用新行字符拆分行,如下所示: func prepareAttributedTitle(_ primaryTitle: String = "", _ secondaryTitle: String = "") { let title = NSMutableAttributedString() let first

我试图通过子类化UIButton来创建一个多行按钮。为了避免绘制两个自定义的
UILabel
(我对Swift/Xcode还是很陌生),我将属性字符串用于现有的
UILabel
,并使用新行字符拆分行,如下所示:

func prepareAttributedTitle(_ primaryTitle: String = "", _ secondaryTitle: String = "") {
    let title = NSMutableAttributedString()
    let first = NSAttributedString(string: primaryTitle, attributes: [
        NSForegroundColorAttributeName: tintColor,
        NSFontAttributeName: UIFont.systemFont(ofSize: UIFont.systemFontSize, weight: UIFontWeightSemibold)
    ])
    let newLine = NSAttributedString(string: "\n")
    let second = NSAttributedString(string: secondaryTitle, attributes: [
        NSForegroundColorAttributeName: tintColor.withAlphaComponent(0.75),
        NSFontAttributeName: UIFont.systemFont(ofSize: UIFont.smallSystemFontSize)
    ])

    title.append(first)
    title.append(newLine)
    title.append(second)

    setAttributedTitle(title, for: .normal)
}
结果是(对不起,我没有足够的代表发布图片):

但是,我想单独截断行,如下所示:

| This is the long fi... |
| Secondary line         |
有没有一种不用两个自定义UILabel就能做到这一点的方法


谢谢

单个
UILabel
不支持您所需的功能。您必须使用两个单线标签,每组带有尾部截断。

单个
UILabel
不支持您需要的内容。您必须使用两个单线标签,每组带有尾部截断。

我用对我有用的东西来回答我自己的问题。这是我的UIButton子类,但请记住我不是一个有经验的开发人员。还有一些样式和对色调的支持:

import UIKit

@IBDesignable

class FilterButton: UIButton {

    let primaryLabel = UILabel()
    let secondaryLabel = UILabel()

    @IBInspectable var primaryTitle = "" {
        didSet {
            primaryLabel.text = primaryTitle
        }
    }
    @IBInspectable var secondaryTitle = "" {
        didSet {
            secondaryLabel.text = secondaryTitle
        }
    }

    // MARK: Initialization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

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

    override func prepareForInterfaceBuilder() {
        primaryTitle = "Primary title"
        secondaryTitle = "Secondary title"
        commonInit()
    }

    func commonInit() {
        // Force left alignment (FIXME: Use user language direction)
        contentHorizontalAlignment = .left

        // Set some padding and styling
        contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
        layer.cornerRadius = 5
        layer.borderWidth = 1

        // Hide button original label
        titleLabel?.isHidden = true

        // Prepare the primary label
        primaryLabel.frame = CGRect(x: contentEdgeInsets.left,
                                    y: contentEdgeInsets.top,
                                width: frame.width - contentEdgeInsets.left - contentEdgeInsets.right,
                                height: (frame.height - contentEdgeInsets.top - contentEdgeInsets.bottom) / 2)
        primaryLabel.font = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)
        primaryLabel.textColor = tintColor
        // primaryLabel.backgroundColor = UIColor.green // For debugging
        primaryLabel.lineBreakMode = .byTruncatingMiddle // Truncate first line
        primaryLabel.autoresizingMask = .flexibleWidth
        addSubview(primaryLabel)

        // Prepare the secondary label
        secondaryLabel.frame = CGRect(x: contentEdgeInsets.left,
                                      y: contentEdgeInsets.top + primaryLabel.frame.height,
                                  width: frame.width - contentEdgeInsets.left - contentEdgeInsets.right,
                                 height: (frame.height - contentEdgeInsets.top - contentEdgeInsets.bottom) / 2)
        secondaryLabel.font = UIFont.systemFont(ofSize: UIFont.smallSystemFontSize)
        secondaryLabel.textColor = tintColor.withAlphaComponent(0.75)
        // secondaryLabel.backgroundColor = UIColor.yellow // For debugging
        secondaryLabel.lineBreakMode = .byTruncatingMiddle // Truncate second line
        secondaryLabel.autoresizingMask = .flexibleWidth
        addSubview(secondaryLabel)

        primaryLabel.text = primaryTitle
        secondaryLabel.text = secondaryTitle
    }

    // Support tint color
    override func tintColorDidChange() {
        super.tintColorDidChange()
        layer.borderColor = tintColor.cgColor
        layer.backgroundColor = tintColor.withAlphaComponent(0.05).cgColor

        primaryLabel.textColor = tintColor
        secondaryLabel.textColor = tintColor.withAlphaComponent(0.75)
    }
}

我用对我有用的东西来回答我自己的问题。这是我的UIButton子类,但请记住我不是一个有经验的开发人员。还有一些样式和对色调的支持:

import UIKit

@IBDesignable

class FilterButton: UIButton {

    let primaryLabel = UILabel()
    let secondaryLabel = UILabel()

    @IBInspectable var primaryTitle = "" {
        didSet {
            primaryLabel.text = primaryTitle
        }
    }
    @IBInspectable var secondaryTitle = "" {
        didSet {
            secondaryLabel.text = secondaryTitle
        }
    }

    // MARK: Initialization
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

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

    override func prepareForInterfaceBuilder() {
        primaryTitle = "Primary title"
        secondaryTitle = "Secondary title"
        commonInit()
    }

    func commonInit() {
        // Force left alignment (FIXME: Use user language direction)
        contentHorizontalAlignment = .left

        // Set some padding and styling
        contentEdgeInsets = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
        layer.cornerRadius = 5
        layer.borderWidth = 1

        // Hide button original label
        titleLabel?.isHidden = true

        // Prepare the primary label
        primaryLabel.frame = CGRect(x: contentEdgeInsets.left,
                                    y: contentEdgeInsets.top,
                                width: frame.width - contentEdgeInsets.left - contentEdgeInsets.right,
                                height: (frame.height - contentEdgeInsets.top - contentEdgeInsets.bottom) / 2)
        primaryLabel.font = UIFont.boldSystemFont(ofSize: UIFont.systemFontSize)
        primaryLabel.textColor = tintColor
        // primaryLabel.backgroundColor = UIColor.green // For debugging
        primaryLabel.lineBreakMode = .byTruncatingMiddle // Truncate first line
        primaryLabel.autoresizingMask = .flexibleWidth
        addSubview(primaryLabel)

        // Prepare the secondary label
        secondaryLabel.frame = CGRect(x: contentEdgeInsets.left,
                                      y: contentEdgeInsets.top + primaryLabel.frame.height,
                                  width: frame.width - contentEdgeInsets.left - contentEdgeInsets.right,
                                 height: (frame.height - contentEdgeInsets.top - contentEdgeInsets.bottom) / 2)
        secondaryLabel.font = UIFont.systemFont(ofSize: UIFont.smallSystemFontSize)
        secondaryLabel.textColor = tintColor.withAlphaComponent(0.75)
        // secondaryLabel.backgroundColor = UIColor.yellow // For debugging
        secondaryLabel.lineBreakMode = .byTruncatingMiddle // Truncate second line
        secondaryLabel.autoresizingMask = .flexibleWidth
        addSubview(secondaryLabel)

        primaryLabel.text = primaryTitle
        secondaryLabel.text = secondaryTitle
    }

    // Support tint color
    override func tintColorDidChange() {
        super.tintColorDidChange()
        layer.borderColor = tintColor.cgColor
        layer.backgroundColor = tintColor.withAlphaComponent(0.05).cgColor

        primaryLabel.textColor = tintColor
        secondaryLabel.textColor = tintColor.withAlphaComponent(0.75)
    }
}