UIButton标签检测特定文本的点击

时间:2017-06-06 12:34:10

标签: ios swift user-interface swift3 uibutton

我有以下UIButton来呈现复选框和标签; iOS UIButton rendering as checkbox

为了创建这个,我使用带有NSMutableAttributedString的UIButton控件来提供" Terms&条件"与文本其余部分不同的风格。

就像网页上的复选框一样,我希望用户能够点击灰色文本或图像本身来打开或关闭复选框。

但是,如果用户点击"条款&条件"我希望它能够执行操作(例如加载术语URL)。

这在Android中很容易实现,因为您可以使用checkbox.setMovementMethod(LinkMovementMethod.getInstance());,但在iOS中,我真的很难找到一种方法来基本上创建一个带有包含链接的标签的复选框。

以前有没有人这样做过,你是怎么做的?

2 个答案:

答案 0 :(得分:3)

我最终做了以下事情;

为我的实际复选框创建了一个UIButton(空文本标签),为我的相邻复选框标签文本创建了一个UITextView。

然后我就这样使用了NSMutableAttributedString;

class MyViewController: UIViewController, UITextViewDelegate {

    override func viewDidLoad() {
        let attributedTermsTitle = NSMutableAttributedString()
        attributedTermsTitle.append(NSAttributedString(string: "I have read and accept the ", attributes: [NSFontAttributeName:UIFont(name: "My-Font", size: 14)!]))
        attributedTermsTitle.append(NSAttributedString(string: "Terms & Conditions", attributes: [NSFontAttributeName:UIFont(name: "My-Font", size: 14)!, NSLinkAttributeName: "terms"]))

        termsText.linkTextAttributes = [NSForegroundColorAttributeName: UIColor.blue]
        termsText.attributedText = attributedTermsTitle

        termsText.delegate = self
        termsText.isSelectable = true
        termsText.isUserInteractionEnabled = true
        termsText.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(MyViewController.toggleCheckbox)))
    }

    func toggleCheckbox(sender: UITapGestureRecognizer) {    
        termsButton.isChecked = !termsButton.isChecked
    }

    func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

        let link = URL.absoluteString
        if(link == "terms") {
             // link to the Terms web page / screen
        }

        return false
    }

}

并且对于UIButton,给了班级;

class CheckBox: UIButton {
    let checkedImage = UIImage(named: "checkbox_on")! as UIImage
    let uncheckedImage = UIImage(named: "checkbox_off")! as UIImage

    var isChecked: Bool = false {
        didSet{
            if isChecked == true {
                self.setImage(checkedImage, for: UIControlState.normal)
            } else {
                self.setImage(uncheckedImage, for: UIControlState.normal)
            }
        }
    }

    override func awakeFromNib() {
        self.addTarget(self, action:#selector(buttonClicked(sender:)), for: UIControlEvents.touchUpInside)
        self.isChecked = false
    }

    func buttonClicked(sender: UIButton) {
        if sender == self {
            isChecked = !isChecked
        }
    }
} 

最终结果是UITextView的UIButton和非链接文本都会打开和关闭复选框。 "条款&条件"文本将链接到网站或segue在其他地方。

希望这有助于其他人。

答案 1 :(得分:1)

您可以使用TTTAttributedLabel在UILabel中制作特定的部分或单词。

例如

label.text = @"Fork me on GitHub!"; // Repository URL will be automatically detected and linked
NSRange range = [label.text rangeOfString:@"me"];
[label addLinkToURL:[NSURL URLWithString:@"meUrl"] withRange:range];

在这里我变得可以点击并且点击那个单词委托方法didSelectLinkWithURL被调用,你可以检查该函数内的那个链接

(void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url {
    NSLog(@"link %@", [url absoluteString]);
   if ([url absoluteString] == @"meUrl") {
   //implement your logic here
   }
    NSLog(@"whole label %@", label);
}