Вопрос

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

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

Это было полезно?

Решение

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

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];

Другие советы

Я изменил направление анимации, когда мы нажимаем viewcontroller.вы можете изменить тип анимации здесь [анимация 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];

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

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

[self.navigationController popViewController];

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

на что сказал Рид Олсен:вам нужно подключить только одну кнопку, которая запускает слайд, к тому же методу и добавить 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];
}

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

В вашем 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];

Вы можете наследовать 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];

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top