2015-07-28 3 views
7

В моем приложении iOS (разработанном с использованием Xamarin) Я использую настраиваемый контроллер представления контейнера для переключения между различными контроллерами детского представления (которые все содержат UITableView), связанными с сегментами UISegmentedControl ,ContentInset установлен неправильно при отклонении контроллера представления в iOS

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

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

Я пытался понять, какой метод неявно изменяет содержимое вставки, но мне не повезло. Итак, какой метод может быть виновником такого поведения?

Я попытался с настройкой automaticallyAdjustsScrollViewInsets как на истинные, так и на ложные, но результат тот же.

UPDATE: Похоже, что этот вопрос представлен только в прошивке 8, но не в прошивке 7

+0

У вас есть минимальный пример? Используете ли вы 'UITableViewController' как базовый класс? –

+0

Вероятно, вы измените 'contentInset' на менее оптимальное время, возможно, более одного раза. Не принимайте этот комментарий как ответ, потому что я рекомендую использовать нижеприведенное решение, которое не возится с собственными представлениями iOS. – SwiftArchitect

ответ

4

Synposis

Избавьтесь от contentInset. Вставьте блок UINavigationController между контроллером и контроллером таблицы .

Как это выглядит в раскадровки

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

enter image description here

Подключайте Контроль Сегментированного

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

Это весь класс. 30 строк кода.

class SegmentedControlViewController: UIViewController { 
    var segmentViewController:UIViewController? = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let vc = self.storyboard!.instantiateViewControllerWithIdentifier("nav0") as? UIViewController 
     self.addChildViewController(vc!) 
     self.view.addSubview(vc!.view) 
     self.segmentViewController = vc 
    } 

    @IBAction func segmentedControlValueChanged(sender: AnyObject) { 
     if let segmentedControl = sender as? UISegmentedControl { 
      let identifier = "nav\(segmentedControl.selectedSegmentIndex)" 
      let vc = self.storyboard!.instantiateViewControllerWithIdentifier(identifier) as? UIViewController 

      self.addChildViewController(vc!) 
      self.transitionFromViewController(self.segmentViewController!, toViewController: vc!, duration: 0, options: .TransitionNone, animations: {() -> Void in 
       self.segmentViewController!.view.removeFromSuperview() 
       //vc!.view.frame = self.view.bounds 
       self.view.addSubview(vc!.view) 
      }, completion: { (Bool) -> Void in 
       vc!.didMoveToParentViewController(self) 
       self.segmentViewController!.removeFromParentViewController() 
       self.segmentViewController = vc 
      }) 
     } 
    } 
} 

Совместимость

Приведенный выше код не показывает, как протолкнуть контроллер представления с помощью SEGUE Present Modally или `Show (например принудительную), поскольку он выходит за рамки этого ответа и оба были проверено.

Построен и протестирован на iPhone 4s до 6 Plus, каждый iPad, портрет, пейзаж, изменения ориентации, iOS 7 .

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