将 subView 添加到 UINavigationBar 并将其删除

Posted

技术标签:

【中文标题】将 subView 添加到 UINavigationBar 并将其删除【英文标题】:adding subView to the UINavigationBar and removing it 【发布时间】:2013-10-09 18:33:58 【问题描述】:

我正在尝试创建 UINavigationBar 的自定义外观。当用户将应用置于横向时,navigationBar 应该被一个 Image 覆盖。当旋转回纵向时,我希望删除视图(图像)。除了删除它之外,下面的代码一切正常。如果我将代码放在同一个 if 语句中,我可以删除视图,但如果我把它放在 else if 语句中,则不会发生任何事情。我错过了什么吗? /问候

- (void) adjustViewsForOrientation:(UIInterfaceOrientation) orientation 

    UIView *v =  [[UIView alloc]init];

     if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)


    v.frame = CGRectMake(0,0,480,44);
    v.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"navbar25g.png"]];
    [self.view addSubview:v];
    //[v removeFromSuperview]; <----- works if I put it here

     NSLog(@"LANDSCAPE");//load the landscape view


     else if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)

           [v removeFromSuperview]; <----- Not working


         NSLog(@"PORTRAIT"); //load the portrait view

  


【问题讨论】:

【参考方案1】:

您无法删除它的原因是每次进入创建 UIView *v 的新实例的方法时。

创建一个实例变量,然后将视图分配给它。分配后,您可以根据需要删除或添加。

如果你不想使用实例变量,那么你可以给视图一个标签,即

UIView *v = nil;

v = [self.view viewForTag:1000];

if (!v) 
    v = [[UIView alloc] init];
    v.tag = 1000;
    v.frame = CGRectMake(0, 0, 480, 44);
    v.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"navbar25g.png"]];

现在您可以为其添加和删除。

【讨论】:

【参考方案2】:

你试过 UIAppearance 吗?

  [[UINavigationBar appearance] setBackgroundImage:nil barMetrics:UIBarMetricsDefault];
  [[UINavigationBar appearance] setBackgroundImage:image barMetrics:UIBarMetricsLandscapePhone];

【讨论】:

以上是关于将 subView 添加到 UINavigationBar 并将其删除的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 ViewControllers 将 subView 添加到 topViewController 后不会出现

将 UIView 作为 SubView 添加到自定义类、UIView 的子类、Swift

给 UIWindow 添加 subview 有啥坏处?

如何使用 UISilder 在 SubView 中添加和删除 UIButtons?

在Subview位置选择滚动视图子视图滚动

将元素添加为子视图后,元素位置发生变化