我有代码在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];
}];
});
}
答案 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返回。