iPhone толкает контроллер просмотра влево

У меня есть приложение с центральным обзором и двумя видами с каждой стороны. Я хочу иметь две кнопки панели навигации, левую и правую, которые подталкивают новый контроллер навигации к представлению слева или справа.

Когда вы меняете представления, нажимая новое представление с помощью метода pushviewController: NavigationController, представление появляется сдвигающимся справа. как мне изменить это так, чтобы оно вставлялось слева?


person Aran Mulholland    schedule 08.07.2009    source источник


Ответы (6)


Вместо использования контроллера навигации я бы просто переместил представление.

CGRect inFrame = [currentView frame];
CGRect outFrame = firstFrame;
outFrame.origin.x -= inFrame.size.width;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];

[newView setFrame:inFrame];
currentView setFrame:outFrame];

[UIView commitAnimations];
person Reed Olsen    schedule 08.07.2009
comment
так что загрузите контроллер представления обычным образом, затем получите дескриптор представления, а затем переместите его? мне также придется вручную изменить кнопки панели навигации - person Aran Mulholland; 08.07.2009
comment
Правильно. Загрузите контроллер представления как обычно, переместите currentView с экрана и переместите newView внутрь. - person Reed Olsen; 08.07.2009
comment
это работает (вы должны заменить - = на + =), чтобы скользить слева. однако это означает ручное нажатие всех кнопок назад и вперед для каждого представления. какая боль. - person Aran Mulholland; 08.07.2009
comment
есть идеи о том, как стилизовать кнопки, чтобы они были острым типом, обычно используемым в навигации? (кнопка назад) - person Aran Mulholland; 08.07.2009
comment
Я не нашел никакого способа получить заостренные кнопки контроллера навигации, кроме как с помощью контроллера навигации или ваших собственных изображений. - person aiham; 04.03.2011

Я изменил направление анимации, когда мы нажимаем viewcontroller. здесь вы можете изменить тип анимации [animation setSubtype: kCATransitionFromRight];

 ViewController *elementController = [[ViewController alloc] init];

// set the element for the controller
ViewController.element = element;


// push the element view controller onto the navigation stack to display it

CATransition *animation = [CATransition animation];
[[self navigationController] pushViewController:elementController animated:NO];
[animation setDuration:0.45];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromRight];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]];
[[elementController.view layer] addAnimation:animation forKey:@"SwitchToView1"];

[elementController release];
person milanjansari    schedule 15.03.2011
comment
Он делает предыдущий контроллер представления черным, что плохо. - person Chanchal Raj; 01.10.2015

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

Если ваш рабочий процесс не слишком сложен, вы можете сохранить ссылку на предыдущий контроллер представления в текущем контроллере представления. в зависимости от того, что вы делаете в текущем представлении (например, выбираете ячейку табличного представления), вы можете изменить любые данные, которые вам нужны в предыдущем контроллере представления, а затем вызвать

[self.navigationController popViewController];

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

person Kevlar    schedule 08.07.2009

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

- (IBAction)slideMenuView 
{
  CGRect inFrame = [self.view frame];
  CGRect outFrame = self.view.frame;

  if (self.viewisHidden) {
    outFrame.origin.x += inFrame.size.width-50;
    self.viewisHidden = NO;
  } else {
    outFrame.origin.x -= inFrame.size.width-50;
    self.viewisHidden = YES;
  }
  [UIView beginAnimations:nil context:nil];
  [UIView setAnimationDuration:0.5];
  [self.menuView setFrame:inFrame];
  [self.view setFrame:outFrame];
  [UIView commitAnimations];
}
person MJB    schedule 05.05.2012

Чтобы получить кнопку «заостренного» типа, вам нужно использовать другой метод.

В вашем AppDelegate:

UITableViewController *first = [[RootViewController alloc] initWithStyle:UITableViewStylePlain];
UITableViewController *second = [[SomeOtherViewController alloc] initWithStyle:UITableViewStylePlain];

NSArray *stack = [NSArray arrayWithObjects: first, second, nil];

UINavigationController *nav = [[UINavigationController alloc] init];
[nav setViewControllers:stack animated:NO];
person carnz    schedule 10.07.2009

Вы можете унаследовать RTLNavigationController: UINavigationController и перезаписать эти функции.

 - (void) pushViewController:(UIViewController *)viewController animated:(BOOL)animated
 {
     DummyViewController*dvc = [[DummyViewController alloc] init];
     [super pushViewController:viewController animated:NO];
     [super pushViewController:dvc animated:NO];
     [dvc release];
     [super popViewControllerAnimated:YES];
}

и

- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
 UIViewController *firstViewController = [super popViewControllerAnimated:NO];
 UIViewController *viewController = [super popViewControllerAnimated:NO];
 [super pushViewController:viewController animated:animated];
 return firstViewController;
} 

И в делегате приложения:

navCon = [[RTLNavigationController alloc] init];

rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
rootViewController.contextDelegate = self;

DummyViewController *dvc = [[DummyViewController alloc]init];
[navCon pushViewController:dvc animated:NO];
[dvc release];

[navCon pushViewController:rootViewController animated:NO];
[self.window addSubview:navCon.view];

Нажимать будет слева направо, а выскакивать справа налево.

person Bojan Bozovic    schedule 21.11.2011