因此,对于每个新操作系统,都会声明一组方法已被弃用。对我来说奇怪的是,如果我仍然支持iOS5和iOS6,我必须同时使用已弃用和替换的方法,例如UILabel
的{{1}}超过minimumScaleFactor
。< / p>
如果我将minimumFontSize
替换为myLabel.minimumFontSize
,那么我的应用将会在iOS5中崩溃。
因此我使用myLabel.minimumScaleFactor
和if
来确定操作系统是5还是6,并相应地使用-respondsToSelector:
或minimumScaleFactor
。
问题是我可能不得不在我的代码中编写一堆minimumFontSize
和if
,这感觉很愚蠢。
有更好的方法来处理弃用吗?
答案 0 :(得分: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];
}
}
答案 1 :(得分:2)
独立语言解决方案:在应用程序开始时获取操作系统并设置全局变量。然后,当neede查询OS版本的变量时。您可以在case / switch语句中执行此操作,以便在将来版本发生更改时可以轻松扩展。
伪代码:
switch iOSversion
case < 6
dothis
break
case <7
dothat
break
case >7
OS not supported ;)
从技术上讲,它与IF相同,但你的来源会更短,更结构化,而且你不必每次都查询操作系统版本,而是在应用程序开始时查询。
答案 2 :(得分:1)
为此,您应该将部署目标设置为最小值。因此,如果您运行您的应用程序。那时它不会给您弃用的错误。而且您也不需要在代码中编写if s和respondsToSelectors。您可以将部署目标设置为ios 5.0或5.1 我认为这对你有用。 如果您希望部署目标6.0,那么将有另一种方法可以替换已弃用的方法。
答案 3 :(得分:1)
我将'弃用'视为一种警告,即某种方法可能会在未来的某个时刻消失,而不是现在必须更换。我没有给当前版本的代码复杂化,而是留下了关于当我放弃对某些旧版本的支持时要改变什么的评论。
除了在新版本中停止工作的内容之外,我不会#ifdef版本。
答案 4 :(得分: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