在我的iOS应用中,我需要在文本中嵌入按钮,就像Instagram或Twitter应用在文章中嵌入Hash标签一样。
使用.link属性为AttributedString是我得到的最接近的方法,但它有一些副作用。
它满足了我所有的要求,但是当我长按按钮时,iOS通过其UIKit功能在UITextLabel上显示了一个链接文本,而且这个链接文本也可以被拖动,我不希望这些情况发生。
下面是我尝试的方法。 我基本上添加了.link属性,并将关键字设置为URL,这样我就可以在UITextView的委托方法上重试特定的关键字 "应该与URL交互",并触发一些iOS本地代码。
public extension NSMutableAttributedString {
func setKeywordAsLink(keyword: String, fontAttributeForKeyword font: UIFont) {
guard let url = keyword.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { return }
self.addAttributes([ NSAttributedString.Key.font: font], range: NSString(string: self.string).range(of: keyword))
self.addAttribute(.link, value: url, range: NSString(string: self.string).range(of: keyword))
}
}
我手头没有代码,但我不推荐上面的方法。你应该创建一个自定义的UIButton类,并覆盖isHighlighted和isSelected函数。这里有一个类似的例子,我在一个老项目中覆盖了isHighlighted。你可以像平常一样添加UIButton,只需将它设置为你的自定义Class的类型(这里会让button:UIButtonExample!)如果你愿意,你可以为TouchUpInside和TouchDown添加常规的IBActions。
class UIButtonExample: UIButton {
override func awakeFromNib() {
super.awakeFromNib()
//set up origin formatting here
layer.borderWidth = 1.0
layer.borderColor = .black
}
override var isHighlighted: Bool {
didSet {
if self.isHighlighted {
//pressed on
self.animatePress()
} else {
//unpressed
self.animateHome()
}
}
}
func animatePress() {
UIView.animate(withDuration: 0.15) {
self.transform = CGAffineTransform(scaleX: 0.9, y: 0.9)
}
}
func animateHome() {
UIView.animate(withDuration: 0.3) {
self.transform = CGAffineTransform.identity
}
}
}