Перемещение UINavigationView на мгновение - в стиле Facebook - PullRequest
2 голосов
/ 26 февраля 2012

Я собираюсь сделать слайд UITableView в стиле Facebook.

enter image description here

Я достиг этого, анимация, тень и все. Меня беспокоит то, что я делаю это совершенно неправильно, и что-то получается, что все работает не совсем правильно.

Приложение имеет rootViewController (из UIWindow), который является UINavigationController. Представление внутри UINavigationController (его корневой контроллер представления) имеет свой набор свойств leftBarButtonItem. Вот код, который запускается при нажатии кнопки.

- (void)showFeedList {
    //set the feed list as showing even before it is
    feedListShowing = YES;
    //to show the feed list, we need to instanciate one
    feedSelectionListViewController = [[FeedSelectionListViewController alloc] initWithNibName: @"FeedSelectionListViewController" bundle: nil];
    //set the frame to 200 points to the left of the screen
    feedSelectionListViewController.view.frame = CGRectOffset(feedSelectionListViewController.view.frame, -200, 20);

    NSInteger offset = feedSelectionListViewController.view.frame.size.width;

    //store a pointer to the root navigation controller, and add the list view controller's view to the navigation controller's view
    UINavigationController *navigationController = (UINavigationController *)UIApplication.sharedApplication.delegate.window.rootViewController;
    [navigationController.view addSubview: feedSelectionListViewController.view];

    //animate the navigation bar, feed selection list, and this view controller's view to the right
    [UIView animateWithDuration: LIST_SHOW_TRANSITION_TIME animations: ^{
        self.view.frame = CGRectOffset(self.view.frame, offset, 0);
        navigationController.navigationBar.frame = CGRectOffset(navigationController.navigationBar.frame, offset, 0);
        feedSelectionListViewController.view.frame = CGRectOffset(feedSelectionListViewController.view.frame, offset, 0);
    }];
}

Это действительно грязно, и не все в этом работает правильно. Во-первых, когда пользователь уходит и возвращается в приложение, UINavigationBar, кажется, сбросил его фрейм. Это также происходит, когда строка состояния входящего вызова включается и выключается. Во-вторых, любые виды внутри представления справа не перемещаются вправо так, как следовало бы. Я не знаю, почему это так.

Однако, если я заменю блок анимации на

    navigationController.view.frame = CGRectOffset(navigationController.view.frame, 200, 0);

Работает нормально. Подвиды представления, отображаемого в настоящее время навигационным контроллером, перемещаются соответствующим образом, и все находится в нужном месте, когда приложение возобновляется. Однако вид боковой панели не принимает сенсорные события, прикосновения, сделанные над боковой панелью, теперь обрабатываются AppDelegate. Я подозреваю, что это потому, что фрейм UIView имеет происхождение {-200, 0}, хотя я не могу быть уверен.

Не думаю, что я что-то понимаю. Это даже правильный способ сделать это? Я не могу придумать какие-либо другие способы сделать это. В любом случае, заранее большое спасибо за любые рекомендации или предложения.

Матф

1 Ответ

1 голос
/ 26 февраля 2012

То, что вы ищете, уже есть в моей библиотеке https://github.com/pkluz/PKRevealController

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

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

Теперь у вас есть два UIViewController, которые заботятся о вашем экране iPhone. Сначала Apple не задумывался об этом, поскольку считалось, что в любой момент времени будет присутствовать только один ViewController. - Это изменилось с iPad и UISplitViewController. И совсем недавно в iOS 5 новый API позволил добавить свои собственные ViewControllers в иерархию.

Проблема, с которой вы столкнетесь, заключается в том, что ваш FeedSelectionListViewController будет испытывать трудности при получении вызовов viewWill / Did / Appear / Disappear и / или вращения, поскольку он на самом деле не является частью цепочки.

Таким образом, мой ответ - либо проверить предоставленную мной библиотеку, либо сначала заглянуть в UIViewController Containment, потому что ваш код не совсем исправим, видя, как правило, это неправильный подход, даже если он может работать при определенных условиях.

...