适用于iOS 6和iOS 7以及ECSlidingViewController组件的iOS目标应用

时间:2014-03-11 14:31:11

标签: ios objective-c ios6 ios7 compatibility

我正在使用ECSlidingViewController用于"汉堡"菜单。我正在使用SDK 7.0,但我将部署目标更改为iOS 6.1,现在我正在尝试使用旧版iOS 7的应用程序。问题在于setEdgesForExtendedLayout。较旧的系统版本有较旧的ECSlidingViewController。所以我的问题是如何更改为iOS 6.1及更高版本的旧版本以及更新版本的iOS 7.0及更高版本。我包含来自ECSlidingViewController个项目的文件(不是cocoapods,但如果需要,那么更改它没有问题)。我想我需要检查操作系统版本,然后更改导入,但我不确定它是否足够以及这两个项目的最佳名称约定。我猜他们应该在不同的文件夹中(比如ECSlidingViewController和ECSlidingViewControllerOld)但是类应该是同一个名字,是不是?

修改edgesForExtendedLayout的代码示例:

- (CGRect)underLeftViewCalculatedFrameForTopViewPosition:(ECSlidingViewControllerTopViewPosition)position {
    CGRect frameFromDelegate = [self frameFromDelegateForViewController:self.underLeftViewController
                                                        topViewPosition:position];
    if (!CGRectIsInfinite(frameFromDelegate)) return frameFromDelegate;

    CGRect containerViewFrame = self.view.bounds;

    if (!(self.underLeftViewController.edgesForExtendedLayout & UIRectEdgeTop)) {
        CGFloat topLayoutGuideLength    = [self.topLayoutGuide length];
        containerViewFrame.origin.y     = topLayoutGuideLength;
        containerViewFrame.size.height -= topLayoutGuideLength;
    }

    if (!(self.underLeftViewController.edgesForExtendedLayout & UIRectEdgeBottom)) {
        CGFloat bottomLayoutGuideLength = [self.bottomLayoutGuide length];
        containerViewFrame.size.height -= bottomLayoutGuideLength;
    }

    if (!(self.underLeftViewController.edgesForExtendedLayout & UIRectEdgeRight)) {
        containerViewFrame.size.width = self.anchorRightRevealAmount;
    }

    return containerViewFrame;
}

4 个答案:

答案 0 :(得分:0)

首先,最简单的方法是使用最新版本的组件来支持最低的部署目标。

但是如果你真的想为每个iOS提供不同的版本,我不知道更好的解决方案,而不仅仅是重命名所有类,例如旧版本(因为只有两个类)并以编程方式管理此控制器的创建,因为无法为iOSxib中的不同storyboard版本设置不同的类。您需要使用iOS版本检查(How to check iOS version?)来包装此组件的每次调用。

您可以为每个版本的组件留下的导入和变量,而无需检查。

你提到的技巧在这种情况下失败了,因为它适用于不同的架构,因为不同架构的二进制文件将包含在最终应用程序中并且名为fat binary,但是那里有iOS6iOS7的相同架构(iOS7 - arm64中只有一个新版本)。因此,您不能仅使用预处理器宏包装include,并为每个iOS版本使用不同的代码获取fat binary

我希望你从我的解释中理解了一些东西。

答案 1 :(得分:0)

我不喜欢包含重复版本的库,因为这会给命名带来很大的问题,而且很多工作要重构所有旧类,以便有一些*-OLD后缀。由于您可以访问源代码,因此您可以修改较新的版本:

if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
{
    [vc setEdgesForExtendedLayout:UIRectEdgeNone];

    //Any other iOS7-specific code.
}

答案 2 :(得分:0)

似乎阻止您使用iOS 6新版本的唯一因素是缺少topLayoutGuidebottomLayoutGuide,如果可用的话,只会返回零长度。

为什么不" backport"控制器中的那些方法?

- (id<UILayoutSupport>)topLayoutGuide
{
    CustomLayoutGuide * guide = [CustomLayoutGuide new];
    guide.length = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0") ? super.topLayoutGuide.length : 0.0;
    return guide;
}

辅助类

@interface CustomLayoutGuide : NSObject <UILayoutSupport>

@property(nonatomic) CGFloat length;

@end

@implementation CustomLayoutGuide

@end

答案 3 :(得分:0)

恕我直言,最容易做的事情(可能是最好的)是在edgesForExtendedLayout不可用时(例如if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { /*...*/})采用当前的ECSlidingViewController并集成部分旧版本。这应该非常简单快捷,因为旧的ECSlidingViewController just consists of two files和这些文件也存在于新的ECSlidingViewController中。 通过使用diff工具确保你应该添加什么,你可以让你的生活更轻松。