在不更改位置的情况下更改自定义UIButton中的UILabel标题

时间:2019-09-15 09:30:27

标签: ios swift uibutton uilabel

我有一个UIButton,标签在左侧,UIImageView在右侧。该按钮用于打开UIPicker。当在选择器中选择一个值时,相同的值会显示在按钮标题中。当标题更改时(或更准确地说,当uilabel的宽度使UI拧紧时),标题和图标将移动,并且UI外观不佳。

如果使用的标题文字太长,则会剪裁单词;如果文字的标题太短,则会使对齐方式混乱。

我尝试过更改标签框架,使其无论文本如何都可以保持恒定,并左对齐文本以使跳跃停止。我添加了adjustsFontSizeToFitWidth = true哪种类型的作品,但是标题较长时,文本将变得太小。当标题更改但所有尝试均失败时,我也尝试过重新创建/呈现按钮。

lazy var sortButton = { () -> UIButton in
        let btn = UIButton()
        btn.addTarget(self, action: #selector(sortButtonPressed), for: .touchUpInside)
        btn.setTitle(NSLocalizedString("Sortera", comment: ""), for: .normal)
        btn.titleLabel?.text = btn.titleLabel?.text?.uppercased()
        btn.setImage(UIImage(named: "ios-down"), for: .normal)

        btn.translatesAutoresizingMaskIntoConstraints = false
        btn.setTitleColor(Colors.FILTER_BUTTON_TEXT_COLOR, for: .normal)
        btn.titleLabel?.adjustsFontSizeToFitWidth = true
        btn.titleLabel?.font = UIFont(name: Fonts.AkzidenzGroteskProMd, size: 16)
        btn.backgroundColor = Colors.BUTTON_BACKGROUND_GRAY
        btn.imageView?.contentMode = .scaleAspectFit
        btn.imageEdgeInsets = UIEdgeInsets(top: 16, left: (btn.titleLabel?.frame.size.width)! - buttonInsideOffset/2, bottom: 16, right: -(btn.titleLabel?.frame.size.width)! + buttonInsideOffset/2)
        btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: -(btn.titleLabel?.frame.size.width)! + buttonInsideOffset, bottom: 0, right: (btn.titleLabel?.frame.size.width)! - buttonInsideOffset)
        return btn
    }()

无论标题文字如何,我都希望所有按钮都喜欢这样: enter image description here

但是,当文本太小时,它看起来像这样: enter image description here

或时间过长:

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以用多种方法来做,但最简单的方法是:

先获取一个UIView,然后再在此View中设置其他两个元素(标签为imageView),使其看起来像按钮,然后根据需要设置约束。然后使用addTarget标记并对该目标选择器方法执行所有功能。

答案 1 :(得分:0)

如果您不希望按钮图像左右移动,则必须不受按钮标题标签的约束

     btn.imageView?.frame = CGRect(x: 0, y: 0, width: 20, height: 20) // Or any size you want

    // NB: I ommited left insets intentionally
    btn.imageEdgeInsets.top = 16
    btn.imageEdgeInsets.bottom = 16
    btn.imageEdgeInsets.right = 16

然后将标签限制为取决于imageView的位置,这样,只有标签大小会发生变化,而不会影响图像的位置。

btn.titleEdgeInsets = UIEdgeInsets(top: 0, left: -(btn.titleLabel?.frame.size.width)! + buttonInsideOffset, bottom: 0, right:   btn.imageView?.frame.width + 10)

最后,由于帧是固定大小的,所以我认为您需要将字体缩放比例限制为所需的最小大小,并在达到该大小时截断尾部。如果您不想截断尾巴,则必须启用多行titleLabel(我认为您不希望这样做)。

    btn.titleLabel?.minimumScaleFactor = 0.5 // Or whatever minimum scale you wish
    btn.titleLabel?.lineBreakMode = NSLineBreakMode.byTruncatingTail // Since button size is fixed and you want to limit font size then the best option is to truncate tail