Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 加上“…”;。。。阅读更多“;到UILabel的末尾_Ios_Objective C_Uilabel_Nsattributedstring - Fatal编程技术网

Ios 加上“…”;。。。阅读更多“;到UILabel的末尾

Ios 加上“…”;。。。阅读更多“;到UILabel的末尾,ios,objective-c,uilabel,nsattributedstring,Ios,Objective C,Uilabel,Nsattributedstring,我有一个UILabel,在某些情况下,文本比UILabel本身长,因此我将文本视为“bla bla bla…”我想在UILabel的末尾添加一个…阅读更多的按钮文本 我读过一些帖子,但它们提供的解决方案对我来说并不好,例如:计算有多少个字符将进入UILabel,但对于我使用的字体,每个字符都有不同的宽度 我怎样才能做到这一点 提前谢谢 使用方法并将字体作为NSFontAttributeName键传递给nsAttributeString将为您提供所需的正确rect 因此,您需要检查它是否大于标签边

我有一个
UILabel
,在某些情况下,文本比
UILabel
本身长,因此我将文本视为
“bla bla bla…”
我想在
UILabel
的末尾添加一个
…阅读更多的
按钮文本

我读过一些帖子,但它们提供的解决方案对我来说并不好,例如:计算有多少个字符将进入
UILabel
,但对于我使用的字体,每个字符都有不同的宽度

我怎样才能做到这一点

提前谢谢

使用方法并将字体作为
NSFontAttributeName
键传递给
nsAttributeString
将为您提供所需的正确rect


因此,您需要检查它是否大于标签边界减去偏移量。只有在是的情况下,您才需要修剪文本并在结尾显示
阅读更多内容。

您知道UILabel没有触摸操作吗。因此,如果整个文本在一个UILabel中,您不能触摸“…阅读更多”


注意:我的解决方案是,在UILabel的末尾添加一个清晰的背景按钮。

t属性标签具有此功能

您需要将“截断”标记设置为 “阅读更多…”

属性RuncationToken


这就是我在
UITextView
UITextField
UILabel
中添加的阅读更多…按钮:

- (void)addReadMoreStringToUILabel:(UILabel*)label
{
    NSString *readMoreText = @" ...Read More";
    NSInteger lengthForString = label.text.length;
    if (lengthForString >= 30)
    {
        NSInteger lengthForVisibleString = [self fitString:label.text intoLabel:label];
        NSMutableString *mutableString = [[NSMutableString alloc] initWithString:label.text];
        NSString *trimmedString = [mutableString stringByReplacingCharactersInRange:NSMakeRange(lengthForVisibleString, (label.text.length - lengthForVisibleString)) withString:@""];
        NSInteger readMoreLength = readMoreText.length;
        NSString *trimmedForReadMore = [trimmedString stringByReplacingCharactersInRange:NSMakeRange((trimmedString.length - readMoreLength), readMoreLength) withString:@""];
        NSMutableAttributedString *answerAttributed = [[NSMutableAttributedString alloc] initWithString:trimmedForReadMore attributes:@{
                                                                                                                                        NSFontAttributeName : label.font
                                                                                                                                        }];

        NSMutableAttributedString *readMoreAttributed = [[NSMutableAttributedString alloc] initWithString:readMoreText attributes:@{
                                                                                                                                        NSFontAttributeName : Font(TWRegular, 12.),
                                                                                                                                        NSForegroundColorAttributeName : White
                                                                                                                                        }];

        [answerAttributed appendAttributedString:readMoreAttributed];
        label.attributedText = answerAttributed;

        UITagTapGestureRecognizer *readMoreGesture = [[UITagTapGestureRecognizer alloc] initWithTarget:self action:@selector(readMoreDidClickedGesture:)];
        readMoreGesture.tag = 1;
        readMoreGesture.numberOfTapsRequired = 1;
        [label addGestureRecognizer:readMoreGesture];

        label.userInteractionEnabled = YES;
    }
    else {

        NSLog(@"No need for 'Read More'...");

    }
}
可以找到
fitString:intoLabel
方法的用法

至于
uitagtagesturerecognizer
只是一个普通的
uitagesturerecognizer
子类,具有名为tag的
NSInteger
属性。我这样做是因为我想确定在同一个
UIViewController
中单击了哪个
阅读更多…
。您可以使用普通的
UITapGestureRecognitor


享受吧

