1.今天做到一个界面,包含不同协议,要求可点击,但是是一段话。之前做的项目都是只包含一个协议,可以直接给lable或者button设置手势或者点击事件,但是包含多个协议且是一段话的时候就要用到label的富文本及超文本。
在这里,有三种思路:
第一种,自己封装的多变的label类,这个网络上好多封装好的demo,但是比较复杂。我暂时先不用这个,需求简单,并且就一个地方用到。所以想另辟蹊径。可以几个推荐的链接:https://www.jianshu.com/p/d04bf1fa6fee
https://www.jianshu.com/p/1d00a2c9dfd8
第二种,利用textview。我采用的这种。上代码
#import "ViewController.h"
@interface ViewController () <UITextViewDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *str1 = @"大美女";
NSString *str2 = @"爱上了英俊的";
NSString *str3 = @"xtayqria";
NSString *str = [NSString stringWithFormat:@"%@%@%@",str1,str2,str3];
NSRange range1 = [str rangeOfString:str1];
NSRange range2 = [str rangeOfString:str2];
NSRange range3 = [str rangeOfString:str3];
UITextView *textView = [[UITextView alloc] init];
textView.frame = CGRectMake(40, 100, 300, 50);
textView.editable = NO;
textView.delegate = self;
[self.view addSubview:textView];
NSMutableAttributedString *mastring = [[NSMutableAttributedString alloc] initWithString:str attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:22.0f]}];
[mastring addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:range1];
[mastring addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:range2];
[mastring addAttribute:NSForegroundColorAttributeName value:[UIColor greenColor] range:range3];
// 1.必须要用前缀(firstPerson,secondPerson),随便写但是要有
// 2.要有后面的方法,如果含有中文,url会无效,所以转码
NSString *valueString1 = [[NSString stringWithFormat:@"firstPerson://%@",str1] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
NSString *valueString3 = [[NSString stringWithFormat:@"secondPerson://%@",str3] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
[mastring addAttribute:NSLinkAttributeName value:valueString1 range:range1];
[mastring addAttribute:NSLinkAttributeName value:valueString3 range:range3];
textView.attributedText = mastring;
}
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
if ([[URL scheme] isEqualToString:@"firstPerson"]) {
NSString *titleString = [NSString stringWithFormat:@"你点击了第一个文字:%@",[URL host]];
[self clickLinkTitle:titleString];
return NO;
} else if ([[URL scheme] isEqualToString:@"secondPerson"]) {
NSString *titleString = [NSString stringWithFormat:@"你点击了第二个文字:%@",[URL host]];
[self clickLinkTitle:titleString];
return NO;
}
return YES;
}
- (void)clickLinkTitle:(NSString *)title {
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:title preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
}
textview的代理事件,可以支持超文本链接哒,好方便。在需要的地方处理自己的逻辑即可。
第三种:利用YYText库把,非常方便。
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
NSString *str0 = @"";
NSString *str1 = @"链接";
NSString *str = [NSString stringWithFormat:@"%@%@", str0, str1];
NSRange range0 = [str rangeOfString:str0];
NSRange range1 = [str rangeOfString:str1];
NSMutableAttributedString *attri_str = [[NSMutableAttributedString alloc] initWithString:str];
attri_str.yy_alignment = NSTextAligmentLeft;
attri_str.yy_paragraphStyle = paragraphStyle;
[attri_str yy_setFont:[UIFont fontWithName:@"" size:14] range:range0];
[attri_str yy_setColor:UIColorHex(0x333333) range:rang0];
....