我有一个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
}()
或时间过长:
答案 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