我的解决方案是,在
ui标签的右下角和下方创建一个
ui按钮
(名称阅读更多)。 之后,我检查
ui标签是否被截断,以显示或隐藏
ui按钮

CGSize sizeOfText = [self.label.text boundingRectWithSize: CGSizeMake(self.label.intrinsicContentSize.width, CGFLOAT_MAX)
                                                 options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                              attributes: [NSDictionary dictionaryWithObject:self.label.font forKey:NSFontAttributeName] context: nil].size;
    
if (self.label.intrinsicContentSize.height < ceilf(sizeOfText.height)) {
    // label is truncated
    self.readmoreButton.hidden = NO; // show Read more button
}else{
    self.readmoreButton.hidden = YES;
}

希望此帮助

您可以尝试第三个库

将UILabel的自定义类设置为ExpandableLabel,并设置所需的行数和折叠文本数:

expandableLabel.numberOfLines = 5
expandableLabel.collapsedAttributedLink = NSAttributedString(string: "more")
expandableLabel.ellipsis = NSAttributedString(string: "...")
// update label expand or collapse state
expandableLabel.collapsed = true
您可能需要设置一个
代理
,以便在链接被触动时获得通知。

Swift4(IOS 11.2)

Readmore在标签末尾,不执行任何操作

结果

注意:-Readmore不包括操作


此方法适用于具有上下箭头图像的showless和showAll: 在标签上添加标签手势

  viewcontroller.h

  @property (nonatomic,assign) BOOL isReadable; 

  viewcontrollr.m

  #pragma mark :- Tap Gesture View All
  -(void)readMoreDidClickedGesture :(UITapGestureRecognizer 
    *)objTapGesture{

     UILabel * lblDesc = (UILabel *)[objTapGesture view];
     NSLog(@"%@",lblDesc.text);
     if (self.isReadable == false) {
     [self setIsReadable:YES];
     lblDesc.text = readmoreText;
     readMoreHeight = [self getLabelHeight:lblDesc];
     }
     else{
      readMoreHeight = 30.0;
      [self setIsReadable:NO];
      }  
  }



 - (void)addReadMoreStringToUILabel:(UILabel*)label isReaded:(BOOL)isReaded
 {

  NSString *readMoreText = (isReaded == false) ? @"...Show All  " : 
   @"Show Less  ";
  NSInteger lengthForString = label.text.length;
  if (lengthForString >= 30)
  {
    NSInteger lengthForVisibleString = [self getLabelHeight:label];//[self fitString:label.text intoLabel:label];
    NSMutableString *mutableString = [[NSMutableString alloc] initWithString:label.text];
    readmoreText = mutableString;
    NSString *trimmedString = [mutableString stringByReplacingCharactersInRange:NSMakeRange(lengthForVisibleString, (label.text.length - lengthForVisibleString)) withString:@""];
    NSInteger readMoreLength = readMoreText.length;
    NSString *trimmedForReadMore = [trimmedString stringByReplacingCharactersInRange:NSMakeRange((trimmedString.length - readMoreLength), readMoreLength) withString:@""];
    NSMutableAttributedString *answerAttributed = [[NSMutableAttributedString alloc] initWithString:trimmedForReadMore attributes:@{
                                                                                                                                    NSFontAttributeName : label.font
                                                                                                                                    }];


    NSMutableAttributedString *readMoreAttributed = [[NSMutableAttributedString alloc] initWithString:readMoreText attributes:@{
                                                                                                                                NSFontAttributeName :label.font,                              NSForegroundColorAttributeName :[UIColor orangeColor]
                                                                                                                                }];
    if (isReaded == false){
        [readMoreAttributed addAttribute:NSUnderlineStyleAttributeName
                             value:@(NSUnderlineStyleSingle)
                             range:NSMakeRange(3, 8)];

        NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
        UIImageView *imgDown = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 25, 25)];
        imgDown.image = [UIImage imageNamed:@"searchFilterArrow1"];
        imgDown.image = [imgDown.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        [imgDown setTintColor:[UIColor orangeColor]];

        textAttachment.image = imgDown.image;

        NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];

        [readMoreAttributed replaceCharactersInRange:NSMakeRange(12, 1) withAttributedString:attrStringWithImage];
    }
    else{
        [readMoreAttributed addAttribute:NSUnderlineStyleAttributeName
                                   value:@(NSUnderlineStyleSingle)
                                   range:NSMakeRange(1, 9)];
        NSTextAttachment *textAttachment = [[NSTextAttachment alloc] init];
        UIImageView *imgup = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 25, 25)];
        imgup.image = [UIImage imageNamed:@"searchFilterArrow2"];
        imgup.image = [imgup.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        [imgup setTintColor:[UIColor orangeColor]];

        textAttachment.image = imgup.image;

        NSAttributedString *attrStringWithImage = [NSAttributedString attributedStringWithAttachment:textAttachment];

        [readMoreAttributed replaceCharactersInRange:NSMakeRange(11, 1) withAttributedString:attrStringWithImage];
    }

    [answerAttributed appendAttributedString:readMoreAttributed];
    label.attributedText = answerAttributed;

    UITapGestureRecognizer *readMoreGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(readMoreDidClickedGesture:)];
    readMoreGesture.numberOfTapsRequired = 1;
    [label addGestureRecognizer:readMoreGesture];

    label.userInteractionEnabled = YES;
}
else {

    NSLog(@"No need for 'Read More'...");

}
}

