【问题标题】:How to present view over current view with transparency如何以透明度呈现当前视图的视图
【发布时间】:2012-11-29 23:04:27
【问题描述】:

我有一个UIViewController(进一步称为“UIVC”),其中包含大量代码,我需要在其上显示另一个视图(评分表),它本身也有一堆代码及其使用 IB 设计的视图,所以它也有自己的 IB 连接。所以我决定把它分成两个UIViewControllers,这很明显。一切正常,但我仍然需要呈现我的分数表,不像另一个UIViewController,而是像通常的UIView 一样使其半透明,以便用户可以通过分数表视图看到主要UIVC 中发生的事情(由于到它的透明度)。此外,我需要让 main UIVC 中的代码仍然运行。
很好的例子是 Counter Strike 游戏(以及许多其他游戏),当您在游戏中按 TAB 键时,您可以看到得分表,但它不支持游戏,您可以看到游戏中发生的事情。
我在想我可以使用presentModalViewController(如Game Center)来实现它,但我不能让它透明,所以我在后台看不到UIVC。就像我说的分数表有自己的代码和许多 IBOutlets 一样,我想将它与主要的UIVC 代码分开。
那么如何实现我的需求呢? (分离出分数表的代码,使其透明并且不要中断执行 main UIVC's 代码)。我的应用程序不是可可,它只是普通的应用程序
我所做的尝试:尝试制作分数表的UIView 背景[UIColor clearColor],同时将其呈现为modalVC。没有运气。此外,我尝试取消选中 UIView's opaque 属性 - 不走运。尝试将UIView's alpha 设置为 0.5 - 仍然没有运气。还试图让 self.navigationController.view.hidden=YES,没有运气。看不到主要的 UIVC“图片”。此外,我尝试在分数表中将所有子视图 alpha 设置为 0.2,但它仍然显示白色非透明屏幕。

【问题讨论】:

    标签: iphone ios ipad uiview uiviewcontroller


    【解决方案1】:

    我发现的最佳选择是通过扩展 UIView(不是 UIViewController)并在 IB 中设计其视图来创建自定义类。然后我在 IB 中将 FileOwner 设置为我的类名,设置所有 IB 连接,编写(实际上是复制粘贴 :))显示分数所需的方法。
    棘手的部分是使用 initWithCoder/awakefromNib 方法,尤其是 initWithCoder,我需要在其中加载我的 nib,主要是通过之前设置的 IB 连接添加其视图。这不仅是所有需要的子视图都必须是 IB 连接的,而且(父/根)视图本身也是如此。

        - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder]))
        {
            [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
    
            [self addSubview:vwTopLevelView]; //vwTopLevelView is the IB link to parent view
    // without adding vwTopLevelView it always loads empty view so you just wont c it
    // but all IB links will be valid, image view will have their images loaded etc
        }
        return self;
    }
    

    然后我只是将新的分数表视图添加到主 UIVC,检查其属性为隐藏并将类从 UIView 设置为我的类。现在分数表与主 UIVC 一起加载,但它是隐藏的,我只需要调用 1 个方法来填充数据,然后将其设置为 hidden=NO 并且瞧……而且 view.background 是 clearColor 所以我得到了透明度.
    这样,我将分数表的代码和 IB 出口分离到另一个类(UIView ext),它的视图足够透明,因为它不是 UIViewController,所以我的主 UIVC 的代码不存在。

    【讨论】:

      【解决方案2】:

      只是为了满足您的要求,只需在viewDidLoad: 中设置如下视图的Alphs

      [self.view setAlpha:0.5];// set alpha with your requirement
      

      当你想显示视图时,从你的 UIVC 视图中调用这个方法

      如果您将此波纹管方法粘贴到 AppDelegate 并使用 AppDelegate 对象调用,这很好

      AppDelegate.h 中创建yourViewController 的对象,如下所示..

      yourViewController *yourViewController;
      

      并在下面的方法中使用..

      -(void)addMakeOfferView{
      
         yourViewController=[[yourViewController alloc]initWithNibName:@"yourViewController" bundle:nil];
          objMakeOfferView.view.transform = CGAffineTransformMakeScale(1.3, 1.3);
          objMakeOfferView.view.alpha = 0;
          [UIView animateWithDuration:.35 animations:^{
              objMakeOfferView.view.alpha = 0.94;
              objMakeOfferView.view.transform = CGAffineTransformMakeScale(1, 1);
          }];
          objMakeOfferView.view.frame=CGRectMake(0, 0, 320, 480);
          [self.window addSubview:objMakeOfferView.view];
      }
      

      然后像下面这样从你的UIVC 班级打电话..

      AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
      [appDelegate addMakeOfferView];
      

      【讨论】:

      • 我必须升级我的知识才能理解这种技术:) 真的为什么要在这里涉及 appDelegate?还是谢谢
      • @Stan wel-come dude,但我在需要显示带有背景视图转换的小视图时使用此逻辑,因此我开发此代码并按照我的要求工作.. :)
      【解决方案3】:

      即使你用半透明的方式呈现第二个视图控制器,你也看不到第二个视图控制器之外的第一个视图控制器。呈现的模型视图控制器在 IOS 中应该是不透明的。

      我有一个带有透明背景边距的小 tableview 的情况。我最终创建了一个 UIView 类来保存 tableview。我在这个 UIview 中编写了两个方法,即

      -(void)presentTransparentViewin(UIView*)view;
      
      -(void)removeViewwithAnimation;
      

      在 Uiview 中实现 UITableview 的委托方法听起来像一个糟糕的编程实践,效果很好。

      【讨论】:

        【解决方案4】:

        看看这是否有效,它显示透明的视图控制器但是相同的概念。 Here

        但是我不完全确定您的第一个视图控制器是否会保持可见。

        【讨论】:

        • 恐怕提供的代码片段只是将 UIViewController 的视图添加到主 UIVC 但执行呈现 UIVC 代码呢?
        • 此外,IB 连接情况如何?
        • 您是否尝试过使用 1 个视图控制器,并在其中放置两个视图,并在不使用时将其中 1 个视图设置为隐藏。
        • 这正是我最终所做的。 c我自己的答案:)
        猜你喜欢
        • 2015-04-06
        • 1970-01-01
        • 2011-04-07
        • 2014-12-12
        • 1970-01-01
        • 2018-12-07
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        相关资源
        最近更新 更多