我有一个支持横向和纵向模式的应用程序。而且我需要与 iOS 6 上相同的行为状态栏。最简单的方法是什么?
我已经尝试过 Stack Overflow 问题iOS 7 status bar back to iOS 6 style 中的解决方案?,但它不起作用。我的子视图取决于视图大小,并且我的视图无法正确拉伸。我不想更新我的 XIB 文件;我只是想添加一些对我有帮助的东西。我不知道它可能是什么(黑客或祈祷)。
我有一个支持横向和纵向模式的应用程序。而且我需要与 iOS 6 上相同的行为状态栏。最简单的方法是什么?
我已经尝试过 Stack Overflow 问题iOS 7 status bar back to iOS 6 style 中的解决方案?,但它不起作用。我的子视图取决于视图大小,并且我的视图无法正确拉伸。我不想更新我的 XIB 文件;我只是想添加一些对我有帮助的东西。我不知道它可能是什么(黑客或祈祷)。
您可以尝试在 ViewWillappear 或 DidAppear 中编写此内容。在这里,我们将视图框架向下移动 20 像素。
CGRect frame = self.view.frame;
frame.origin.y = 20;
if (self.view.frame.size.height == 1024 ||
self.view.frame.size.height == 768)
{
frame.size.height -= 20;
}
self.view.frame = frame;
这会起作用,但这不是一个好主意。如果有帮助,您还可以通过调用以下方法将状态栏的文本颜色更改为浅色或深色,具体取决于您的应用背景。
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent; // For light status bar
return UIStatusBarStyleDefault // For Dark status bar
}
如果您使用的是 Xcode 5 并且正在安装 iOS 7,那么抱歉,这不会发生(据我所知)。
如果您想在 iOS 7 上查看状态栏,而不是在 Xcode 4.xx 中打开项目并在 iOS 7 中安装。我发现这种方法的一个问题是有时 Xcode 4.xx 无法识别 iOS 7设备。
但是,如果您的 Xcode 4.xx 可以显示您的 iOS 7 设备,那么它就可以工作。
从 Xcode 4.xx 生成的 .api 将在 iOS 6 和 iOS 7 中工作,但你不会在 iOS 7 上获得额外的空间(状态栏)以及键盘、选择器、开关等的新外观。但是是的,你会得到新的 UIAlertView (我不知道为什么这是新的而其他控件是旧的。)
我希望我们很快会在 Xcode 5 中为此获得更好的解决方案。
更新:
我找到了从 Xcode 5 作为 Xcode 4 运行应用程序的方法。这只是基本 SDK 的问题。如果您想从 Xcode 5 构建为 Xcode 4 (iOS 6 SDK),请执行以下操作。
关闭 Xcode 4 和 5。
在 Xcode 4 中转到
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs
在这里你会发现iPhoneOS6.1.sdk
。复制此文件夹。现在在同一条路径上进入 Xcode 5。在 Xcode 5 中,您会发现iPhoneOS7.0.sdk
. 用它粘贴iPhoneOS6.1.sdk
。
现在关闭 Finder 并启动 Xcode 5。转到project target setting -> Build Setting
并找到 Base SDK。选择iOS 6.1
作为基础 SDK。这也适用于 6.0。你只需要找到iPhoneOS6.0.sdk
.
现在您将在运行下拉框中看到两次设备名称。一种用于 SDK 7.0,另一种用于 SDK 6.1。所以现在您可以使用 iOS 6 SDK 和 iOS 7 SDK 两种方式运行。
我希望这会对某人有所帮助。
我最近不得不解决一个类似的问题,我用一种稍微不同的方式来解决它......
方法是使用一个额外的视图控制器,作为最初我的 rootViewController 的容器视图控制器。首先,我设置了一个这样的容器:
_containerView = [[UIView alloc] initWithFrame:[self containerFrame]];
_containerView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
_containerView.clipsToBounds = YES;
[self.view addSubview:_containerView];
[self.view setBackgroundColor:[UIColor blackColor]];
[UIApplication.sharedApplication setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
containerFrame 的定义如下:
- (CGRect)containerFrame
{
if ([MyUtilityClass isSevenOrHigher])
{
CGFloat statusBarHeight = [MyUtility statusBarHeight]; //20.0f
return CGRectMake(0, statusBarHeight, self.view.bounds.size.width, self.view.bounds.size.height - statusBarHeight);
}
return self.view.bounds;
}
最后,我将原来的 rootViewController 添加为新的 childViewController:
//Add the ChildViewController
self.childController.view.frame = self.containerView.bounds;
self.childController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self addChildViewController:self.childController];
[self.containerView addSubview:self.childController.view];
[self.childController didMoveToParentViewController:self];
需要注意的事项: - 模态视图控制器仍将以 iOS7 样式呈现,所以我仍然必须以某种方式解释这一点。
希望这对某人有帮助!
本指南对我有帮助。
http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/
处理 20 磅大小差异的最可靠方法是自动布局。
如果您不使用自动布局,Interface Builder 为您提供了处理 iOS 7 和旧版本之间屏幕尺寸差异的工具。当 Auto Layout 关闭时,您会注意到 Interface Builder 实用程序区域(右窗格)的大小选项卡中的一个区域,允许您设置 iOS 6/7 Deltas。
1)这是一个黑客,但它有效!
#import <objc/runtime.h>
@interface UIScreen (I_love_ios_7)
- (CGRect)bounds2;
- (CGRect)boundsForOrientation:(UIInterfaceOrientation)orientation;
@end
@implementation UIScreen (I_love_ios_7)
- (CGRect)bounds2
{
return [self boundsForOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
}
- (CGRect)boundsForOrientation:(UIInterfaceOrientation)orientation
{
CGRect resultFrame = [self bounds2];
if(UIInterfaceOrientationIsLandscape(orientation))
resultFrame.size.width -= 20;
else
resultFrame.size.height -= 20;
return resultFrame;
}
@end
void Swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
Swizzle([UIScreen class], @selector(bounds2), @selector(bounds));
[application setStatusBarStyle:UIStatusBarStyleLightContent];
self.window.clipsToBounds =YES;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidChangeStatusBarOrientation:)
name:UIApplicationWillChangeStatusBarOrientationNotification
object:nil];
NSDictionary* userInfo = @{UIApplicationStatusBarOrientationUserInfoKey : @([[UIApplication sharedApplication] statusBarOrientation])};
[[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationWillChangeStatusBarOrientationNotification
object:nil
userInfo:userInfo];
}
return YES;
}
- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
UIInterfaceOrientation orientation = [[notification.userInfo objectForKey: UIApplicationStatusBarOrientationUserInfoKey] intValue];
CGSize size = [[UIScreen mainScreen] boundsForOrientation:orientation].size;
int w = size.width;
int h = size.height;
float statusHeight = 20.0;
switch(orientation){
case UIInterfaceOrientationPortrait:
self.window.frame = CGRectMake(0,statusHeight,w,h);
break;
case UIInterfaceOrientationPortraitUpsideDown:
self.window.frame = CGRectMake(0,0,w,h);
break;
case UIInterfaceOrientationLandscapeLeft:
self.window.frame = CGRectMake(statusHeight,0,w,h);
break;
case UIInterfaceOrientationLandscapeRight:
self.window.frame = CGRectMake(0,0,w,h);
break;
}
}
@end
2)创建类别,并始终使用contentView
而不是view
@interface UIViewController(iOS7_Fix)
@property (nonatomic, readonly) UIView* contentView;
- (void)updateViewIfIOS_7;
@end
@implementation UIViewController(iOS7_Fix)
static char defaultHashKey;
- (UIView *)contentView
{
return objc_getAssociatedObject(self, &defaultHashKey)?: self.view;
}
- (void)setContentView:(UIView *)val
{
objc_setAssociatedObject(self, &defaultHashKey, val, OBJC_ASSOCIATION_RETAIN_NONATOMIC) ;
}
- (void)updateViewIfIOS_7
{
if([[[UIDevice currentDevice] systemVersion] floatValue] < 7 || objc_getAssociatedObject(self, &defaultHashKey))
return;
UIView* exchangeView = [[UIView alloc] initWithFrame:self.view.bounds];
exchangeView.autoresizingMask = self.view.autoresizingMask;
exchangeView.backgroundColor = [UIColor blackColor];
UIView* view = self.view;
if(self.view.superview){
[view.superview addSubview:exchangeView];
[view removeFromSuperview];
}
[exchangeView addSubview:view];
self.view = exchangeView;
CGRect frame = self.view.bounds;
frame.origin.y += 20.0;
frame.size.height -= 20.0;
view.frame = frame;
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setContentView:view];
}
在每个UIViewController
:
- (void)viewDidLoad
{
[super viewDidLoad];
[self updateViewIfIOS_7];
UILabel* lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 130, 30)];
lab.backgroundColor = [UIColor yellowColor];
[self.contentView addSubview:lab];
//...
}