采取行动

 let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapFunction))
 Urlabel.isUserInteractionEnabled = true
 Urlabel.addGestureRecognizer(tap)

 @objc
    func tapFunction(sender:UITapGestureRecognizer) {


    }
这适用于Swift 5

这里是@ramchandran答案的更安全版本,因为您不知道用户将输入多少个字符

在他的回答中,若用户输入的字符串长度小于您决定用于
的任何文本的长度。。。Readmore
则它将崩溃。例如,这就是你如何使用它

if yourLabel.text!.count > 1 {

   let readmoreFont = UIFont(name: "Helvetica-Oblique", size: 11.0)
    let readmoreFontColor = UIColor.blue
    DispatchQueue.main.async {
        self.yourLabel.addTrailing(with: "... ", moreText: "Readmore", moreTextFont: readmoreFont!, moreTextColor: readmoreFontColor)
    }
}
在上面的示例中,
。。。Readmore
共12个字符。如果用户输入的字符串是yourLabel.text=“12345678”
,则该字符串的文本将仅为8个字符。 它将崩溃,因为在下一行中使用
((trimmedString?.count±0)-readMoreLength)
的范围将产生负面结果:

// “12345678” minus “... Readmore” = negative four (8 - 12 = -4)
let trimmedForReadMore: String = (trimmedString! as NSString).replacingCharacters(in: NSRange(location: ((trimmedString?.count ?? 0) - readMoreLength), length: readMoreLength), with: "") + trailingText
我添加了一个安全检查,以确保输入的字符串是否小于或等于您决定用作
的字符串的字符数。。。Readmore
它将返回,并且不会到达导致崩溃的行:

// trimmedString is the string the user entered
guard let safeTrimmedString = trimmedString else { return }
if safeTrimmedString.count <= readMoreLength { return }

Swift 4和Swift 5。我需要实现同样的功能。答案已经给出了,但根据我的说法,TTTAttributedLabel是最好的方法。它可以让您更好地控制内容。很容易找到地址,链接,日期等。你也可以改变链接的颜色。TTtatAttributedLabel库链接已在上述答案中给出。让我们来谈谈实施

let kCharacterBeforReadMore =  20
let kReadMoreText           =  "...ReadMore"
let kReadLessText           =  "...ReadLess"

