对于我的 iPhone 应用程序,我想通过使用 CocoaSoundCloudAPI 实现将文件上传到 Soundcloud 的选项。 .在指令“How to use the SoundCloud API directly”中解释了如何以模态方式呈现 loginViewController
:
- (void)login {
[SCSoundCloud requestAccessWithPreparedAuthorizationURLHandler:
^(NSURL *preparedURL){
SCLoginViewController *loginViewController;
loginViewController =
[SCLoginViewController loginViewControllerWithPreparedURL:preparedURL
completionHandler:^(NSError *error){
if (SC_CANCELED(error)) {
NSLog(@"Canceled!");
} else if (error) {
NSLog(@"Ooops, something went wrong: %@", [error localizedDescription]);
} else {
NSLog(@"Done!");
}
}];
[self presentModalViewController:loginViewController
animated:YES];
}];
}
现在我换了
[self presentModalViewController:loginViewController
animated:YES];
与
[self presentViewController:loginViewController
animated:YES
completion:nil];
因为第一种方法在 iOS 7 中已弃用。
但问题是 Soundcloud loginViewController
以这种方式呈现时与状态栏重叠。而且由于我不想更改 Soundcloud API,所以我没有相应的选项来自定义 loginViewController
,例如在其 - viewDidLoad
方法中(如 Stackoverflow 上许多其他帖子中所建议的那样)。
不幸的是,loginViewController
顶部有一个带有按钮的工具栏。我如何从我自己的(呈现的) View Controller 中配置我的 loginViewController
,以便它在呈现时不会与状态栏重叠?
最佳答案
正如我在对原始问题的评论中提到的,我没有找到解决这个问题的好方法。但是,我设法实现了一种解决方法来完成这项工作:
基本思想是将 SCLoginViewController
添加为另一个不属于 Soundcloud 框架的自定义 View Controller 的 subview Controller ,您可以根据需要进行自定义。这是我的新登录方法,显示登录 View Controller :
- (BOOL)loginToSoundcloud {
BOOL __block success = NO;
[SCSoundCloud requestAccessWithPreparedAuthorizationURLHandler:^(NSURL *preparedURL){
SCLoginViewController *loginViewController;
loginViewController =
[SCLoginViewController loginViewControllerWithPreparedURL:preparedURL
completionHandler:^(NSError *error){
if (SC_CANCELED(error)) {
NSLog(@"Canceled!");
} else if (error) {
NSLog(@"Ooops, something went wrong: %@", [error localizedDescription]);
} else {
NSLog(@"Done!");
success = YES;
}
}];
/* BEGIN workaround for iOS7 bug:
when modally presenting a view controller it overlaps the status bar */
CBContainerVCToFixStatusBarOverlap *containerVC = [[CBContainerVCToFixStatusBarOverlap alloc] init];
[containerVC addChildViewController:loginViewController];
containerVC.view.backgroundColor = [UIColor clearColor];
if ([CBAppDelegate iOSVersionIs7OrHigher]) {
loginViewController.view.frame =
CGRectMake(loginViewController.view.frame.origin.x,
loginViewController.view.frame.origin.y + 20,
containerVC.view.frame.size.width,
containerVC.view.frame.size.height - 20);
} else {
loginViewController.view.frame =
CGRectMake(loginViewController.view.frame.origin.x,
loginViewController.view.frame.origin.y,
containerVC.view.frame.size.width,
containerVC.view.frame.size.height);
}
[containerVC.view addSubview:loginViewController.view];
/* END workaround for iOS7 bug */
[self presentViewController:containerVC
animated:YES
completion:nil];
}];
return success;
}
为了检查 iOS 版本,我在 CBAppDelegate 中实现了以下方法:
+ (BOOL)iOSVersionIs7OrHigher {
return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
}
CBContainerVCToFixStatusBarOverlap
是一个简单的 View Controller 类,没有其他方法,只有一个声明的属性。这是 CBContainerVCToFixStatusBarOverlap.h 的内容:
@interface CBContainerVCToFixStatusBarOverlap : UIViewController
@property (strong, nonatomic) IBOutlet UIView *containerView;
@end
关于ios - Soundcloud:当从另一个 View Controller 呈现时,SCLoginViewController 与状态栏重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265547/