UIView没有出现在UIViewController上

时间:2016-04-18 02:56:20

标签: ios objective-c uiview

我有代码在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];
     }];
});
}

2 个答案:

答案 0 :(得分:1)

像这样更改代码

+ (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和其他东西。

答案 1 :(得分:0)

检查[UIViewController currentViewController]上的实现。您需要检查您要获取的控制器是视图控制器还是导航控制器。如果是后者,则必须将该导航的根视图作为currentViewController返回。