@IBOutlet weak var labelText: TTTAttributedLabel! // setYouLabel Class to TTTAttributedLabel in StoryBoard
var strFull = ""

 override func viewDidLoad() {
      super.viewDidLoad()
      strFull = "I need to implement the same. As answers are already given but according to me TTTAttributedLabel is the best way to do it. I gives I need to implement the same. As answers are already given but according to me TTTAttributedLabel is the best way to do it. I gives you"
      labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: UIFont.init(name: "Helvetica-Bold", size: 24.0)!, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: false, isReadLessTapped: false)
      labelText.delegate = self
   }
      func readMore(readMore: Bool) {
        labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: nil, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: readMore, isReadLessTapped: false)
      }
      func readLess(readLess: Bool) {
        labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: nil, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: readLess, isReadLessTapped: true)
      }
}
在这里,我包装了TTtatAttributedLabel的扩展,并将ReadMore和ReadLess逻辑放在这里。您可以根据需要进行修改

 extension TTTAttributedLabel {
      func showTextOnTTTAttributeLable(str: String, readMoreText: String, readLessText: String, font: UIFont?, charatersBeforeReadMore: Int, activeLinkColor: UIColor, isReadMoreTapped: Bool, isReadLessTapped: Bool) {

        let text = str + readLessText
        let attributedFullText = NSMutableAttributedString.init(string: text)
        let rangeLess = NSString(string: text).range(of: readLessText, options: String.CompareOptions.caseInsensitive)
//Swift 5
       // attributedFullText.addAttributes([NSAttributedStringKey.foregroundColor : UIColor.blue], range: rangeLess)
        attributedFullText.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.blue], range: rangeLess)

        var subStringWithReadMore = ""
        if text.count > charatersBeforeReadMore {
          let start = String.Index(encodedOffset: 0)
          let end = String.Index(encodedOffset: charatersBeforeReadMore)
          subStringWithReadMore = String(text[start..<end]) + readMoreText
        }

        let attributedLessText = NSMutableAttributedString.init(string: subStringWithReadMore)
        let nsRange = NSString(string: subStringWithReadMore).range(of: readMoreText, options: String.CompareOptions.caseInsensitive)
        //Swift 5
       // attributedLessText.addAttributes([NSAttributedStringKey.foregroundColor : UIColor.blue], range: nsRange)
        attributedLessText.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.blue], range: nsRange)
      //  if let _ = font {// set font to attributes
      //   self.font = font
      //  }
        self.attributedText = attributedLessText
        self.activeLinkAttributes = [NSAttributedString.Key.foregroundColor : UIColor.blue]
        //Swift 5
       // self.linkAttributes = [NSAttributedStringKey.foregroundColor : UIColor.blue]
        self.linkAttributes = [NSAttributedString.Key.foregroundColor : UIColor.blue]
        self.addLink(toTransitInformation: ["ReadMore":"1"], with: nsRange)

        if isReadMoreTapped {
          self.numberOfLines = 0
          self.attributedText = attributedFullText
          self.addLink(toTransitInformation: ["ReadLess": "1"], with: rangeLess)
        }
        if isReadLessTapped {
          self.numberOfLines = 3
          self.attributedText = attributedLessText
        }
      }
    }
结果-点击ReadMore之前

结果-点击ReadMore后


对于标签上的操作,如果使用CollectionView或TableView,则可以使用委托方法执行操作

func showMore(cell: CustomCell) {
    guard let indexPath = self.tableView.indexPath(for: cell) else {
        return
    }
    let cell = tableView.cellForRow(at: indexPath) as! CustomCell
    tableView.beginUpdates()
    cell.label.text = "your complete text"
    tableView.endUpdates()
}
这将根据需要更新标签并显示全文 使用Lance Samaria回答并为单元格添加操作

class DynamicLabel: UILabel{

    var fullText: String?
    var truncatedLength = 100
    var isTruncated = true

    func collapse(){
        let index = fullText!.index(fullText!.startIndex, offsetBy: truncatedLength)
        self.text = fullText![...index].description + "... More"
        isTruncated = true
    }

    func expand(){
        self.text = fullText
        isTruncated = false
    }

}
这只是一个简单的技巧来完成所有这些混乱的实现。想法很简单,我们不设置折叠或展开行,只将标签设置为0。 然后将原始文本存储在
fullText
变量上。现在,如果我们想显示折叠格式,那么只需获取子字符串并添加自定义省略号

注意:这不包括tap事件处理程序,您可以自己在控制器上添加它

TTTAttributedLabel:-使用下面的代码行设置字体


attributedLessText=NSMutableAttributedString(string:subStringWithReadMore,attributes:[NSAttributeString.Key.font:UIFont.systemFont(of Size:17)])

下面是Swift 5的另一个解决方案

参考文献
  • 解决方案
结果

