關(guān)于iOS文本展開與收起众辨,使用TextView 的簡(jiǎn)單實(shí)現(xiàn)方法

  • 1、如下示例舷礼,設(shè)置行距為5的利用富文本使用UITextView進(jìn)行操作
    這里沒有優(yōu)化鹃彻,需要優(yōu)化的自行處理
/// 默認(rèn)收起的配置
- (void)configDidDownClose{
    NSString * contentsub = @"比特幣(Bitcoin)的概念最初由中本聰在2008年11月1日提出, [50]并于2009年1月3日正式誕生 [1]  妻献。根據(jù)中本聰?shù)乃悸吩O(shè)計(jì)發(fā)布的開源軟件以及建構(gòu)其上的P2P網(wǎng)絡(luò)蛛株。比特幣是一種P2P形式的數(shù)字貨幣 [52]  团赁。比特幣的交易記錄公開透明 [50]  。點(diǎn)對(duì)點(diǎn)的傳輸意味著一個(gè)去中心化的支付系統(tǒng)點(diǎn)對(duì)點(diǎn)的傳輸意味";
    self.noteTV.text = [NSString stringWithFormat:@"%@%@",contentsub,@"收起".ntes_localized] ;
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    paraStyle.lineBreakMode =  NSLineBreakByCharWrapping;
    paraStyle.alignment = NSTextAlignmentLeft;
    paraStyle.lineSpacing = 5;
    paraStyle.hyphenationFactor = 0.0;
    paraStyle.firstLineHeadIndent = 0.0;
    paraStyle.paragraphSpacingBefore = 0.0;
    paraStyle.headIndent = 0;
    paraStyle.tailIndent = 0;
    NSDictionary *attributes = @{NSFontAttributeName:FONT(14), NSParagraphStyleAttributeName:paraStyle
    };
    NSMutableAttributedString * attributedText = [[NSMutableAttributedString alloc]init];
    
    NSDictionary *attDict1 = @{NSForegroundColorAttributeName:kColor_ox(0x333333)};
    
    NSAttributedString *attStr1 = [[NSAttributedString alloc] initWithString:[self.noteTV.text substringWithRange:NSMakeRange(0,self.noteTV.text.length - @"收起".ntes_localized.length )] attributes:attDict1];
    
    NSDictionary *attDict2 = @{NSForegroundColorAttributeName:kZhuTiColor};
    NSAttributedString *attStr2 = [[NSAttributedString alloc] initWithString:[self.noteTV.text substringWithRange:NSMakeRange(self.noteTV.text.length - @"收起".ntes_localized.length , @"收起".ntes_localized.length)] attributes:attDict2];
    
    
    [attributedText appendAttributedString:attStr1];
    [attributedText appendAttributedString:attStr2];
    [attributedText addAttributes:attributes range:NSMakeRange(0, self.noteTV.text.length)];
    /// 給富文本后面增加可操作的點(diǎn)擊鏈接通過代理來(lái)實(shí)現(xiàn)
    NSString *valueString = [[NSString stringWithFormat:@"didDownClose://%@", @"收起".ntes_localized] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    
    [attributedText addAttribute:NSLinkAttributeName value:valueString range:NSMakeRange(self.noteTV.text.length - @"收起".ntes_localized.length , @"收起".ntes_localized.length)];
    
    _noteTV.attributedText = attributedText;
    
    CGFloat height = [self.noteTV.text getSpaceLabelWithFont:FONT(14) withWidth:SCREEN_WIDTH - 30];
    self.titleContentView = UIView.new;
    [self.titleContentView addSubview:self.noteTV];
    self.titleContentView.frame = CGRectMake(0, 0, SCREEN_WIDTH, height + 15);
    self.noteTV.frame = CGRectMake(15, 15, SCREEN_WIDTH - 30, height);
    [self.tableView setTableHeaderView:self.titleContentView];
}
/// 默認(rèn)打開的配置
- (void)configDidOpenClose{
    NSString * contentsub = @"比特幣(Bitcoin)的概念最初由中本聰在2008年11月1日提出谨履, [50]并于2009年1月3日正式誕生 [1]  欢摄。根據(jù)中本聰?shù)乃悸吩O(shè)計(jì)發(fā)布的開源軟件以及建構(gòu)其上的P2P網(wǎng)絡(luò)。比特幣是一種P2P形式的數(shù)字貨幣 [52]  笋粟。比特幣的交易記錄公開透明 [50]  怀挠。點(diǎn)對(duì)點(diǎn)的傳輸意味著一個(gè)去中心化的支付系統(tǒng)點(diǎn)對(duì)點(diǎn)的傳輸意味";
    
    
    NSString *tempStr = [self stringByTruncatingString:contentsub suffixStr:@"...全部展開" font:FONT(14) width:SCREEN_WIDTH - 30 num:3];
    self.noteTV.text = tempStr;
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    paraStyle.lineBreakMode =  NSLineBreakByCharWrapping;
    paraStyle.alignment = NSTextAlignmentLeft;
    paraStyle.lineSpacing = 5;
    paraStyle.hyphenationFactor = 0.0;
    paraStyle.firstLineHeadIndent = 0.0;
    paraStyle.paragraphSpacingBefore = 0.0;
    paraStyle.headIndent = 0;
    paraStyle.tailIndent = 0;
    NSDictionary *attributes = @{NSFontAttributeName:FONT(14), NSParagraphStyleAttributeName:paraStyle
    };
    NSMutableAttributedString * attributedText = [[NSMutableAttributedString alloc]init];
    
    NSDictionary *attDict1 = @{NSForegroundColorAttributeName:kColor_ox(0x333333)};
    
    NSAttributedString *attStr1 = [[NSAttributedString alloc] initWithString:[tempStr substringWithRange:NSMakeRange(0,tempStr.length - @"全部展開".ntes_localized.length )] attributes:attDict1];
    
    NSDictionary *attDict2 = @{NSForegroundColorAttributeName:kZhuTiColor};
    NSAttributedString *attStr2 = [[NSAttributedString alloc] initWithString:[tempStr substringWithRange:NSMakeRange(tempStr.length - @"全部展開".ntes_localized.length , @"全部展開".ntes_localized.length)] attributes:attDict2];
    
    
    [attributedText appendAttributedString:attStr1];
    [attributedText appendAttributedString:attStr2];
    [attributedText addAttributes:attributes range:NSMakeRange(0, tempStr.length)];
    /// 給富文本后面增加可操作的點(diǎn)擊鏈接通過代理來(lái)實(shí)現(xiàn)
    NSString *valueString = [[NSString stringWithFormat:@"didOpenClose://%@", @"全部展開".ntes_localized] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
    
    [attributedText addAttribute:NSLinkAttributeName value:valueString range:NSMakeRange(tempStr.length - @"全部展開".ntes_localized.length , @"全部展開".ntes_localized.length)];
    
    _noteTV.attributedText = attributedText;
    
    CGFloat height = [tempStr getSpaceLabelWithFont:FONT(14) withWidth:SCREEN_WIDTH - 30];
    self.titleContentView = UIView.new;
    [self.titleContentView addSubview:self.noteTV];
    self.titleContentView.frame = CGRectMake(0, 0, SCREEN_WIDTH, height + 15);
    self.noteTV.frame = CGRectMake(15, 15, SCREEN_WIDTH - 30, height);
    [self.tableView setTableHeaderView:self.titleContentView];
    
}
  • 2、核心代碼
/// 將文本按長(zhǎng)度度截取并加上指定后綴
/// @param str 文本
/// @param suffixStr 指定后綴
/// @param font 文本字體
/// @param textWidth 文本長(zhǎng)度
/// @param num 多少行
- (NSString*)stringByTruncatingString:(NSString *)str suffixStr:(NSString *)suffixStr font:(UIFont *)font width:(CGFloat)textWidth num:(NSInteger)num {
    if (!str) return nil;
    CGFloat width = 0;
    int k = 0;
    CGFloat suffixWidth = [suffixStr sizeWithAttributes:@{NSFontAttributeName:font}].width;
    if (str  && [str isKindOfClass:[NSString class]]) {
        for (int i=0; i< [str length];i++){

            NSString *tempStr = [str substringToIndex:i + 1];
           
            CGSize size = [tempStr sizeWithAttributes:@{NSFontAttributeName:font}];
            if ((size.width - width) > textWidth) {
                tempStr = [str substringToIndex:i];
                if (k == num - 1) {
                    str = tempStr;
                     for (int i=(int)[str length] - (int)[suffixStr length]; i< [str length];i = i - (int)[suffixStr length]){
                         tempStr = [str substringToIndex:i];
                         CGSize size = [tempStr sizeWithAttributes:@{NSFontAttributeName:font}];
                         if(size.width - width + suffixWidth  < textWidth){
                             tempStr = [NSString stringWithFormat:@"%@%@", tempStr,suffixStr];
                             str = tempStr;
                             break;
                         }
                     }

                    break;
                }
                width = size.width ;

                k ++;
            }
        }
    }
    return str;
}
  • 3害捕、通過UITextView的代理方法來(lái)實(shí)現(xiàn)
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
    if ([[URL scheme] isEqualToString:@"didOpenClose"]) {
        [self configDidOpenClose];
        return NO;
    }
    if ([[URL scheme] isEqualToString:@"didDownClose"]) {
        [self configDidDownClose];
        return NO;
    }
    return YES;
}
  • 4绿淋、附上計(jì)算文本高度
- (CGFloat)getSpaceLabelWithFont:(UIFont*)font withWidth:(CGFloat)width {
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
    paraStyle.alignment = NSTextAlignmentLeft;
    paraStyle.lineSpacing = 5;
    paraStyle.hyphenationFactor = 0.0;
    paraStyle.firstLineHeadIndent = 0.0;
    paraStyle.paragraphSpacingBefore = 0.0;
    paraStyle.headIndent = 0;
    paraStyle.tailIndent = 0;
    NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f
                          };
    
    CGSize size = [self boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options: NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:dic context:nil].size;
    
    return size.height;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吨艇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌腾啥,老刑警劉巖东涡,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倘待,居然都是意外死亡疮跑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門凸舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祖娘,“玉大人,你說我怎么就攤上這事啊奄〗ニ眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵菇夸,是天一觀的道長(zhǎng)琼富。 經(jīng)常有香客問我,道長(zhǎng)庄新,這世上最難降的妖魔是什么鞠眉? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮择诈,結(jié)果婚禮上械蹋,老公的妹妹穿的比我還像新娘。我一直安慰自己羞芍,他們只是感情好哗戈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荷科,像睡著了一般谱醇。 火紅的嫁衣襯著肌膚如雪暇仲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天副渴,我揣著相機(jī)與錄音奈附,去河邊找鬼。 笑死煮剧,一個(gè)胖子當(dāng)著我的面吹牛斥滤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勉盅,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼佑颇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了草娜?” 一聲冷哼從身側(cè)響起挑胸,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宰闰,沒想到半個(gè)月后茬贵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡移袍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年解藻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葡盗。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡螟左,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出觅够,到底是詐尸還是另有隱情胶背,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布喘先,位于F島的核電站奄妨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏苹祟。R本人自食惡果不足惜砸抛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望树枫。 院中可真熱鬧直焙,春花似錦、人聲如沸砂轻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至厨喂,卻和暖如春和措,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜕煌。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工派阱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斜纪。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓贫母,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親盒刚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腺劣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容