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

5

我希望我的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];

  }];
}

现在我替换了

     [self presentModalViewController:loginViewController
                             animated:YES];

使用

     [self presentViewController:loginViewController
                        animated:YES
                      completion:nil];

因为第一种方法在iOS 7中已被弃用。
但问题是,当以这种方式呈现时,Soundcloud的loginViewController会与状态栏重叠。由于我不想改变Soundcloud API,因此我没有选项来相应地自定义loginViewController,例如在其-viewDidLoad方法中(正如Stackoverflow上许多其他帖子所建议的)。
不幸的是,在loginViewController的顶部有一个带有按钮的工具栏。我该如何从我的(呈现)视图控制器内配置我的loginViewController,以便在呈现时它不会与状态栏重叠?

你已经解决这个问题了吗?我也遇到了同样的问题。 - Jawap
@Jawap:不幸的是,我还没有找到这个问题的真正解决方案,但我想出了一个可行的解决方法。马上发布答案。 - Mischa
1个回答

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;
}

为了检查iOS版本,我在CBAppDelegate中实现了以下方法:
+ (BOOL)iOSVersionIs7OrHigher {
    return floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
}

CBContainerVCToFixStatusBarOverlap 是一个简单的视图控制器类,没有额外的方法,只有一个已声明的属性。以下是 CBContainerVCToFixStatusBarOverlap.h 的内容:

@interface CBContainerVCToFixStatusBarOverlap : UIViewController
@property (strong, nonatomic) IBOutlet UIView *containerView;
@end

非常感谢,我会尝试这个。 - Jawap
1
这个很好用,谢谢!不过需要注意的是,你不需要一个自定义的子类视图控制器,你可以只创建一个 UIViewController 的实例作为容器并做同样的事情。 - beebcon
@Mischa,谢谢,这对我有用。我唯一更改的是backgroundColor,因为当我使用clearColor时,状态栏变成了黑色,所以我将其更改为whiteColor。 - akmal

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