iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – boundingRectWithSize不复制UITextView大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_696_2@
我在项目中的要求是UITextView的字体大小应该根据UITextView的内容而减少.所以我试图使用boundingRectWithSize来估计文本的大小.

问题是我得到的字体有点太大,文本的某些部分会被剪裁.

我的职责:

-(BOOL)updateTextViewFontSizeForText:(NSString*)text{

    float fontSize = self.maximumFontSizeInPoints;

    self.font = [self.font fontWithSize:fontSize];

    CGSize tallerSize ;
    CGSize StringSize ;


    do
    {
        if (fontSize <= self.minimumFontSizeInPoints) // it just won't fit
            return NO;

        fontSize -= 1.0;
        self.font = [self.font fontWithSize:fontSize];

        NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
        [paragraphStyle setLineBreakmode:NSLineBreakByWordWrapping];

        NSDictionary *attributes = @{ NSFontAttributename: self.font,NSParagraphStyleAttributename : paragraphStyle };



        tallerSize = CGSizeMake(self.frame.size.width,self.frame.size.height-16);// the 16 is given because uitextview adds some offset
        StringSize = [text boundingRectWithSize:CGSizeMake(self.contentSize.width,CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size;
    }while(StringSize.height >= tallerSize.height);


    if ([self.ontextChangDelegate respondsToSELEctor:@SELEctor(ontextChangDelegatE)]) {

        [self.ontextChangDelegate ontextChanged:text];
    }

    return YES;
}
@H_696_2@

解决方法

我试图做同样的事情时遇到了同样的问题.

问题是UITextView与boundingRectWithSize相比如何运行其换行符.您可以在此处阅读更多详细信息:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/TextLayout/Concepts/CalcTextLayout.html

但你实际上可以计算出确切的大小! UITextView基本上有两个属性,您需要虑这些属性才能获得正确的大小估计值.第一个是textContainer.lineFragmentPadding,第二个是textContainerInset.

首先,textContainer.lineFragmentPadding:您可能已经注意到您的大小调整通常总是偏离10px,这是因为系统认值是5px.当您计算估计的大小时,您需要从您检查的大小中减去此值,并在获得最终值时将其重新添加.

二,textContainerInset.这是一个UIEdgeInset,您需要将其添加回最终计算值以匹配系统.

这是基于我如何解决问题的代码

- (CGSizE)sizeThatFits:(CGSizE)size
    CGFloat lineFragmentPaddings = self.textContainer.lineFragmentPadding * 2;
    CGFloat horzPadding = self.textContainerInset.left + self.textContainerInset.right + lineFragmentPaddings;
    CGFloat vertPadding = self.textContainerInset.top + self.textContainerInset.bottom;

    size.width -= horzPadding;
    CGRect boundingRect = [attributedText boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    size = boundingRect.size;
    // I found through debugging that adding 0.25 rounded
    // matches sizeThatFits: identically. Not sure why…
    size.width += horzPadding + 0.25;
    size.height += vertPadding + 0.25;
    size = CGSizeround(sizE);

    return size;
}

注意,CGSizeRound只是我编写的一个@L_673_13@,它将CGSize的宽度和高度四舍五入到最接近的0.5.

为了进行比较,如果您创建第二个UITextView,并确保textContainer.lineFragmentPadding和textContainerInset相同,您应该看到几乎与最接近的0.5相同的值.

关于计算正确的pointSize的问题,这是一些伪代码

CGFloat pointSize = 64;
CGFloat minPointSize = 32;
CGFloat decrementor = 4;
CGFloat padding = self.textContainerInset.left + self.textContainerInset.right + lineFragmentPaddings;
CGFloat actualWidth = self.maxTextViewSize.width - padding * 2;
CGRect boundingRect = CGRectZero;
BOOL isValidPointSize = NO;
do {
    if (pointSize < minPointSizE) {
        pointSize = minPointSize;
        boundingRect.size.height = self.maxTextViewSize.height;
        isValidPointSize = YES;
    } else {
        NSDictionary *defaultAttributes = [self.customTextStorage defaultAttributesForPointSize:pointSize];
        NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:string attributes:defaultAttributes];

        boundingRect = [attrString boundingRectWithSize:CGSizeMake(actualWidth,1024) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
        // is the height to big?
        if (boundingRect.size.height > self.maxTextViewSize.height) {
            // reduce the point size for next iteration of loop
            pointSize -= decrementor;
        }
        // passes height test
        else {
            isValidPointSize = YES;
        }
    }
} while (!isValidPointSizE);

return pointSize;

同样,以上是基于我的实现的伪代码(并不意味着只是替换你所拥有的).希望这可以帮助!

@H_696_2@ @H_696_2@
@H_696_2@
@H_696_2@

大佬总结

以上是大佬教程为你收集整理的ios – boundingRectWithSize不复制UITextView全部内容,希望文章能够帮你解决ios – boundingRectWithSize不复制UITextView所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。