2013-05-17 4 views
3

У меня есть контроллер навигации с кнопкой меню. Когда нажимается кнопка меню, текущий вид (в комплекте со своей навигационной панелью) должен скользить вправо, а меню должно одновременно и смежно перемещаться слева. Подробности объясняются в комментариях в коде ниже.Отключено на 20 пикселей (ось y) при добавлении subview myNavigationController.view

Это работает, за исключением одного уважения. Текущее представление (в данном случае «Беседы») при добавлении обратно в представление контейнера, которое я реализую, должно иметь свой фрейм, установленный в «y.min» = - 20, или же на 20 пикселей над его навигационной панелью. Однако, когда я устанавливаю свой y.min на -20, это сдвигает все в пределах своего вида на 20 пикселей. Поэтому, когда нажата кнопка меню, все текущее изображение внезапно перепрыгивает вверх на 20 пикселей.

Я не могу понять, почему это происходит или как это исправить. Также возможно, что есть более простой способ обойти все это, но я не знаю об этом. * (* Я не заинтересован в сторонних файлах. Я хочу научиться делать это сам.)

Вот код:

- (IBAction) showMenu:(id)sender 
{ 

// get pointer to app delegate, which contains property for menu pointer 
AppDelegate *appDelegate = getAppDelegate; 

//create container view so that current view, along with its navigation bar, can be displayed alongside menu 
UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 548.0f)]; 
[container setBackgroundColor:[UIColor blueColor]]; 

//before presenting menu, create pointer for current view, to be used in completion routine 
UIView *presenter = self.navigationController.view; 

//present menu's VC. it is necessary to present its (table) VC, not just add its view, to retain the functionality of its cells 
[self presentViewController:appDelegate.menuVC animated:NO completion: ^{ 

    //obtain a pointer to the menu VC's view 
    UIView *menuTemp = appDelegate.menuVC.view; 

    //replace menu VC's view with the empty container view 
    appDelegate.menuVC.view = container; 

    //add the menu view to the container view and set its frame off screen 
    [container addSubview:menuTemp]; 
    menuTemp.frame = CGRectMake(-260.0f, 0.0f, 260.0f, 548.0f); 

    //add the the view that was displayed when the user pressed the menu button. set its frame to fill the screen as normal 
    [appDelegate.menuVC.view addSubview:presenter]; 
    presenter.frame = CGRectMake(0.0f, 0.0f, 320.0f, 548.0f); 

    //animate the 2 subviews that were just added; "PRESENTER"'S FRAME IS THE ISSUE 
    [UIView animateWithDuration:25.3f delay:0.0f options:nil animations:^{ 
         [menuTemp setFrame:CGRectMake(0.0f, 0.0f, 260.0f, 548.0f)]; 
         [presenter setFrame:CGRectMake(260.0f, -20.0/* or 0 */f, 320.0f, 548.0f)]; 
        } completion:nil]; 

}]; 
} 

Вот иллюстрация из моих двух вариантов (нажмите для более высокого разрешения): visual

экрана 1) на первом экране показан вид перед нажатием кнопки меню ,

Следующие два экрана показывают две возможности по мере начала анимации перехода к меню.

screen 2) Это то, как выглядит переход, когда я устанавливаю presenter.frame.y.min на -20. Как вы можете видеть, кнопка в представлении вскочила на 20 пикселей.

screen 3) Это то, на что похоже переход, когда я устанавливаю presenter.frame.y.min равным 0. Как вы можете видеть, верхняя панель имеет высоту 20 пикселей. Синий цвет указывает на вид контейнера.

ответ

4

У меня была эта проблема некоторое время назад, когда я не создал дерево контроллера вида правильно. Мой 20px был вызван добавлением вида UINavigationController в качестве подзаголовка. В этом году я разговаривал с инженерами Apple в лабораториях WWDC. Они сказали, что я неправильно использовал навигационный контроллер, он должен быть конструкцией верхнего уровня, и вы не должны ставить его в другой UIViewController. Тем не менее, вы можете поместить их в контроллер контейнера, например, UITabBarController и UISplitViewController.

Ваша проблема не в том коде, который вы опубликовали, в архитектуре ваших контроллеров. Я загрузил пример приложения в GitHub, где показано, как создать приложение «Меню слайдов», например, приложения для FaceBook и StackOverflow iPhone. См. https://github.com/GayleDDS/TestNavBarOffBy20.git

Образец приложения использует раскадровку с Container Views в контроллере корневого представления для управления UINavigationController (основной вид) и UITableViewController (вид меню).

Storyboard

Main View Теперь показать меню Slide for Menu

Посмотреть сообщение фиксации cfb2efc для деталей создания. Я начал с шаблона Single View Application, и вам нужно добавить фреймворк QuartzCore.

+1

Да, я понял, что это причина, но я не знаю, почему это вызывает этот эффект или что-то не так. И мне нужно выяснить, как я могу изменить свой код для достижения желаемого результата. – mkc842

+0

@ mkc842 Я расширил ответ и создал образец приложения на GitHub для демонстрации того, что, как я думаю, вы пытаетесь сделать. Приветствия. – GayleDDS

+0

Спасибо, это действительно полезно. Я изучил ваше приложение и понял его. Тем не менее, у меня есть осложнение, поскольку я не думаю, что могу использовать встроенный segue для фактических VC, которые я хочу в более крупном контейнере, поскольку они будут различаться. Вместо этого я пытаюсь внедрить манекен, который затем представляет VC, который я хочу отображать в любой момент времени. Я уточню свой вопрос, чтобы показать, где я застреваю. – mkc842

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