2016-08-01 2 views
1

Я пытаюсь сделать расширение приложения для iOS Action с минимальным интерфейсом. В принципе, он просто покажет индикатор прогресса, пока действие не завершится. Я просто хочу иметь возможность анимировать представление так, чтобы оно скользило вниз от вершины &, затем сползает назад, когда действие завершено. Если кто-то знаком с расширением Share Instapaper, то это тот самый базовый пользовательский интерфейс, который я ищу.Расширение приложения для приложения iOS с прозрачным фоном?

Проблема в том, что когда я пытаюсь дублировать эту функцию, у меня просто есть небольшой UIView, который анимируется сверху. Я получаю черный фон за моим видом. Я не могу понять, как сделать этот фон прозрачным, чтобы материал, расположенный за моим видом, все еще виден. Кто-нибудь знает как это сделать?

В качестве отправной точки я только с помощью шаблона по умолчанию расширения действий, которая создается с помощью Xcode ...

  1. Создание нового приложения проекта IOS в Xcode.
  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; 
    }]; 
} 

Когда запускается вид анимированный, сползающий сверху. Однако вместо того, чтобы видеть пользовательский интерфейс вызывающего приложения, все, что вы видите, это черный фон.

Я попробовал несколько вещей - изменение modalPresentationStyle (кажется, не делать ничего), установив весь вид на скрытые (это только делает весь черный экран) и т.д.

Для справки это использует iOS 9.3.2 и Xcode 7.3.1.

+0

Вы пробовали раскадровку? – RomOne

+0

@RomOne, попробовал что именно? – Cutterpillow

+0

Извините, я имею в виду, что вы пробовали без анимации вообще, и используя раскадровку, чтобы добавить свои подпрограммы к контроллеру расширения? – RomOne

ответ

0

Неправильно запускать анимацию, когда ваш вид еще не появился. Можете ли вы попробовать один и тот же код в viewDidAppear. анимировать также вид главного контроллера представления сделает нижележащие слои видимы, так что вы должны использовать другой вид сверху основного вида Вид контроллера, например:

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

Не имеет значения. Такое же поведение, как и раньше. – Cutterpillow

+0

Извините, не заметили, что вы анимируете основной вид контроллера вида.Вы должны создать другой вид, например: UIView * progressView = [[UIView alloc] init]; progressView.frame = self.view.bounds; progressView.backgroundColor = [UIColor redColor]; [self.view addSubView: progressView]; , а затем вы можете выполнять эти анимации. – user1232690

+0

Все это позволяет мне сделать еще один вид поверх представления моего контроллера представления (основной вид). Таким образом, новый вид появится поверх основного представления. Тем не менее, я все еще не могу показать, что находится за основным видом - т. Е. Содержание приложения, которое запустило мое расширение. Если я сделаю основной вид прозрачным или скрытым, то все, что он показывает, - это черный фон с новым видом поверх этого. – Cutterpillow

1

Из того, что я понял из Apple docs

в прошивке, расширение Действия:

  • помогает пользователям просматривать текущий документ по другим
  • всегда появляется в действие листа или полноэкранного зрения модальной
  • получает выбранный контент, только если явно предоставленный хост-приложение

Тот факт, что расширение действий всегда появляются в полноэкранном режиме просмотр на iPhone может означать, что нет прозрачного фона.

Я уверен, что расширение Share можно анимировать (я сделал это сам), как вы этого хотите, и иметь прозрачный фон. Именно поэтому Instapaper's Share расширение работает красиво.

+0

Я думаю, что вы здесь. Изменение расширения из расширения Action на расширение Share поддерживает пользовательский интерфейс вызывающего приложения, видимый под моим пользовательским интерфейсом. Я думал, что листы действий не должны быть полноэкранными? Возможно, это неправильно. – Cutterpillow

+0

Для меня лист действий - это стиль .ActionSheet для UIAlertController. Возможно, я ошибаюсь, однако все указывает на то, что нет никакого способа иметь пользовательский вид с UI под ним. Я просмотрел «топ-11 расширений Action для iOS» (http://www.imore.com/amazing-action-extensions-iphone), и все они были полноэкранными. –

+0

Похоже, это правильный ответ. Использование расширения Share позволяет пользовательскому интерфейсу вызывающего приложения оставаться видимым. Выполнение ничего, кроме изменения типа расширения из Share ('com.apple.share-services') в Action (' com.apple.ui-services'), приводит к черному фону. – Cutterpillow

0

Вы столкнулись с двумя проблемами:

. Когда вы представляете контроллер вида, поведение по умолчанию - это полноэкранный контекст. Именно по этой причине вы видите черный экран.

. Вы пытаетесь изменить self.view.frame, когда контроллер представлен на весь экран.

Однако есть способ добиться такого поведения, которую вы ищете, в одном из трех способов:

. Укажите «modalPresentationStyle» на «UIModalPresentationOverCurrentContext» и установите для контроллера представления значение «definePresentationContext». Таким образом, когда вы представляете контроллер, контроллер представления будет за представленным контроллером.

И InstEd изменения 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 , Добавьте представленный контроллер представлений в качестве контроллера детского просмотра. таким образом, жизненный цикл остается прежним, но вы можете добавить I'ts view в качестве подзапроса и изменить кадр.

// Представление зрения контроллера:

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

С. Не используйте UIViewController, используйте UIView. Используйте объект «Decorator», который вы передадите ему ViewController, на который вы хотите отключить представление, и «Декоратор» добавит представление в качестве подсмотра и обработает анимацию. Нет необходимости в примере для этого сценария.

+0

Я пробовал ** **, но это не работает. Для начала в качестве расширения приложения я не контролирую контроллер. Я попытался получить доступ к 'parentViewController' и' presentingViewController', чтобы я мог включить 'definePresentationContext', но это ничего не делает. И изменение цвета фона для очистки не позволяет показывать вызывающее приложение, оно просто приводит к черному. – Cutterpillow

+0

** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Точкой входа для расширения приложения является то, что вы предоставляете контроллер просмотра. Как и когда этот диспетчер представлений представлен, насколько я могу судить, это невозможно. – Cutterpillow

+0

@Cutterpillow Я не понял, что это первый контроллер представления, который представлен при расширении. То, что вы ищете, невозможно. Сожалею. – MCMatan

 Смежные вопросы

  • Нет связанных вопросов^_^