ios - Soundcloud:当从另一个 View Controller 呈现时,SCLoginViewController 与状态栏重叠

标签 ios objective-c soundcloud statusbar overlap

对于我的 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 上许多其他帖子中所建议的那样)。

enter image description here

不幸的是,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/

相关文章:

ios - 在 iOS 8.3 中,openUrl 不会重定向到 safari

ios - 如何在 Cocoa with Core Data 中上传和存储文件?

iphone - 如何通过示例学习 OpenGL,例如,构建一个旋转的地球仪?

iphone - 查找可用的 Wi-Fi 网络

javascript - 尝试访问 JavaScript 中的 iframe 时出错

Soundcloud:如何在上传轨道后立即知道声云轨道 ID?

ios - Facebook iOS SDK 给出 "is not a dylib"警告

ios - 容器 View 不检查滚动中的 UITableView 数据?

ios - UICollectionView viewForSupplementaryElementOfKind 调用了三次

soundcloud - "The Hives"的轨道未通过 api 流式传输