Soundcloud:当从另一个视图控制器呈现时,SCLoginViewController与状态栏重叠

Mis*_*cha 5 objective-c statusbar overlap ios soundcloud

对于我的iPhone应用程序,我想实现通过使用CocoaSoundCloudAPI将文件上传到Soundcloud的选项.在" 如何直接使用SoundCloud API "说明中,解释了如何以模态方式呈现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];

  }];
}
Run Code Online (Sandbox Code Playgroud)

现在我换了

     [self presentModalViewController:loginViewController
                             animated:YES];
Run Code Online (Sandbox Code Playgroud)

     [self presentViewController:loginViewController
                        animated:YES
                      completion:nil];
Run Code Online (Sandbox Code Playgroud)

因为第一种方法在iOS 7中已弃用.

但问题是,loginViewController当以这种方式呈现时,Soundcloud会重叠状态栏.由于我不想更改Soundcloud API,因此我没有选择loginViewController相应的- viewDidLoad方法,例如在其方法中(如Stackoverflow上的许多其他帖子所示).

在此输入图像描述

不幸的是,有一个工具栏,顶部有一个按钮loginViewController.如何loginViewController从我自己的(呈现)视图控制器内部配置我,使其在呈现时不会与状态栏重叠?

Mis*_*cha 7

正如我对原始问题的评论中提到的,我没有找到解决这个问题的简洁方法.但是我设法实现了完成工作的解决方法:

基本思想是添加SCLoginViewController另一个自定义视图控制器的子视图控制器,该视图控制器不是Soundcloud框架的一部分,您可以根据需要进行自定义.这是我的新登录方法,它显示了登录视图控制器:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

为了检查iOS版本,我在CBAppDelegate中实现了以下方法:

+ (BOOL)iOSVersionIs7OrHigher {
    return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
}
Run Code Online (Sandbox Code Playgroud)

CBContainerVCToFixStatusBarOverlap是一个简单的视图控制器类,没有其他方法,只有一个声明的属性.这是CBContainerVCToFixStatusBarOverlap.h的内容:

@interface CBContainerVCToFixStatusBarOverlap : UIViewController
@property (strong, nonatomic) IBOutlet UIView *containerView;
@end
Run Code Online (Sandbox Code Playgroud)