如何在文本中添加按钮,如Twitter上的Instagram应用程序的hash标签。

问题描述 投票:0回答:1

文本中的按钮,如Instagram或Twitter应用的按钮。

在我的iOS应用中,我需要在文本中嵌入按钮,就像Instagram或Twitter应用在文章中嵌入Hash标签一样。

一些详细的要求是

  • 按钮触发 "TOUCHN UP INSIDE "的iOS原生动作。
  • 按钮需要像UIButtons一样在 "TOUCH DOWN "时发光。
  • 按钮不是网页链接

.链接AttribuedString没有用(这就是大家说的解决办法)

使用.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))
    }
}


ios swift uibutton uilabel uitextview
1个回答
0
投票

我手头没有代码,但我不推荐上面的方法。你应该创建一个自定义的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
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.