gpt4 book ai didi

nsstring - 替换 sizeWithFont :ForWidth:lineBreakMode:

转载 作者:行者123 更新时间:2023-12-04 16:39:51 24 4
gpt4 key购买 nike

我一直使用的许多方法来确定用于创建复杂 pdf 文档的打印字符串的布局在 iOS7 中已被弃用。文档调用了相同的方法来替代所有已弃用的 sizeWithFont 方法:

boundingRectWithSize:options:attributes:

这对 sizeWithFont:ConstrainedTosize:lineBreakMode 来说很好但是如果我只想要我的字符串在一行上呢?我不知道最大高度使用什么,所以我没有一个矩形作为第一个参数的值。

这是我在限制给定大小时所拥有的。
CGFloat maxHeightAllowable = _maxHeight;
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable);
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil];
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]);
CGSize issueTitleSize = issueTitleRect.size;

如果我不知道 maxHeight,或者实际上,一行的高度正是我想要找出的,我将如何使用相同的方法?

我明白他们为什么要插入 NSAttributed 字符串和自动布局的兼容性,但为什么要弃用这些?在我的情况下,替换现在需要 4 或 5 个步骤,而以前是 1 或 2。

使用字体的 lineHeight 属性,正如 T 先生所建议的,我将这些方法放在一个类别中,大大简化了我的替换。
#import "NSString+SizingForPDF.h"

@implementation NSString (SizingForPDF)

-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize
{
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]);
return rect.size;
}

-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines
{
if (lines == 0) {
lines = 1;
}
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGFloat height = font.lineHeight * lines;
CGSize maxsize = CGSizeMake(maxWidth, height);
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]);
return rect.size;
}

@end

最佳答案

如果你只是在寻找一行的高度,你不能只使用你字体的lineHeight吗?属性(property)?我用它来设置标签的高度或正确预测元素的高度,没有任何问题。我不确定 pdf 文件在这方面是否有所不同。

此外,我相信这些函数已被弃用,因为该系列 NSString+UIKit 函数( sizeWithFont:... 等)基于 UIStringDrawing 库,该库不是线程安全的。如果您尝试不在主线程上运行它们(像任何其他 UIKit 功能一样),您将获得不可预测的行为。特别是,如果您同时在多个线程上运行该函数,它可能会使您的应用程序崩溃。这就是为什么在 iOS 6 中,他们引入了 boundingRectWithSize:... NSAttributedStrings 的方法。这是建立在 NSStringDrawing 库之上的,并且是线程安全的。

关于这一点,如果你只支持 iOS 6 和 iOS 7,那么我肯定会改变你所有的 NSString 的 sizeWithFont:...到 NSAttributeString 的 boundingRectWithSize .如果您碰巧有一个奇怪的多线程角落案例,它将为您省去很多麻烦!这是我如何转换 NSString 的 sizeWithFont:constrainedToSize: :

曾经是什么:

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font
constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

可以很容易地替换为:
NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
[[NSAttributedString alloc]
initWithString:text
attributes:@
{
NSFontAttributeName: font
}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;

请注意文档中提到:

In iOS 7 and later, this method returns fractional sizes (in the size component of the returned CGRect); to use a returned size to size views, you must use raise its value to the nearest higher integer using the ceil function.



因此,要提取用于调整 View 大小的计算高度或宽度,我将使用:
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);

关于nsstring - 替换 sizeWithFont :ForWidth:lineBreakMode:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com