Ios UITextView右下角

Ios UITextView右下角,ios,iphone,uitableview,uitextview,Ios,Iphone,Uitableview,Uitextview,我正在尝试对消息执行whatsapp之类的操作,因为它有一个根据contentsize调整大小的单元格,并在右下角显示日期。。。问题是,我不知道排除路径的矩形位置,因为文本是动态的,我有类似的内容,但仅适用于多行,而不适用于单行: NSString *txt=@"I'm writing ";//a text renderer using Core Text, and I discovered I’ll need to wrap text around objects (such as is do

我正在尝试对消息执行whatsapp之类的操作,因为它有一个根据contentsize调整大小的单元格,并在右下角显示日期。。。问题是,我不知道排除路径的矩形位置,因为文本是动态的,我有类似的内容,但仅适用于多行,而不适用于单行:

NSString *txt=@"I'm writing ";//a text renderer using Core Text, and I discovered I’ll need to wrap text around objects (such as is done in any DTP program). I couldn’t find any easy answers as to how to do this in the documentation, so having finally got it working I’ll share what I did. To lay out text in a custom shape in Core Text, you can pass a CGPath in when you create your CTFramesetterRef. Originally this only supported rectangular paths, but now it supports fully custom paths. My first thought was to see if I could subtract the region to wrap around from the path for my frame’s border, and pass the result in to Core Text as a path. It turns out firstly that subtracting one path from another in Core Graphics is not trivial. However, if you simply add two shapes to the same path, Core Graphics can use a winding rule to work out which areas to draw. Core Text, at least as of iOS 4.2, can also use this kind of algorithm. This will work for many cases: if you can guarantee that your object to be wrapped will be fully inside the frame (and not overlapping the edge), just go ahead and add its border to the same path as your frame, and Core"; // Text will do the rest.";

txtText.text=txt;

CGSize textFrame = [txtText sizeThatFits:CGSizeMake(235, MAXFLOAT)];

UIBezierPath * imgRect = [UIBezierPath bezierPathWithRect:CGRectMake(textFrame.width-35, textFrame.height-20, 35, 20)];
txtText.textContainer.exclusionPaths = @[imgRect];

textFrame = [txtText sizeThatFits:CGSizeMake(235, MAXFLOAT)];

//int frameWidth=375;

txtText.frame=CGRectIntegral(CGRectMake(10, 10, textFrame.width, textFrame.height));
lblHour.frame=CGRectIntegral(CGRectMake(textFrame.width-35, textFrame.height-15, 35, 20));

viewCanvasAround.frame=CGRectIntegral(CGRectMake(50, 100, textFrame.width+20, textFrame.height+20));


我的同事在actor.im中找到了一个很好的解决方案

let container=YYTextContainer(大小:CGSizeMake(maxTextWidth,CGFloat.max))
textLayout=YYTextLayout(容器:容器,文本:attributedText)!
//打印(“文本布局”)
//测量文本和填充文本高度
设textSize=textLayout.textBoundingSize
如果textLayout.lines.count==1{
如果textLayout.textBoundingSize.width
我也遇到了同样的问题(对我来说是右角的一个按钮),下面是我解决问题的方法:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self updateTextExclusionPaths];
}

- (void)updateTextExclusionPaths {
    // Remove old exclusionPaths to calculate right rects of new
    textView.textContainer.exclusionPaths = @[];
    // Force textView to layout the text without exclusionPaths
    [textView.layoutManager glyphRangeForTextContainer:textView.textContainer];

    /// Because of some specifics of my implementation I had a problem with wrong frame of my button. So I calculated it manually
    // Calculate new exclusionPaths
    CGRect buttonFrameInTextView = [superViewOfTextView convertRect:button.frame toView:textView];

    // Calculate textView.text size without any exclusionPaths to calculate right button frame
    CGSize textViewSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, CGFLOAT_MAX)];
    // Update Y position of button
    buttonFrameInTextView.origin.y = size.height - buttonFrameInTextView.size.height;

    // Add new exclusionPaths
    UIBezierPath *buttonRectBezierPath = [UIBezierPath bezierPathWithRect:buttonFrameInTextView];
    textView.textContainer.exclusionPaths = @[ buttonRectBezierPath ];
}

我也有同样的问题。我添加了带有文本附件的AttributeString,它有一个大小。您将设置估计的最大大小。一条线也没有问题。 (对不起,我英语不好。)

这是示例代码

var text: String! {
    didSet {

        let font = UIFont.systemFont(ofSize: 13);
        let att = NSMutableAttributedString.init(string: text, attributes: [NSAttributedString.Key.foregroundColor : UIColor.black,
                                                                            NSAttributedString.Key.font : font]);
        let attachment = NSTextAttachment.init(data: nil, ofType: nil);
        var size = extraSize;
        size.height = font.lineHeight;
        attachment.bounds = CGRect.init(origin: CGPoint.init(), size: size);

        att.append(NSAttributedString.init(attachment: attachment));

        textView.attributedText = att;
    }
}

您好@Catalin,您找到合适的解决方案了吗?不,还没有,就像@adnakoA wise guy告诉我的那样,使用NSAttributed字符串,其尾部有一个透明矩形,大小与时间视图帧相同。它工作得很好。共享代码并将其标记为答案,然后@adnako
var text: String! {
    didSet {

        let font = UIFont.systemFont(ofSize: 13);
        let att = NSMutableAttributedString.init(string: text, attributes: [NSAttributedString.Key.foregroundColor : UIColor.black,
                                                                            NSAttributedString.Key.font : font]);
        let attachment = NSTextAttachment.init(data: nil, ofType: nil);
        var size = extraSize;
        size.height = font.lineHeight;
        attachment.bounds = CGRect.init(origin: CGPoint.init(), size: size);

        att.append(NSAttributedString.init(attachment: attachment));

        textView.attributedText = att;
    }
}