我正在使用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;
}
答案 0 :(得分:0)
首先,最简单的方法是使用最新版本的组件来支持最低的部署目标。
但是如果你真的想为每个iOS
提供不同的版本,我不知道更好的解决方案,而不仅仅是重命名所有类,例如旧版本(因为只有两个类)并以编程方式管理此控制器的创建,因为无法为iOS
或xib
中的不同storyboard
版本设置不同的类。您需要使用iOS
版本检查(How to check iOS version?)来包装此组件的每次调用。
您可以为每个版本的组件留下的导入和变量,而无需检查。
你提到的技巧在这种情况下失败了,因为它适用于不同的架构,因为不同架构的二进制文件将包含在最终应用程序中并且名为fat binary
,但是那里有iOS6
和iOS7
的相同架构(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新版本的唯一因素是缺少topLayoutGuide
和bottomLayoutGuide
,如果可用的话,只会返回零长度。
为什么不" 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工具确保你应该添加什么,你可以让你的生活更轻松。