当前位置: 移动技术网 > IT编程>移动开发>IOS > 【Swift】获取UILabel中点击的某个功能标签文字并作出响应动作

【Swift】获取UILabel中点击的某个功能标签文字并作出响应动作

2020年05月09日  | 移动技术网IT编程  | 我要评论

防城港汽车站,yvonne buschbaum,末世谈txt下载

1、需求

首先、针对uilabel中显示的多个功能标签,作出颜色标记提示。

其次、对关键字作出点击响应动作。

如图所示:

  解决:

1、使用正则匹配到关键字

public static var hashtag = detectortype.custom(try! nsregularexpression(pattern: "#[\\u4e00-\\u9fa5a-za-z0-9]{1,}", options: []))

扩展:获取字符串中满足正则表达式的字符串

func matches(for regex: string, in text: string) -> [string] {
        do {
            let regex = try nsregularexpression(pattern: regex)
            let results = regex.matches(in: text,
                                        range: nsrange(text.startindex..., in: text))
            return results.map {
                string(text[range($0.range, in: text)!])
            }
        } catch let error {
            print("invalid regex: \(error.localizeddescription)")
            return []
        }
    }
tags = commonuseclass._sharedmanager.matches(for: "#[\\u4e00-\\u9fa5a-za-z0-9]{1,}", in: model.text)

2、对关键字作出点击手势判断

extension uigesturerecognizer {

    func didtapattributedtextinlabel(label: uilabel, inrange targetrange: nsrange) -> bool {
        let layoutmanager = nslayoutmanager()
        let textcontainer = nstextcontainer(size: cgsize.zero)
        let textstorage = nstextstorage(attributedstring: label.attributedtext!)

        layoutmanager.addtextcontainer(textcontainer)
        textstorage.addlayoutmanager(layoutmanager)

        textcontainer.linefragmentpadding = 0.0
        textcontainer.linebreakmode = label.linebreakmode
        textcontainer.maximumnumberoflines = label.numberoflines
        let labelsize = label.bounds.size
        textcontainer.size = labelsize

        let locationoftouchinlabel = self.location(in: label)
        let textboundingbox = layoutmanager.usedrect(for: textcontainer)
        let textcontaineroffset = cgpoint(x: (labelsize.width - textboundingbox.size.width) * 0.5 - textboundingbox.origin.x, y: (labelsize.height - textboundingbox.size.height) * 0.5 - textboundingbox.origin.y)
        let locationoftouchintextcontainer = cgpoint(x: locationoftouchinlabel.x - textcontaineroffset.x, y: locationoftouchinlabel.y - textcontaineroffset.y)
        let indexofcharacter = layoutmanager.characterindex(for: locationoftouchintextcontainer, in: textcontainer, fractionofdistancebetweeninsertionpoints: nil)
        return nslocationinrange(indexofcharacter, targetrange)
    }

}

3、获取点击的字符串,并作出响应

if self.tags.count > 0 {
                var isselecttag = false
                var selecttag = ""
                for tag in self.tags {
                    let termsrange = (self.messagetext as nsstring).range(of: tag)
                    if gesture.didtapattributedtextinlabel(label: self.messagelabel, inrange: termsrange) {
                        isselecttag = true
                        selecttag = tag
                        break
                    }
                }
                
                if isselecttag {
                    delegate?.selecttag(selecttag)
                    return
                }
            }

 转自:https://www.cnblogs.com/xjf125/p/12852743.html

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网