У меня есть контроллер навигации с кнопкой меню. Когда нажимается кнопка меню, текущий вид (в комплекте со своей навигационной панелью) должен скользить вправо, а меню должно одновременно и смежно перемещаться слева. Подробности объясняются в комментариях в коде ниже.Отключено на 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];
}];
}
Вот иллюстрация из моих двух вариантов (нажмите для более высокого разрешения):
экрана 1) на первом экране показан вид перед нажатием кнопки меню ,
Следующие два экрана показывают две возможности по мере начала анимации перехода к меню.
screen 2) Это то, как выглядит переход, когда я устанавливаю presenter.frame.y.min на -20. Как вы можете видеть, кнопка в представлении вскочила на 20 пикселей.
screen 3) Это то, на что похоже переход, когда я устанавливаю presenter.frame.y.min равным 0. Как вы можете видеть, верхняя панель имеет высоту 20 пикселей. Синий цвет указывает на вид контейнера.
Да, я понял, что это причина, но я не знаю, почему это вызывает этот эффект или что-то не так. И мне нужно выяснить, как я могу изменить свой код для достижения желаемого результата. – mkc842
@ mkc842 Я расширил ответ и создал образец приложения на GitHub для демонстрации того, что, как я думаю, вы пытаетесь сделать. Приветствия. – GayleDDS
Спасибо, это действительно полезно. Я изучил ваше приложение и понял его. Тем не менее, у меня есть осложнение, поскольку я не думаю, что могу использовать встроенный segue для фактических VC, которые я хочу в более крупном контейнере, поскольку они будут различаться. Вместо этого я пытаюсь внедрить манекен, который затем представляет VC, который я хочу отображать в любой момент времени. Я уточню свой вопрос, чтобы показать, где я застреваю. – mkc842