iOS 6和iOS 7均可使用的iOS目标应用程序,具有ECSlidingViewController组件。

3
我正在使用 ECSlidingViewController 来实现“汉堡包”菜单。我使用SDK 7.0,但将部署目标更改为iOS 6.1后,我现在正在尝试在旧于7的iOS上测试我的应用程序。问题出在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

看起来阻止您在iOS 6上使用新版本的唯一事物是缺少topLayoutGuidebottomLayoutGuide,即使可用,它们也只会返回零长度。

为什么不在您的控制器中“回溯”这些方法呢?

- (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

0

我不喜欢包含重复版本的库,因为这会导致命名方面的大问题,并需要重新构造所有旧类以添加一些*-OLD后缀。由于您可以访问源代码,因此可以像这样修改较新版本:

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

    //Any other iOS7-specific code.
}

修改后的代码可能比添加重复组件更好,但我已经将其添加到我的问题中了,那我该怎么办? - Libor Zapletal
@Bibo 我不确定这个方法具体是做什么的,但由于在iOS上,事情相当静态(视图控制器始终处于相同的坐标下),你可以使用硬编码值来模拟iOS6.1及以下版本的结果。 - Léo Natan

0

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

但是,如果您真的想为每个版本使用不同的版本,我不知道比从旧版本(因为只有两个类)重命名所有类并以编程方式管理此控制器的创建更好的解决方案,因为在或中无法为不同的版本设置不同的类。您需要用版本检查({{link1:如何检查iOS版本?}})包装此组件的每个调用。

导入和变量可以保留每个组件版本而无需进行检查。

你提到的技巧在这种情况下失败了,因为它适用于不同的体系结构,因为不同体系结构的二进制文件将被包含在最终应用程序中,这被称为“fat binary”,但是对于iOS6和iOS7仍然有相同的架构(只是在iOS7中新增了“arm64”)。因此,您无法仅使用预处理器宏包装“include”并获取具有每个iOS版本的不同代码的“fat binary”。
我希望我的解释能让你理解一些东西。

0

在我看来,最简单的方法(也可能是最好的方法)是将当前的ECSlidingViewController与旧版本集成,当edgesForExtendedLayout不可用时(例如if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { /*...*/})。这应该很容易且快速完成,因为旧版ECSlidingViewController只包含两个文件,而这些文件也存在于新版ECSlidingViewController中。 您可以使用差异工具使此过程更加轻松,以确保您添加了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接