Objective c 在iOS 7中动态调整标签大小

Objective c 在iOS 7中动态调整标签大小,objective-c,uilabel,ios7,Objective C,Uilabel,Ios7,在iOS 6中,我使用: CGSize labelSize = [self.text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode]; self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , labelSize.width, self.frame.size.height); 动态调整UILabel的大小。这

在iOS 6中,我使用:

CGSize labelSize = [self.text sizeWithFont:self.font constrainedToSize:size lineBreakMode:self.lineBreakMode];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , labelSize.width, self.frame.size.height);
动态调整UILabel的大小。这在iOS 7中不起作用,因此我尝试:

NSString *text = self.text;
CGFloat width = size.width;
UIFont *font = self.font;
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text
                                                                 attributes:@{ NSFontAttributeName: font }];

CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                              options:NSStringDrawingUsesDeviceMetrics
                              context:nil];
CGSize size = rect.size;

self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y , size.width, self.frame.size.height);
这是在UILabel上的一个类别内,但这也不起作用。。。 你知道我应该用什么吗

尝试以下方法(不使用自动布局):


如果没有更多关于它为什么不起作用的详细信息,我猜您需要使用选项
nsStringDrawingUserLineFragmentOrigin
,以便它成为旧
sizeWithFont:
的替代品,如下所示:

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;
[self resizeHeightForLabel:myLabel];
//set new constraints here if needed
请注意,文件中提到:

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

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

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);

这在iOS6和iOS7中应该可以工作,但会打破标签约束(如果需要,您需要通过编程将它们全部设置回原位):

将此方法添加到viewController,并按如下方式使用:

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;
[self resizeHeightForLabel:myLabel];
//set new constraints here if needed
-(void)resizeLabelByContent:(UILabel*)标签
{
CGSize maxSize=CGSizeMake(label.width,999);
NSString*contentStr=label.text;
UIFont*contentFont=label.font;
CGRect内容框架;
NSString*版本=[[UIDevice currentDevice]系统版本];
如果([version floatValue]<7.0){
CGSize contentStringSize=[contentStr sizeWithFont:contentFont constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
contentFrame=CGRectMake(label.left、label.top、label.width、contentStringSize.height);
}否则{
NSDictionary*contentDic=[NSDictionary Dictionary WithObjectsAndKeys:contentFont,NSFontAttributeName,nil];
CGSize contentStrSize=[contentStr boundingRectWithSize:maxSize选项:NSStringDrawingUserLineFragmentOrigin属性:contentDic上下文:nil].size;
contentFrame=CGRectMake(label.left、label.top、label.width、contentstrize.height);
}
label.frame=contentFrame;
}

什么部件不工作?计算的帧大小是否错误,或者标签大小是否没有变化?我需要调整宽度而不是高度的大小。。。我要试一试。。首先,我认为修改代码以调整宽度并不难。请确保在调用此方法之前添加了要查看的标签(使用IB或编程方式)。如果使用的是自动布局和约束,请尝试在应用此功能之前和之后注销标签框宽度/高度(如果已更改)。如果框架已更改,则必须调整约束。如果不是,那么在其他地方就有一些错误。尝试类似于NSLog的操作(@“宽度:%f,高度:%f”,myLabel.frame.size.width,myLabel.frame.size.height)到日志宽度/高度。@user426132帮助我了解什么不起作用。哪些部分的行为与
sizeWithFont:
以前的不同?
- (void)resizeLabelByContent:(UILabel *)label
{

    CGSize maxSize = CGSizeMake(label.width, 999);

    NSString *contentStr = label.text;

    UIFont *contentFont = label.font;

    CGRect contentFrame;

    NSString *version = [[UIDevice currentDevice] systemVersion];

    if ([version floatValue] < 7.0) {

        CGSize contentStringSize = [contentStr sizeWithFont:contentFont constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];

        contentFrame = CGRectMake(label.left, label.top, label.width, contentStringSize.height);

    } else {

        NSDictionary *contentDic = [NSDictionary dictionaryWithObjectsAndKeys:contentFont, NSFontAttributeName, nil];

        CGSize contentStrSize = [contentStr boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:contentDic context:nil].size;

        contentFrame = CGRectMake(label.left, label.top, label.width, contentStrSize.height);
    }

    label.frame = contentFrame;
}