具有透明背景的iOS Action app扩展程序?

时间:2016-08-01 21:50:50

标签: ios objective-c uikit ios-app-extension

我正在尝试使用最少的UI制作iOS动作应用扩展程序。基本上它只会在行动完成之前显示进度指示器。我只是希望能够为视图设置动画,使其从顶部和顶部向下滑动。然后在动作完成后向上滑动。如果有人熟悉Instapaper的Share扩展,那就是我正在寻找的那种基本用户界面。

问题在于,当我尝试复制此功能时 - 我只有一个小的UIView从顶部开始动画 - 我的视图背后有黑色背景。我无法弄清楚如何使背景透明,以便我的视图背后的东西仍然可见。有谁知道怎么做?

作为一个起点,我只是使用由Xcode创建的默认Action Extension模板......

  1. 在Xcode中创建一个新的iOS应用程序项目。
  2. 添加新目标 - >行动延伸。
  3. ActionViewController.m文件中添加viewWillAppear方法为视图设置动画(使用1秒动画,以便很容易看到黑色背景):
  4. 代码:

    - (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;
        }];
    }
    

    运行此视图时,视图会从顶部向下滑动。然而,你看到的不是看到调用应用程序的用户界面,而是黑色背景。

    我尝试过很多东西 - 更改modalPresentationStyle(似乎没有做任何事情),将整个视图设置为隐藏(这只会使整个屏幕变黑)等等。

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

3 个答案:

答案 0 :(得分:1)

据我所知Apple docs

  

在iOS中,一个Action扩展名:

     
      
  • 帮助用户以不同的方式查看当前文档
  •   
  • 始终显示在操作表或全屏模式视图中
  •   
  • 仅在主机应用程序明确提供的情况下接收所选内容
  •   

Action扩展程序总是出现在iPhone上的全屏视图中这一事实可能意味着无法拥有透明背景。

我确信共享扩展程序可以动画(我自己已经完成了)你想要它并拥有透明背景。这就是为什么Instapaper的分享扩展能够很好地运作的原因。

答案 1 :(得分:1)

您面临两个问题:

<强> 1 即可。当您呈现视图控制器时,默认行为是控制器是全屏上下文。这就是你看到黑屏的原因。

<强> 2 即可。当控制器全屏显示时,您正尝试更改 self.view.frame

然而,有一种方法可以通过以下三种方式之一来实现您正在寻找的这种行为:

<强> A 即可。将“ modalPresentationStyle ”指定为“ UIModalPresentationOverCurrentContext ”,并将呈现控制器设置为“ definesPresentationContext ”。 这样,当您呈现控制器时,呈现控制器将位于所呈现的控制器后面。

如果想要更改 self.view.frame ,您需要设置 self.view 背景颜色以进行清除,并添加子视图并将其用作背景视图:< / p>

//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;
    }];
}

<强>乙即可。将呈现的视图控制器添加为子视图控制器。这样生命周期保持不变,但你可以将我的视图添加为子视图,并改变我的框架。

//呈现视图控制器:

-(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。使用“装饰器”对象,您将希望视图显示的ViewController传递给它,并且“装饰器”将视图添加为子视图,并处理动画。不需要这个场景的例子。

答案 2 :(得分:0)

当您的视图尚未显示时,启动动画是错误的。请你在viewDidAppear中尝试相同的代码。 同时动画主视图控制器的视图将使底层图层可见,因此您必须在视图控制器的主视图之上使用另一个视图,如下所示:

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