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

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

问题是,当我尝试复制这个function时 – 我只是有一个小的UIView从顶部动画 – 我在我的视图后面得到一个黑色背景。 我无法弄清楚如何使背景透明,以便我的视图后面的东西仍然可见。 有谁知道如何做到这一点?

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

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

码:

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

运行此操作时,视图将从顶部向下滑动。 然而,您看到的只是黑色背景,而不是看到调用应用程序的UI。

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

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

从我从Apple文档中了解到的

在iOS中,一个Action扩展:

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

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

我确信共享扩展可以动画(我自己完成)你想要它并拥有透明背景。 这就是为什么Instapaper的Share扩展工作得很好的原因。

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

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

你面临两个问题:

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

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

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

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

并且想要更改self.view.frame,您将设置self.view背景颜色以清除,并添加子视图并将其用作背景视图:

 //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。 将呈现的视图控制器添加为子视图控制器。 这样生命周期保持不变,但你可以将我的视图添加为子视图,并更改我的框架。

//呈现视图控制器:

 -(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传递给它,并且“装饰器”将视图添加为子视图,并处理动画。 无需为此方案提供示例。