Раскадровка для разработки внеэкранного подвида

Я хочу использовать раскадровки для разработки контента для слайдера, и кажется, что простой способ разработки внеэкранного контента — это использование childViewController. Итак, я сделал это

myViewController = [[UIStoryboard storyboardWithName:@"ipad" bundle:NULL] instantiateViewControllerWithIdentifier:@"keyPadOffScreen"];

[self addChildViewController:myViewController];
[myViewController didMoveToParentViewController:self];
newView = myViewController.view;
[self.view addSubview:newView];

И это добавляет весь контроллер представления поверх моего корневого представления. Проблема в том, что я хочу, чтобы отображалось только одно из подпредставлений, а не все представление. Я могу справиться с анимацией, если знаю, как добавить корневой вид. Я пробовал это, чтобы просто добавить подвид (sliderView — это имя подвида, который я хочу) вместо всего представления, но это ничего не дало.

newView = myViewController.sliderView;
[self.view addSubview:newView];

Должен ли я использовать другую стратегию?

РЕДАКТИРОВАТЬ: это РАБОТАЕТ, но кажется глупым - установка размера представления просто равна размеру подпредставления.

  newView.frame = CGRectMake(newView.frame.origin.x, newView.frame.origin.y, newView.frame.size.width, **myViewController.sliderView.frame.size.height**);

person Tommy Nicholas    schedule 20.12.2013    source источник


Ответы (2)


Это кажется немного излишним для простого просмотра. Как только вы начинаете делать много пользовательских представлений/анимаций/переходов, их часто легче реализовать в коде, или, по крайней мере, для меня, так как я делал это таким образом в течение длительного времени.

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

Вместо того, чтобы хранить его в отдельном контроллере представления и добавлять его, когда вам нужно, чтобы он анимировался на экране, просто добавьте его в существующий контроллер представления и либо сделайте его скрытым, либо установите его альфа-канал на 0,0 в IB. Затем ваша анимация может отменить это и сделать ее видимой.

person Evan Davis    schedule 20.12.2013
comment
Я сделал все это в коде, но это не имело смысла, потому что мы все равно обычно используем раскадровки (и мы хотим продолжить, чтобы разработчики, не работающие с iPhone, могли вносить изменения в макеты), и это не имело смысла делать оба. Итак, недостатком работы с контроллером представления является замедление работы или просто слишком сложная процедура? Вы предлагаете просто справиться со всем этим на одном и том же контроллере представления, и это может сделать раскадровку грязной, BUUUT, кажется, это имеет большой смысл. Я собираюсь попробовать это. - person Tommy Nicholas; 20.12.2013

здесь вы можете использовать пользовательский переход, например:

@implementation FRPresentEnteringPopupSegue

- (void)perform
{
    FirstVC *toVC = self.destinationViewController;
    SecondNavigationController *fromVC = self.sourceViewController;
    toVC.view.frame = CGRectMake(0.0, 0.0, 300.0, 135.0);
    toVC.view.center = CGPointMake(fromVC.view.bounds.size.width/2, fromVC.view.bounds.size.height + toVC.view.bounds.size.height/2);
    [fromVC.view addSubview:toVC.view];
    [toVC viewWillAppear:YES];
    [UIView animateWithDuration:0.5
                          delay:0.0
         usingSpringWithDamping:0.7
          initialSpringVelocity:0.5
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         toVC.view.center = CGPointMake(fromVC.view.bounds.size.width/2, fromVC.view.bounds.size.height/2);
                     }completion:^(BOOL finished) {
                         [toVC viewDidAppear:YES];
                     }];
}

@end
  • сделайте свой подкласс UIStoryboardSegue
  • переопределите метод - (void)perform с помощью собственного кода внешнего вида представления
  • использовать переход обычным способом
person iiFreeman    schedule 20.12.2013
comment
Ого, совсем не то, что я искал, но чертовски интересное альтернативное решение! - person Tommy Nicholas; 20.12.2013
comment
Да, у меня отлично работает, но для увольнения вам также нужно создать собственный переход. И похоже, что segue всегда создает экземпляр нового целевого контроллера представления, вам нужно каким-то образом сохранить представленный VC в sourceViewController и получить доступ точно к тому же экземпляру, чтобы отклонить. Разобраться не сложно, удачи! - person iiFreeman; 20.12.2013