Iphone iOS 7上的UILabel自动大小错误

Iphone iOS 7上的UILabel自动大小错误,iphone,ios,ios7,Iphone,Ios,Ios7,我正在将我的应用程序转换到iOS 7,并使用此方法(已针对iOS 7修改,使用boundingrectizewithsize): 我得到了这样的外表: 正在剪切消息UILabel。感觉行距太大了。它尝试了我找到的许多其他答案,但都不管用 如果有人知道如何帮助我,我将不胜感激 谢谢 试试这个 + (CGSize)messageSize:(NSString*)message { CGSize nameSize = [message sizeWithFont:[UIFont fontWithNam

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

我得到了这样的外表:

正在剪切消息
UILabel
。感觉行距太大了。它尝试了我找到的许多其他答案,但都不管用

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

谢谢

试试这个

+ (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;
}
试试这个

+ (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;
}

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

如果您将从ViewDidDisplay方法更新标签框架,则将获得更新的标签框架


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

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

如果您将从ViewDidDisplay方法更新标签框架,则将获得更新的标签框架


我不知道为什么会发生这种情况,我想这是iOS 7的错误。

尝试将
nsStringDrawingUserFontLeading
更改为
nsStringDrawingUserLineFragmentOrigin

如果您只支持iOS 6和iOS 7,那么我肯定会将所有NSString的
sizeWithFont:…
更改为NSAttributeString的
boundingRectWithSize
。从iOS 6开始,引入了NSAttributedString的NSStringDrawing函数,它们是线程安全的,不同于我们使用的旧NSString+UIKit方法(例如,
sizeWithFont:…
,等等),它们是UIStringDrawing函数(并且当您从非主线程使用它们时,其行为不可预测。如果您碰巧遇到了一个奇怪的多线程角案例,这将为您节省很多麻烦!下面是我如何转换NSString的
大小的字体: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);

尝试将
nsStringDrawingUserFontLeading
更改为
nsStringDrawingUserLineFragmentOrigin

如果您只支持iOS 6和iOS 7,那么我肯定会将所有NSString的
sizeWithFont:…
更改为NSAttributeString的
boundingRectWithSize
。从iOS 6开始,引入了NSAttributedString的NSStringDrawing函数,它们与我们使用的旧NSString+UIKit方法不同,是线程安全的sed to(例如,
sizeWithFont:…
等),它们是UI字符串绘制函数(当您从非主线程使用它们时,它们的行为不可预测。如果您碰巧遇到奇怪的多线程角情况,这将为您省下很多麻烦!下面是我如何转换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);

您是否在IB中向标签添加了自动布局约束?请尝试摆脱标签的高度约束。不,我在IB中没有使用自动布局。在iOS 7公开之前,请咨询开发论坛。您在哪里调用了此方法?它在自定义UITableViewCell类的
layoutSubviews
中调用。是否在IB中向标签添加了自动布局约束?请尝试获取摆脱标签的高度限制。不,我没有在IB中使用自动布局。在iOS 7公开之前,请咨询开发论坛。您在哪里调用此方法?它在自定义UITableViewCell类的
layoutSubviews
中调用。此函数在iOS 7中已被弃用。它不正常工作此函数在iOS 7中已被弃用。它不工作适当地