使用 boundingRectWithSize CGRectMake 修复弃用

Posted

技术标签:

【中文标题】使用 boundingRectWithSize CGRectMake 修复弃用【英文标题】:Fixing deprecation with boundingRectWithSize CGRectMake 【发布时间】:2016-07-03 16:20:22 【问题描述】:

因此,我正在尝试修复一些涉及 sizeWithFont 的未解决的 ios7 之前的弃用问题。我一直在关注这里提供的答案'sizeWithFont:constrainedToSize:lineBreakMode:'is deprecated:

.. 主要是处理 CGSize 和 CGSizeMake。但是 我的 问题与 CGRectMake 有关,我还不能按照我想要的方式将它组合在一起。

这是原始代码:

CGSize optimumSize = [percentageText sizeWithFont:self.percentageFont constrainedToSize:CGSizeMake(max_text_width,100)];
CGRect percFrame = CGRectMake(text_x, right_label_y, optimumSize.width, optimumSize.height);

这是我尝试做的:

NSString *percentageText = [NSString stringWithFormat:@"%.1f%%", component.value/total*100];
                NSAttributedString *attributedText =
                [[NSAttributedString alloc]
                 initWithString:percentageText
                 attributes:@
                 
                 NSFontAttributeName: self.percentageFont
                 ];
                CGRect percFrame = [attributedText boundingRectWithSize:(CGRectMake(text_x, right_label_y, max_text_width,100))
                                                                options:NSStringDrawingUsesLineFragmentOrigin
                                                                context:nil];

                CGSize optimumSize = percFrame.size;

但我收到错误消息:“将 CGRect 发送到不兼容类型 CGSize 的参数”。但是我需要所有四个属性......不仅仅是宽度和高度。所以我必须使用 CGRect 而不是 CGSize。知道如何让它发挥作用吗?

否则我所有其他只使用 CGSize 的代码都可以正常工作。只是我有两段代码确实需要CGRect。

【问题讨论】:

【参考方案1】:

NSAttributedString 上的方法将最大大小作为参数。你可以在它返回的 CGRect 上设置你想要的原点。

NSString *percentageText = [NSString stringWithFormat:@"%.1f%%", component.value/total*100];
            NSAttributedString *attributedText =
            [[NSAttributedString alloc]
             initWithString:percentageText
             attributes:@
             
             NSFontAttributeName: self.percentageFont
             ];
            CGRect percFrame = [attributedText boundingRectWithSize:(CGSizeMake(max_text_width,100))
                                                            options:NSStringDrawingUsesLineFragmentOrigin
                                                            context:nil];
            percFrame.origin = CGPointMake(text_x, right_label_y)

【讨论】:

他们必须想出一种方法来简化这个......不知何故,原来的 2 行代码现在变成了 10 行代码。我会在后端做一些事情以使其与被弃用之前一样高效(或更高效)。无论如何,您的答案有效。谢谢!

以上是关于使用 boundingRectWithSize CGRectMake 修复弃用的主要内容,如果未能解决你的问题,请参考以下文章

使用 boundingRectWithSize CGRectMake 修复弃用

在 boundingRectWithSize:options:context: 中使用 NSStringDrawingUsesLineFragmentOrigin: 获得额外的空白空间

NSString boundingRectWithSize返回不必要的高度

为啥在 boundingRectWithSize 处崩溃此代码?

调用 NSAttributedString.boundingRectWithSize 时应用程序崩溃

boundingRectWithSize 有时会返回大约 1 行高的高度