台阶 逻辑很简单

  • 检查标签的文本是否被截断
  • 使用LayoutManager获取标签文本中省略号起始点的索引
  • 使用省略号索引对文本进行切片
  • 将子字符串替换为
    。。。更多信息
    (您可以更改)
  • 在标签上添加UITap手势
  • 从gestrure位置获取标签的AttributeString中的索引 ->
    private func getIndex(起点:CGPoint)->Int?
  • 检查手势位置 ->
    func didTapInRange(u点:CGPoint,targetRan
    
     let tap = UITapGestureRecognizer(target: self, action: #selector(self.tapFunction))
     Urlabel.isUserInteractionEnabled = true
     Urlabel.addGestureRecognizer(tap)
    
     @objc
        func tapFunction(sender:UITapGestureRecognizer) {
    
    
        }
    
    if yourLabel.text!.count > 1 {
    
       let readmoreFont = UIFont(name: "Helvetica-Oblique", size: 11.0)
        let readmoreFontColor = UIColor.blue
        DispatchQueue.main.async {
            self.yourLabel.addTrailing(with: "... ", moreText: "Readmore", moreTextFont: readmoreFont!, moreTextColor: readmoreFontColor)
        }
    }
    
    // “12345678” minus “... Readmore” = negative four (8 - 12 = -4)
    let trimmedForReadMore: String = (trimmedString! as NSString).replacingCharacters(in: NSRange(location: ((trimmedString?.count ?? 0) - readMoreLength), length: readMoreLength), with: "") + trailingText
    
    // trimmedString is the string the user entered
    guard let safeTrimmedString = trimmedString else { return }
    if safeTrimmedString.count <= readMoreLength { return }
    
    extension UILabel{    
        
        func addTrailing(with trailingText: String, moreText: String, moreTextFont: UIFont, moreTextColor: UIColor) {
            
            let readMoreText: String = trailingText + moreText
            
            if self.visibleTextLength == 0 { return }
            
            let lengthForVisibleString: Int = self.visibleTextLength
            
            if let myText = self.text {
                
                let mutableString: String = myText
                
                let trimmedString: String? = (mutableString as NSString).replacingCharacters(in: NSRange(location: lengthForVisibleString, length: myText.count - lengthForVisibleString), with: "")
                
                let readMoreLength: Int = (readMoreText.count)
                
                guard let safeTrimmedString = trimmedString else { return }
                
                if safeTrimmedString.count <= readMoreLength { return }
                
                print("this number \(safeTrimmedString.count) should never be less\n")
                print("then this number \(readMoreLength)")
                
                // "safeTrimmedString.count - readMoreLength" should never be less then the readMoreLength because it'll be a negative value and will crash
                let trimmedForReadMore: String = (safeTrimmedString as NSString).replacingCharacters(in: NSRange(location: safeTrimmedString.count - readMoreLength, length: readMoreLength), with: "") + trailingText
                
                let answerAttributed = NSMutableAttributedString(string: trimmedForReadMore, attributes: [NSAttributedString.Key.font: self.font])
                let readMoreAttributed = NSMutableAttributedString(string: moreText, attributes: [NSAttributedString.Key.font: moreTextFont, NSAttributedString.Key.foregroundColor: moreTextColor])
                answerAttributed.append(readMoreAttributed)
                self.attributedText = answerAttributed
            }
        }
        
        var visibleTextLength: Int {
            
            let font: UIFont = self.font
            let mode: NSLineBreakMode = self.lineBreakMode
            let labelWidth: CGFloat = self.frame.size.width
            let labelHeight: CGFloat = self.frame.size.height
            let sizeConstraint = CGSize(width: labelWidth, height: CGFloat.greatestFiniteMagnitude)
            
            if let myText = self.text {
                
                let attributes: [AnyHashable: Any] = [NSAttributedString.Key.font: font]
                let attributedText = NSAttributedString(string: myText, attributes: attributes as? [NSAttributedString.Key : Any])
                let boundingRect: CGRect = attributedText.boundingRect(with: sizeConstraint, options: .usesLineFragmentOrigin, context: nil)
                
                if boundingRect.size.height > labelHeight {
                    var index: Int = 0
                    var prev: Int = 0
                    let characterSet = CharacterSet.whitespacesAndNewlines
                    repeat {
                        prev = index
                        if mode == NSLineBreakMode.byCharWrapping {
                            index += 1
                        } else {
                            index = (myText as NSString).rangeOfCharacter(from: characterSet, options: [], range: NSRange(location: index + 1, length: myText.count - index - 1)).location
                        }
                    } while index != NSNotFound && index < myText.count && (myText as NSString).substring(to: index).boundingRect(with: sizeConstraint, options: .usesLineFragmentOrigin, attributes: attributes as? [NSAttributedString.Key : Any], context: nil).size.height <= labelHeight
                    return prev
                }
            }
            
            if self.text == nil {
                return 0
            } else {
                return self.text!.count
            }
        }
    }
    
    let kCharacterBeforReadMore =  20
    let kReadMoreText           =  "...ReadMore"
    let kReadLessText           =  "...ReadLess"
    
    @IBOutlet weak var labelText: TTTAttributedLabel! // setYouLabel Class to TTTAttributedLabel in StoryBoard
    var strFull = ""
    
     override func viewDidLoad() {
          super.viewDidLoad()
          strFull = "I need to implement the same. As answers are already given but according to me TTTAttributedLabel is the best way to do it. I gives I need to implement the same. As answers are already given but according to me TTTAttributedLabel is the best way to do it. I gives you"
          labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: UIFont.init(name: "Helvetica-Bold", size: 24.0)!, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: false, isReadLessTapped: false)
          labelText.delegate = self
       }
          func readMore(readMore: Bool) {
            labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: nil, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: readMore, isReadLessTapped: false)
          }
          func readLess(readLess: Bool) {
            labelText.showTextOnTTTAttributeLable(str: strFull, readMoreText: kReadMoreText, readLessText: kReadLessText, font: nil, charatersBeforeReadMore: kCharacterBeforReadMore, activeLinkColor: UIColor.blue, isReadMoreTapped: readLess, isReadLessTapped: true)
          }
    }
    
     extension TTTAttributedLabel {
          func showTextOnTTTAttributeLable(str: String, readMoreText: String, readLessText: String, font: UIFont?, charatersBeforeReadMore: Int, activeLinkColor: UIColor, isReadMoreTapped: Bool, isReadLessTapped: Bool) {
    
            let text = str + readLessText
            let attributedFullText = NSMutableAttributedString.init(string: text)
            let rangeLess = NSString(string: text).range(of: readLessText, options: String.CompareOptions.caseInsensitive)
    //Swift 5
           // attributedFullText.addAttributes([NSAttributedStringKey.foregroundColor : UIColor.blue], range: rangeLess)
            attributedFullText.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.blue], range: rangeLess)
    
            var subStringWithReadMore = ""
            if text.count > charatersBeforeReadMore {
              let start = String.Index(encodedOffset: 0)
              let end = String.Index(encodedOffset: charatersBeforeReadMore)
              subStringWithReadMore = String(text[start..<end]) + readMoreText
            }
    
            let attributedLessText = NSMutableAttributedString.init(string: subStringWithReadMore)
            let nsRange = NSString(string: subStringWithReadMore).range(of: readMoreText, options: String.CompareOptions.caseInsensitive)
            //Swift 5
           // attributedLessText.addAttributes([NSAttributedStringKey.foregroundColor : UIColor.blue], range: nsRange)
            attributedLessText.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.blue], range: nsRange)
          //  if let _ = font {// set font to attributes
          //   self.font = font
          //  }
            self.attributedText = attributedLessText
            self.activeLinkAttributes = [NSAttributedString.Key.foregroundColor : UIColor.blue]
            //Swift 5
           // self.linkAttributes = [NSAttributedStringKey.foregroundColor : UIColor.blue]
            self.linkAttributes = [NSAttributedString.Key.foregroundColor : UIColor.blue]
            self.addLink(toTransitInformation: ["ReadMore":"1"], with: nsRange)
    
            if isReadMoreTapped {
              self.numberOfLines = 0
              self.attributedText = attributedFullText
              self.addLink(toTransitInformation: ["ReadLess": "1"], with: rangeLess)
            }
            if isReadLessTapped {
              self.numberOfLines = 3
              self.attributedText = attributedLessText
            }
          }
        }
    
    extension ViewController: TTTAttributedLabelDelegate {
      func attributedLabel(_ label: TTTAttributedLabel!, didSelectLinkWithTransitInformation components: [AnyHashable : Any]!) {
        if let _ = components as? [String: String] {
          if let value = components["ReadMore"] as? String, value == "1" {
            self.readMore(readMore: true)
          }
          if let value = components["ReadLess"] as? String, value == "1" {
            self.readLess(readLess: true)
          }
        }
      }
    }
    
    func showMore(cell: CustomCell) {
        guard let indexPath = self.tableView.indexPath(for: cell) else {
            return
        }
        let cell = tableView.cellForRow(at: indexPath) as! CustomCell
        tableView.beginUpdates()
        cell.label.text = "your complete text"
        tableView.endUpdates()
    }
    
    class DynamicLabel: UILabel{
    
        var fullText: String?
        var truncatedLength = 100
        var isTruncated = true
    
        func collapse(){
            let index = fullText!.index(fullText!.startIndex, offsetBy: truncatedLength)
            self.text = fullText![...index].description + "... More"
            isTruncated = true
        }
    
        func expand(){
            self.text = fullText
            isTruncated = false
        }
    
    }