0

我正在将我的应用程序转换到 iOS 7 并使用此方法(已针对 iOS 7 进行了修改,使用boundingRectWithSize...):

+ (CGSize)messageSize:(NSString*)message {

    NSDictionary *attributes = @{NSFontAttributeName : [UIFont fontWithName:@"Futura-Medium" size:13]};

    CGRect frame = [message boundingRectWithSize:CGSizeMake([PTSMessagingCell maxTextWidth], CGFLOAT_MAX) options:NSStringDrawingUsesFontLeading attributes:attributes context:nil];

    return frame.size;
}

我得到了这个外观:

气泡

消息UILabel正在被剪切。感觉行间距太大了。它尝试了我找到的许多其他答案,但没有一个有效。

如果有人知道如何帮助我,我将不胜感激!;)

谢谢!

4

3 回答 3

4

尝试更改NSStringDrawingUsesFontLeadingNSStringDrawingUsesLineFragmentOrigin.

如果您只支持 iOS 6 和 iOS 7,那么我肯定会将您的所有 NSString 更改sizeWithFont:...为 NSAttributeString boundingRectWithSize。从 iOS 6 开始,引入了 NSAttributedString 的 NSStringDrawing 函数,它们是线程安全的,与我们习惯使用的旧 NSString+UIKit 方法(例如sizeWithFont:...,等等)不同,它们是 UIStringDrawing 函数(当你从非-主线程。如果你碰巧有一个奇怪的多线程角落案例,它会为你省去很多麻烦!这是我转换 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;

请注意文档中提到:

在 iOS 7 及更高版本中,此方法返回小数大小(在返回的 CGRect 的大小组件中);要使用返回的大小来调整视图大小,您必须使用 ceil 函数将其值提高到最接近的更高整数。

因此,要提取用于调整视图大小的计算高度或宽度,我会使用:

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);
于 2013-09-23T06:38:41.693 回答
0

我认为您正在从 viewDidLoad 或 viewWillAppear 更新标签框架,因此它不起作用。

如果您将从 viewDidAppear 方法更新标签框架,那么您将获得更新的标签框架。

我不确定为什么会发生这种情况,我认为这是 iOS 7 的错误。

于 2013-09-17T12:16:03.520 回答
-1

尝试这个

+ (CGSize)messageSize:(NSString*)message {

CGSize nameSize = [message sizeWithFont:[UIFont fontWithName:@"Futura-Medium" size:13]
                      constrainedToSize:CGSizeMake(maxWidth, maxHeight) lineBreakMode:NSLineBreakByWordWrapping];


NSLog(@"width = %f, height = %f", nameSize.width, nameSize.height);

return nameSize;
}
于 2013-09-17T06:01:25.727 回答