在做登錄或者注冊頁面時繁疤,都會有有類似于協(xié)議閱讀的功能稠腊,左邊是一個選擇框是否閱讀鸣哀,右邊是一行文本,且協(xié)議文本顏色不同叹放。
之前在做的時候,因為一行文本就能顯示全埋嵌,且僅僅只是一個協(xié)議俱恶,因此博主采取的方法如下:
1、在label覆蓋一個clearColor的UIButton了罪,坐標同label大小
2、給label上添加一個UITapGestureRecognizer手勢
但后期有些功能牽扯到金融以及安全問題聪全,需要多個協(xié)議以及多行顯示,這時要按之前方法去做的話吱七,就需要截取當前文本協(xié)議長度以及位置鹤竭,然后在相應位置上添加buton和手勢,做起來還是相對麻煩一下吝岭。因此博主想法用文本實現(xiàn)超鏈接那種方式百度一下,找到UITextView的一個代理方法窜管,且這種方法能將前面的勾選框也顯示在富文本之前稚机,但是自我感覺沒有直接創(chuàng)建UIImageView或者UIButton使用起來靈活,因為我們可以將UIButton的frame放大失乾,手指觸摸面積增大
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
PS:UILabel控件是沒有這個代理方法的纬乍,因此只能創(chuàng)建添加UITextView。
1纽竣、首先我們要設(shè)置富文本以及添加鏈接
- (void)viewDidLoad {
[super viewDidLoad];
self.select = NO;
[self setSubView];//設(shè)置子view
[self setLinkText];//設(shè)置文本
}
//設(shè)置子view
- (void)setSubView{
UIFont *linkFont = [UIFont systemFontOfSize:14.0];
CGFloat linkW = ScreenWidth - 10*2;
UITextView *linkTV = [[UITextView alloc]initWithFrame:CGRectMake(10, 100, linkW, 100)];
self.linkTV = linkTV;
linkTV.userInteractionEnabled = YES;
linkTV.font = linkFont;
linkTV.textColor = UIColorFromRGB(0x999999,1.0);
[self.view addSubview:linkTV];
linkTV.editable = NO;//必須禁止輸入蜓氨,否則點擊將彈出輸入鍵盤
linkTV.scrollEnabled = NO;
linkTV.delegate = self;
linkTV.textContainerInset = UIEdgeInsetsMake(0,0, 0, 0);//文本距離邊界值
}
//設(shè)置文本
- (void)setLinkText{
NSString *linkStr = @"我已閱讀《登錄協(xié)議》和《注冊協(xié)議》语盈,并且還有《支付寶支付協(xié)議》、《微信支付協(xié)議》代嗤,《中國工商銀行協(xié)議》缠借、《中國銀行協(xié)議》、《中國建設(shè)銀行協(xié)議》硝逢、《中國農(nóng)業(yè)銀行協(xié)議》";
UIFont *linkFont = [UIFont systemFontOfSize:14.0];
CGFloat linkW = ScreenWidth - 10*2;
CGSize linkSize = [self getAttributionHeightWithString:linkStr lineSpace:1.5 kern:1 font:linkFont width:linkW];
self.linkTV.frame = CGRectMake(10, 100, linkW, linkSize.height);
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:linkStr];
[attributedString addAttribute:NSLinkAttributeName value:@"login://" range:[[attributedString string] rangeOfString:@"《登錄協(xié)議》"]];
[attributedString addAttribute:NSLinkAttributeName value:@"register://" range:[[attributedString string] rangeOfString:@"《注冊協(xié)議》"]];
CGSize size = CGSizeMake(12, 12);
UIImage *image = [UIImage imageNamed:self.select == YES ? @"selected" : @"unSelected"];
UIGraphicsBeginImageContextWithOptions(size, false, 0);
[image drawInRect:CGRectMake(0, 0.25, 12, 12)];
UIImage *resizeImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
textAttachment.image = resizeImage;
NSMutableAttributedString *imageString = (NSMutableAttributedString *)[NSMutableAttributedString attributedStringWithAttachment:textAttachment];
[imageString addAttribute:NSLinkAttributeName value:@"checkbox://" range:NSMakeRange(0, imageString.length)];
[attributedString insertAttributedString:imageString atIndex:0];
// [attributedString addAttribute:NSFontAttributeName value:linkFont range:NSMakeRange(0, attributedString.length)];
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
//調(diào)整行間距
paragraphStyle.lineSpacing = 1.5;
NSDictionary *attriDict = @{NSParagraphStyleAttributeName:paragraphStyle,NSKernAttributeName:@(1),
NSFontAttributeName:linkFont};
[attributedString addAttributes:attriDict range:NSMakeRange(0, attributedString.length)];
self.linkTV.attributedText = attributedString;
self.linkTV.linkTextAttributes = @{NSForegroundColorAttributeName: [UIColor blueColor], NSUnderlineColorAttributeName: [UIColor lightGrayColor], NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};
}
/*
* 設(shè)置行間距和字間距
*
* @param string 字符串
* @param lineSpace 行間距
* @param kern 字間距
* @param font 字體大小
*
* @return 富文本
*/
- (NSAttributedString *)getAttributedWithString:(NSString *)string WithLineSpace:(CGFloat)lineSpace kern:(CGFloat)kern font:(UIFont *)font{
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
//調(diào)整行間距
paragraphStyle.lineSpacing = lineSpace;
NSDictionary *attriDict = @{NSParagraphStyleAttributeName:paragraphStyle,NSKernAttributeName:@(kern),
NSFontAttributeName:font};
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:string attributes:attriDict];
return attributedString;
}
/* 獲取富文本的高度
*
* @param string 文字
* @param lineSpace 行間距
* @param kern 字間距
* @param font 字體大小
* @param width 文本寬度
*
* @return size
*/
- (CGSize)getAttributionHeightWithString:(NSString *)string lineSpace:(CGFloat)lineSpace kern:(CGFloat)kern font:(UIFont *)font width:(CGFloat)width {
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
paragraphStyle.lineSpacing = lineSpace;
NSDictionary *attriDict = @{
NSParagraphStyleAttributeName:paragraphStyle,
NSKernAttributeName:@(kern),
NSFontAttributeName:font};
CGSize size = [string boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attriDict context:nil].size;
return size;
}
2柴罐、響應UITextView的代理方法,類似于UIButton的點擊事件
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
if ([[URL scheme] isEqualToString:@"checkbox"]) {
self.view.backgroundColor = [UIColor whiteColor];
self.select = !self.select;
[self setLinkText];//設(shè)置文本
return NO;
}else if ([[URL scheme] isEqualToString:@"login"]) {
self.view.backgroundColor = [UIColor redColor];
return NO;
}else if ([[URL scheme] isEqualToString:@"register"]) {
self.view.backgroundColor = [UIColor greenColor];
return NO;
}
return YES;
}
摘自:https://blog.csdn.net/MinggeQingchun/article/details/77894277?locationNum=1&fps=1