2015-08-01 2 views
1

Я прочитал много других потоков в этом и документах Apple, но пока не нашел решения по моей конкретной проблеме.UINavigationBar с UISegmentedControl частично покрывает childViews

Мое приложение использует UITabBarController как rootViewController, и в одной из вкладок у меня есть в navigationBar в UISegmentedControl для переключения между тремя ребенком UITableViewController с.

(В реальном приложении два дочерних элемента управления являются обычным UIViewController, я просто использую три UITableViewController s для примера приложения).

Настройка сегментации и переключения все работает нормально. Неправильно то, что отображается только первый UITableViewController. Для второго и третьего часть первой ячейки скрыта под номером navigationBar. Когда я нажимаю все три, первый из них все еще в порядке.

Я сделал небольшой пример приложения, чтобы показать, что происходит, используя очень яркие цвета для демонстрационных целей: https://www.dropbox.com/s/7pfutvn5jba6rva/SegmentedControlVC.zip?dl=0

Здесь также некоторый код (я не использую раскадровки):

// AppDelegate.m 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    FirstViewController *fvc = [[FirstViewController alloc] init]; 
    UINavigationController *firstNavigationController = [[UINavigationController alloc] initWithRootViewController: fvc]; 

    SecondViewController *svc = [[SecondViewController alloc] init]; 
    UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController: svc]; 

    // Initialize tab bar controller, add tabs controllers 
    UITabBarController *tabBarController = [[UITabBarController alloc] init]; 
    tabBarController.viewControllers = @[firstNavigationController, secondNavigationController]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.rootViewController = tabBarController; 
    [self.window makeKeyAndVisible]; 

    return YES; 
} 


// FirstViewController.m 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.title = @"One"; 
    self.view.backgroundColor = [UIColor orangeColor]; 

    UITableViewController *vc1 = [[UITableViewController alloc] init]; 
    UITableViewController *vc2 = [[UITableViewController alloc] init]; 
    UITableViewController *vc3 = [[UITableViewController alloc] init]; 

    vc1.view.backgroundColor = [UIColor redColor]; 
    vc2.view.backgroundColor = [UIColor blueColor]; 
    vc3.view.backgroundColor = [UIColor greenColor]; 

    self.viewControllers = @[vc1, vc2, vc3]; 
    self.segmentTitles = @[@"Red", @"Blue", @"Green"]; 

    self.segmentedControl = [[UISegmentedControl alloc] initWithItems: self.segmentTitles]; 
    [self.segmentedControl addTarget: self 
           action: @selector(segmentClicked:) 
        forControlEvents: UIControlEventValueChanged]; 

    self.navigationItem.titleView = self.segmentedControl; 

    self.segmentedControl.selectedSegmentIndex = 0; 

// set the first child vc: 
    UIViewController *vc = self.viewControllers[0]; 

    [self addChildViewController: vc]; 
    vc.view.frame = self.view.bounds; 
    [self.view addSubview: vc.view]; 
    self.currentVC = vc; 
} 

- (void)segmentClicked:(id)sender 
{ 
    if (sender == self.segmentedControl) 
    { 
     NSUInteger index = self.segmentedControl.selectedSegmentIndex; 
     [self loadViewController: self.viewControllers[index]]; 
    } 
} 

- (void)loadViewController:(UIViewController *)vc 
{ 
    [self addChildViewController: vc]; 

    [self transitionFromViewController: self.currentVC 
         toViewController: vc 
           duration: 1.0 
           options: UIViewAnimationOptionTransitionFlipFromBottom 
          animations: ^{ 
           [self.currentVC.view removeFromSuperview]; 
           vc.view.frame = self.view.bounds; 
           [self.view addSubview: vc.view]; 
          } completion: ^(BOOL finished) { 
           [vc didMoveToParentViewController: self]; 
           [self.currentVC removeFromParentViewController]; 
           self.currentVC = vc; 
          } 
    ]; 
} 

Так что, очевидно, мой вопрос: почему это происходит, и что я могу сделать, чтобы исправить это?

Редактировать: добавить скриншоты.

First VC Second VC Third VC

EDIT: На основании ответа ниже я изменил код в блоке анимации:

[self.currentVC.view removeFromSuperview]; 

if ([vc.view isKindOfClass: [UIScrollView class]]) 
{ 
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0); 
    [UIView performWithoutAnimation: ^{ 
     vc.view.frame = self.view.bounds; 
     ((UIScrollView *)vc.view).contentInset = edgeInsets; 
     ((UIScrollView *)vc.view).scrollIndicatorInsets = edgeInsets; 
    }]; 
    } 
    else 
    { 
     vc.view.frame = self.view.bounds; 
    } 

    [self.view addSubview: vc.view]; 

Теперь она работает. Я собираюсь попробовать это с обычным UIViewController.

+0

Опубликовать скриншоты из этой проблемы. –

+0

Я добавил скриншоты, вы можете видеть, что разделительные линии второй и третьей таблицы выше. – Koen

+0

См. Ответ. ':-)' –

ответ

1

Проблема в том, что вы не устанавливаете правильную вставку для каждого вида таблицы. Система пытается сделать это за вас, но я думаю, что ваша установка слишком сложна для нее, и она делает это только для первой таблицы, загруженной в viewDidLoad. В вашем методе loadViewController: при замене отображаемого в данный момент времени убедитесь, что значения contentInset и scrollIndicatorInsets соответствуют значениям предыдущего вида. Я думаю, что системе удастся установить правильные вставки позже, на случай, если вы повернете на пейзаж. Попробуй. Если это не так, вам нужно будет сделать это самостоятельно в viewDidLayoutSubviews.

+0

Настройка 'contentInset' и' scrollIndicatorInsets' не работала. Я буду смотреть в 'viewDidLayoutSubviews'. Но это потребует подкласса 'UITableViewController', правильно? – Koen

+0

Нет, я имел в виду в контроллере контейнера. –

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