Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有透明背景的iOS操作应用程序扩展?_Ios_Objective C_Uikit_Ios App Extension - Fatal编程技术网

具有透明背景的iOS操作应用程序扩展?

具有透明背景的iOS操作应用程序扩展?,ios,objective-c,uikit,ios-app-extension,Ios,Objective C,Uikit,Ios App Extension,我正在尝试用最少的用户界面制作一个iOS操作应用程序扩展。基本上,它只会显示一个进度指标,直到行动完成。我只是希望能够设置视图的动画,使其从顶部向下滑动,然后在操作完成后向上滑动。如果有人熟悉Instapaper的共享扩展,那么这就是我想要的基本UI 问题是,当我尝试复制此功能时——我只有一个小的UIView,它从顶部向下动画化——我的视图后面有一个黑色背景。我不知道如何使背景透明,以便视图后面的内容仍然可见。有人知道怎么做吗 作为起点,我只是使用由Xcode创建的默认操作扩展模板 在Xcode

我正在尝试用最少的用户界面制作一个iOS操作应用程序扩展。基本上,它只会显示一个进度指标,直到行动完成。我只是希望能够设置视图的动画,使其从顶部向下滑动,然后在操作完成后向上滑动。如果有人熟悉Instapaper的共享扩展,那么这就是我想要的基本UI

问题是,当我尝试复制此功能时——我只有一个小的
UIView
,它从顶部向下动画化——我的视图后面有一个黑色背景。我不知道如何使背景透明,以便视图后面的内容仍然可见。有人知道怎么做吗

