2017-06-06 60 views
0

我有以下UIButton呈現複選框和標籤; iOS UIButton rendering as checkboxUIButton標籤檢測點擊特定文本

要創建此,我用一個UIButton控制與NSMutableAttributedString給「條款&條件」不同的風格文本的其餘部分。

就像使用網頁上的複選框一樣,我希望用戶能夠點擊灰色文本或圖像本身來打開或關閉複選框。

但是,如果用戶點擊「條款&條件」我希望執行操作(例如加載術語URL)。

這在Android中很容易實現,因爲您可以使用checkbox.setMovementMethod(LinkMovementMethod.getInstance());,但在iOS中,我非常努力地找到一種方法來基本創建一個包含鏈接標籤的複選框。

有沒有人曾經這樣做過,你是如何處理的?

+0

此鏈接可幫助您。 https://stackoverflow.com/questions/20541676/ios-uitextview-or-uilabel-with-clickable-links-to-actions –

+0

你想點擊標籤或當開關改變? – Gregga17

+0

就像它可以在網頁上工作 - 點擊「標籤」也會標記複選框 - 除非用戶點擊了可以打開鏈接/操作的「條款和條件」。 –

回答

0

最後我做了以下內;

爲我的實際複選框創建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 
     } 
    } 
} 

最終結果是,UIButton和UITextView的非鏈接文本都會打開和關閉複選框。 「條款&條款」文本將鏈接到網站或在其他地方繼續。

希望這可以幫助別人。

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); 
} 
+0

如果它是一個標籤,那麼是的,我可以使用TTTAttributedLabel - 儘管我更可能使用UITextView - NSAttributedString作爲定義點擊鏈接和UITextViewDelegate以捕獲鏈接的鏈接的方式。 https://stackoverflow.com/a/36604425/263534原因是我認爲擴展UIButton會更有意義,因爲它主要是一個複選框。 –

+0

好的感謝您的反饋 –