iOS-文本實現(xiàn)超鏈接

在做登錄或者注冊頁面時繁疤,都會有有類似于協(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;
}

image.png

摘自:https://blog.csdn.net/MinggeQingchun/article/details/77894277?locationNum=1&fps=1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市那婉,隨后出現(xiàn)的幾起案子党瓮,更是在濱河造成了極大的恐慌,老刑警劉巖寞奸,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝇闭,死亡現(xiàn)場離奇詭異呻引,居然都是意外死亡吐咳,警方通過查閱死者的電腦和手機元践,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門单旁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饥伊,“玉大人,你說我怎么就攤上這事愉豺∶R颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵驰贷,是天一觀的道長洛巢。 經(jīng)常有香客問我,道長箱熬,這世上最難降的妖魔是什么狈邑? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任米苹,我火速辦了婚禮,結(jié)果婚禮上蘸嘶,老公的妹妹穿的比我還像新娘。我一直安慰自己褥蚯,他們只是感情好况增,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著歧强,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肤京。 梳的紋絲不亂的頭發(fā)上茅特,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天温治,我揣著相機與錄音,去河邊找鬼熬荆。 笑死,一個胖子當著我的面吹牛累盗,可吹牛的內(nèi)容都是我干的突琳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蠢琳,長吁一口氣:“原來是場噩夢啊……” “哼镜豹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泰讽,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤昔期,失蹤者是張志新(化名)和其女友劉穎已卸,沒想到半個月后累澡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體般贼,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡惑申,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了望几。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萤厅。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惕味,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情名挥,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布榄融,位于F島的核電站救湖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏力九。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一跌前、第九天 我趴在偏房一處隱蔽的房頂上張望检吆。 院中可真熱鬧,春花似錦臂寝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽皱蹦。三九已至沪哺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辜妓,已是汗流浹背忌怎。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽惰,地道東北人鸥印。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像酝润,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子要销,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354