作为起点,我只是使用由Xcode创建的默认操作扩展模板

  • 在Xcode中创建新的iOS应用程序项目
  • 添加新目标->操作扩展
  • ActionViewController.m
    文件中,添加
    viewwillbeen
    方法来设置视图动画(使用1秒动画,以便可以轻松看到黑色背景):
  • 代码:

    运行此操作时,视图将设置动画,从顶部向下滑动。但是,您看到的不是呼叫应用程序的UI,而是黑色背景

    我尝试了很多方法-更改
    modalPresentationStyle
    (似乎什么都不做),将整个视图设置为隐藏(这只会使整个屏幕变黑),等等


    作为参考,这是使用iOS 9.3.2和Xcode 7.3.1。

    在视图尚未出现时启动动画是错误的。请您在ViewDidDisplay中尝试相同的代码。 此外,设置主视图控制器视图的动画将使底层可见,因此您必须在视图控制器主视图的顶部使用另一个视图,如下所示:

    UIView *progressView = [[UIView alloc] init];
    progressView.frame = self.view.bounds;
    progressView.backgroundColor = [UIColor redColor];
    [self.view addSubView:progressView];
    

    据我所知

    在iOS中,操作扩展:

    • 帮助用户以不同的方式查看当前文档
    • 始终显示在操作表或全屏模式视图中
    • 仅当主机应用明确提供时才接收选定内容
    事实上,在iPhone上,动作扩展总是出现在全屏视图中,这可能意味着没有透明的背景

    我确信,共享扩展可以按照您的要求设置动画(我自己也做过),并且有一个透明的背景。这就是Instapaper的共享扩展运行良好的原因。

    您面临两个问题:

    1。显示视图控制器时,默认行为是控制器为全屏上下文。这就是你看到黑屏的原因

    2。当控制器全屏显示时,您正试图更改self.view.frame

    然而,有一种方法可以实现您正在寻找的这种行为,方法有三种:

    A。将“modalPresentationStyle”指定为“UIModalPresentationOverCurrentContext”,并将呈现控制器设置为“DefinePresentationContext”。 这样,当您呈现控制器时,呈现控制器将位于呈现控制器的后面

    您将设置self.view背景色以清除,并添加子视图并将其用作背景视图,而不是更改self.view.frame

    //Presenting view controller:
    
    -(void) presentPopUpViewController {
        self.definesPresentationContext = YES; //self is presenting view controller
        self.presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self presentViewController:self.presentedVC animated:NO completion:nil];
    }
    
    //Presented view controller:
    
    -(void) viewDidLoad {
        [super viewDidLoad];
    
        CGRect currFrame = self.view.frame;
        CGRect newFrame = currFrame;
        newFrame.origin.y -= newFrame.size.height;
    
        self.myBackroundView = [[UIView alloc] init];
        self.myBackroundView.backgroundColor = [UIColor yellowColor];
        self.myBackroundView.frame = newFrame;
        [self.view addSubview:self.myBackroundView];
    
        self.view.backgroundColor = [UIColor clearColor];
    }
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    
        [UIView animateWithDuration:5.0 animations:^{
            self.myBackroundView.frame = self.view.frame;
        }];
    }
    
    B。将显示的视图控制器添加为子视图控制器。这样,生命周期保持不变,但您可以将I'ts视图添加为子视图,并更改I'ts框架

    //显示视图控制器:

    -(void) presentChildViewController {
        [self addChildViewController:self.presentedVC];
        [self.view addSubview:self.presentedVC.view];
        [self.presentedVC didMoveToParentViewController:self];
    }
    
    //Presented view controller:
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        CGRect currFrame = self.view.frame;
        CGRect newFrame = currFrame;
    
        newFrame.origin.y -= newFrame.size.height;
        self.view.frame = newFrame;
    
        [UIView animateWithDuration:1.0 animations:^{
            self.view.frame = currFrame;
        }];
    }
    

    C。不要使用UIViewController,请使用UIView。使用一个“Decorator”对象,将视图控制器传递给它,然后“Decorator”将视图添加为子视图,并处理动画。此场景无需示例。

    您尝试过情节提要吗?@RomOne,尝试过什么?抱歉,我的意思是您尝试过完全不使用动画,并且使用情节提要将子视图添加到扩展控制器吗?有动画还是没有动画都没有区别。我主要观点背后的任何东西都是黑色的。如果我将主视图的背景设置为透明,则结果为黑色。我仍然不确定您关于使用故事板添加子视图的意思。如果您使用上面的说明创建应用程序扩展,它将创建一个故事板。将子视图添加到情节提要并没有什么不同。到目前为止,我所做的任何尝试都不允许调用应用程序的UI显示在我主视图的UI后面。任何“隐藏”在我的主视图后面的东西都会呈现黑色。没有什么区别。和以前一样。很抱歉,我没有注意到,您正在为视图控制器的主视图设置动画。您应该在此基础上创建另一个视图,如下所示:UIView*progressView=[[UIView alloc]init];progressView.frame=self.view.bounds;progressView.backgroundColor=[UIColor redColor];[self.view addSubView:progressView];然后你可以执行这些动画,我所能做的就是在我的视图控制器的视图(主视图)上放置另一个视图。因此,新视图将显示在主视图的顶部。但是,我仍然无法显示主视图背后的内容,即启动我的扩展的应用程序的内容。如果我使主视图透明或隐藏,那么它显示的只是一个黑色背景,上面有一个新视图。一旦控制器出现,底层的层次结构将被覆盖。有3种选择:1。您可能希望使用容器视图来移动最顶部的控制器。主控制器仍将可见。2.在主控制器视图的顶部插入最顶部的控制器视图,而不使用故事板。3.只需使用主控制器顶部的视图,而不是添加pro
    -(void) presentChildViewController {
        [self addChildViewController:self.presentedVC];
        [self.view addSubview:self.presentedVC.view];
        [self.presentedVC didMoveToParentViewController:self];
    }
    
    //Presented view controller:
    
    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        CGRect currFrame = self.view.frame;
        CGRect newFrame = currFrame;
    
        newFrame.origin.y -= newFrame.size.height;
        self.view.frame = newFrame;
    
        [UIView animateWithDuration:1.0 animations:^{
            self.view.frame = currFrame;
        }];
    }