3

因此,对于每个新操作系统,都会声明不推荐使用一堆方法。对我来说奇怪的是,如果我还想支持 iOS5 和 iOS6,我必须同时使用 deprecated 和 replacement 方法,比如 with UILabel's minimumScaleFactorover minimumFontSize

如果我替换myLabel.minimumFontSizemyLabel.minimumScaleFactor,我的应用程序将在 iOS5 中崩溃。

所以我使用ifwith-respondsToSelector:来确定操作系统是 5 还是 6 并相应地使用minimumScaleFactoror minimumFontSize

问题是我可能不得不在我的代码中编写一堆ifs 和respondsToSelectors,这感觉很愚蠢。

有没有更好的方法来处理弃用?

4

5 回答 5

6

我创建了可以在任何 ios 中使用的函数:

void AbsSdk30_upg60_UILabel_setMinimumScaleFactor(UILabel * label, CGFloat minimumScaleFactor) {
    if ([label respondsToSelector: @selector(setMinimumScaleFactor:)]) {
        [label setMinimumScaleFactor: minimumScaleFactor];
    }
    else {
        const CGFloat curFontSize = label.font.pointSize;
        const CGFloat fontSize = (0.0 == curFontSize) ? [UIFont labelFontSize] : curFontSize;
        [label setMinimumFontSize: fontSize * minimumScaleFactor];
    }
}
于 2013-03-10T08:23:41.237 回答
2

语言独立解决方案:在应用程序开始时获取操作系统并设置全局变量。然后,当需要查询操作系统版本的变量时。如果未来版本发生更改,您可以在 case/switch 语句中执行此操作,以便轻松扩展。

伪代码:

switch iOSversion
    case < 6
        dothis
        break
    case <7
        dothat
        break
    case >7
        OS not supported ;)

从技术上讲,它与 IF 相同,但您的源代码会更短且结构更结构化,而且您不必每次都查询操作系统版本,而只需在应用程序启动时查询一次。

于 2012-09-28T11:36:48.693 回答
1

为此,您应该将部署目标设为最低。这样,如果您运行您的应用程序。那时它不会给您不推荐使用的错误。而且您不需要在代码中编写 if 和 respondsToSelectors。您可以将您的部署目标设置为 ios 5.0 或 5.1,我认为这对您有用。如果您想要您的部署目标 6.0,那么将有另一种方法可以替换该已弃用的方法。

于 2012-09-28T11:38:27.087 回答
1

我将“弃用”视为一种方法可能在未来某个时候消失的警告,而不是现在必须更换它。我没有让当前构建的代码复杂化,而是给自己留下评论,说明当我放弃对某些旧版本的支持时要更改的内容。

除了在新版本中停止工作的东西外,我不会按版本#ifdef。

于 2012-09-28T11:41:41.273 回答
0

在 .h 文件或 .h 和 .m 文件中向 UILabel 添加一个类别,其中 .h 文件将由使用它的代码导入:

@interface UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize;
- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize;

@end

@implementation UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize // class method that returns a default minimum font size
{
    return 11;
}

- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize
{
    if ([self respondsToSelector: @selector(setMinimumScaleFactor:)])
    {
        CGFloat currentFontSize = self.font.pointSize == 0 ? [UIFont labelFontSize] : self.font.pointSize;
        [self setMinimumScaleFactor:fontSize / currentFontSize];
    }
    else
    {
        [self setMinimumFontSize:fontSize]; // deprecated, only use on iOS's that don't support setMinimumScaleFactor
    }
    [self setAdjustsFontSizeToFitWidth:YES];
}

@end

然后从代码中的多个位置像这样调用 UILabel 扩展:(假设您有一个名为 _instructions 的 UILabel 对象,并且您导入了实现 UILabelCategory 扩展的文件)

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:[UILabel minimumLabelFontSize]];

或像这样:

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:14];

注意:请记住,在 iOS 6 和之前的版本中,setMinimumFontSize 仅在您还将行数设置为 1 时才有效,如下所示:

[_instructions setNumberOfLines:1]; // on iOS6 and earlier the AdjustsFontSizeToFitWidth property is only effective if the numberOfLines is 1
于 2014-07-14T19:46:15.103 回答