2013-11-20 3 views
0
  • Нажимайте кнопки управления представлением стека, выбирая их.
  • Модальные контроллеры просмотра стеков, в то время как они разматывают их.

Я пытаюсь создать пользовательский segue для перемещения между VC в линейной (плоской) иерархии в любом направлении, без укладки в любом направлении. Похоже, что скрещивание в обоих направлениях между VC предотвращает увольнение.Двунаправленная раскадровка без штабелирования

Любые идеи?

+0

Есть ли какой-либо конкретной причине вы не хотите этого "укладки"? – Fogmeister

+0

Каждый VC имеет графику и текст. Укладка VC приводит к чрезмерному распределению памяти и сбою на сетчатых устройствах. – Mat

ответ

0

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

-(void)perform { 
    UIWindow *win =[self.sourceViewController view].window; 
    win.rootViewController = self.destinationViewController; 
} 

Лучший способ сделать это, что ручки вращения и обе ориентации, чтобы добавить вид контейнера (в МБ) к первому контроллеру (сделать его размером всего зрения), а затем подключить его пользовательский segue из встроенного контроллера, который вы получаете, когда перетаскиваете контейнер. Этот код отключает встроенный контроллер для другого контроллера.

-(void)perform { 
    UIViewController *source = self.sourceViewController; 
    UIViewController *dest = self.destinationViewController; 
    UIViewController *parent = source.parentViewController; 
    [parent addChildViewController:dest]; 
    dest.view.frame = parent.view.bounds; 

    [source willMoveToParentViewController:nil]; 
    [parent transitionFromViewController:source toViewController:dest duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{} 
          completion:^(BOOL finished) { 
           [source removeFromParentViewController]; 
           [dest didMoveToParentViewController:parent]; 
           [self constrainView:dest.view equalToView:parent.view]; 
          }]; 
} 


-(void)constrainView:(UIView *) childView equalToView:(UIView *) parentView { 
    [childView setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:parentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]; 
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:parentView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]; 
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeWidth relatedBy:0 toItem:parentView attribute:NSLayoutAttributeWidth multiplier:1 constant:0]; 
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:parentView attribute:NSLayoutAttributeHeight multiplier:1 constant:0]; 
    NSArray *constraints = @[con1,con2,con3,con4]; 
    [parentView addConstraints:constraints]; 
} 

enter image description here

+0

Спасибо. Интересно, что я все еще получаю предупреждения о памяти на некоторых VC, но теперь я могу двигаться назад и вперед через 80 + VC без сбоев на сетчатом устройстве. – Mat

+0

@Mat, я не знаю, что это такое, но если вы поместите журналы в метод dealloc, вы увидите, что каждый контроллер освобождается, когда вы выполняете segue. Таким образом, предупреждения о памяти должны быть вызваны чем-то внутри конкретного контроллера. – rdelmar

+0

Я очень благодарен за предоставленное вами простое решение. Возможно ли оживить это изменение контроллера корневого vew, я думаю, что простой кроссовер исчезает? – Mat

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