我有代码可以在currentViewController的状态栏上显示UIView。这段代码可以完美地在第一个ViewController上运行,但是当从另一个viewController运行该代码时,状态栏消失了,但是标签从不动画或不显示?

第二个VC嵌入在NavigationController中。那是唯一的区别。

我不知道为什么这不起作用,有人遇到过吗?

+ (UIView *) initializeSuccessfulSparkViewOnView: (UIView *) view
{
// Get View Width
CGRect viewRect = view.window.frame;
CGFloat viewWidth = viewRect.size.width;

// Custom popup for new users
UIView *successfulSparkView = [[UIView alloc] initWithFrame: CGRectMake(0, 0, viewWidth, 20)];
[successfulSparkView setCenter: CGPointMake(viewWidth/2, -10)];
[successfulSparkView setBackgroundColor: [UIColor colorWithHexString: @"FF4300"]];

// Border
[[successfulSparkView layer] setBorderWidth: .30f];
[[successfulSparkView layer] setBorderColor: [UIColor whiteColor].CGColor];

// Drop shadow
[[successfulSparkView layer] setShadowRadius: 1.0];
[[successfulSparkView layer] setShadowOpacity: 1.0];
[[successfulSparkView layer] setShadowOffset: CGSizeMake(.1, .1)];
[[successfulSparkView layer] setShadowColor: [UIColor whiteColor].CGColor];
[view addSubview: successfulSparkView];

// Label For Successful Spark Sent
UILabel *sparkSentLabel = [[UILabel alloc] initWithFrame: CGRectMake(0, 0, viewWidth, 20)];
[sparkSentLabel setCenter: CGPointMake([[successfulSparkView window] frame].size.width/2, 10)];

// If Device Model is 4 or 5, Make Smaller Text To Fit Screen
if ([[UIDevice model] containsString: @"iPhone 4"] || [[UIDevice model] containsString: @"iPhone 5"])
{
    [sparkSentLabel setFont: [UIFont fontWithName: @"Helvetica Neue" size: 9]];
}
else
{
    [sparkSentLabel setFont: [UIFont fontWithName: @"Helvetica Neue" size: 10]];
}

// Setup Label On UIView
[sparkSentLabel setTextAlignment: NSTextAlignmentCenter];
[sparkSentLabel setTextColor: [UIColor whiteColor]];
[sparkSentLabel setText: @"Your Spark was sent successfully, and will be delivered at the selected time."];
[successfulSparkView addSubview: sparkSentLabel];
[successfulSparkView bringSubviewToFront: sparkSentLabel];

return successfulSparkView;
}

+ (void) presentSuccessfulSparkSentView
{
//GET CURRENT VIEWCONTROLLER
UIViewController *currentViewController = [UIViewController currentViewController];
UIView *successfulSparkView = [UIViewController initializeSuccessfulSparkViewOnView: [currentViewController view]];

CGRect viewRect = successfulSparkView.window.frame;
CGFloat viewWidth = viewRect.size.width;

//SHOW SUCCESSFUL VIEWCONTROLLER
float displayTime = .50;
[UIView animateWithDuration: displayTime delay: 0 options: UIViewAnimationOptionCurveEaseOut animations:^{
    [successfulSparkView setCenter: CGPointMake(viewWidth/2, 10)];
    [[[currentViewController view] window] setWindowLevel: UIWindowLevelStatusBar];
}
                 completion:^(BOOL finished)
 {
 }];

//DISMISS SUCCESSFUL VIEWCONTROLLER
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((displayTime * 4) * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [UIView animateWithDuration: displayTime delay: 0 options: UIViewAnimationOptionCurveEaseOut animations:
     ^{
         [successfulSparkView setCenter: CGPointMake(viewWidth/2, -10)];
     }
                     completion:^(BOOL finished)
     {
         [[[currentViewController view] window] setWindowLevel: UIWindowLevelNormal];
     }];
});
}

最佳答案

像这样更改代码

+ (void) presentSuccessfulSparkSentView
{
//GET CURRENT VIEWCONTROLLER
    UIViewController *currentViewController = [UIViewController currentViewController];
    if(currentViewController.navigationController != nil)
    {
        currentViewController = currentViewController.navigationController;
    }

......


我认为[UIViewController currentViewController]仅获得UIViewController,并且您尝试在其视图上添加UIView。

但是,UINavigationBar在UIViewController上方,因此,如果在UIViewController的视图上添加UIView,则UINavigationBar会将其隐藏。

最好的方法是在“ UIWindow”上添加UIView。

那么您无需调用[UIViewController currentViewController],也无需关心UINavigationViewController和其他东西。

10-08 03:18