2016-08-22 4 views
8

У меня есть расширение iMessage, и у меня есть некоторые проблемы с руководством по верху. У меня есть MSMessagesAppViewController, который обрабатывает изменения между стилями презентации. В моем расширении у меня есть кнопка. Когда он нажимается, я перехожу к расширенному стилю презентации, а затем представляю контроллер вида по модулю. Вот в чем проблема: мой интерфейс во втором VC скрывается за верхней панелью навигации. Я подумал, что это странно, когда я устанавливаю свои ограничения в руководство по верху. Поэтому я прорыл свой код и начал отладку верхнего руководства по макету. Я заметил, что после перехода на расширенный стиль презентации, topLayoutGuide.length = 86. Вот как это должно быть. Но когда я представляю второй контроллер представления по модулю, верхний направляющий лист сбрасывается на 0. Почему это не так, как должно быть? Вот мой код:Почему ведущий макет перемещается в моем расширении iMessage?

В моей главной ViewController:

@IBAction func addStickerButtonPressed(_ sender: AnyObject) { 
    shouldPerformCreateSegue = true 
    theSender = sender 
    requestPresentationStyle(.expanded) 

}  
override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { 
    if presentationStyle == .expanded { 
     if shouldPerformCreateSegue == true { 
      shouldPerformCreateSegue = false 
      performSegue(withIdentifier: "CreateStickerSegue", sender: theSender)//here is where I present the new viewController 
     } else { 
      searchBar.becomeFirstResponder() 
      searchBar.placeholder = nil 
      searchBar.showsCancelButton = true 
      searchBar.tintColor = UIColor.white 
     } 
    } else { 
     searchBar.showsCancelButton = false 
    } 
    print(topLayoutGuide.length) //This prints out 86 
} 

В другом модально представленном контроллере вида:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    self.view.addConstraint(navBar.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor)) 
    print(topLayoutGuide.length) //This prints out 0 
} 
+0

Та же проблема [здесь] (http://stackoverflow.com/questions/38593054/ios-10-messages-extension-wrong-layout-when-using-storyboard-segue) – 123FLO321

+0

Да, эта проблема здесь тоже, я думаю вы действительно должны поднять отчет об ошибке для Apple;) Я думаю, что мне скучно.^ – RomOne

+1

Мое текущее обходное решение заключается в том, чтобы изменить верхнее ограничение макета на 66 в расширенном –

ответ

1

Я считаю, что это было известно об ошибке на предыдущом IOS 10 беты. У меня была такая же проблема, и руководство по началу и нижней части макета работает, как я ожидаю, после того, как я обновил версию iOS до последней.

+0

Я использую симулятор. Попробует последнюю версию Xcode, хотя –

7

В качестве обходного пути я использую UIPresentationController, который смещает модальный контроллер представления на topLayoutGuide.length пунктов:

class MyViewController: MSMessagesAppViewController { 

    private func presentModalViewController() { 
     let imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.sourceType = .savedPhotosAlbum 

     imagePicker.modalPresentationStyle = .custom 
     imagePicker.transitioningDelegate = self 

     present(imagePicker, animated: true, completion: nil) 
    } 
} 
// MARK: - UIViewControllerTransitioningDelegate 
extension MyViewController: UIViewControllerTransitioningDelegate { 

    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { 
     let vc = PresentationController(presentedViewController: presented, presenting: presenting) 
     // I really don't want to hardcode the value of topLayoutGuideLength here, but when the extension is in compact mode, topLayoutGuide.length returns 172.0. 
     vc.topLayoutGuideLength = topLayoutGuide.length > 100 ? 86.0 : topLayoutGuide.length 
     return vc 
    } 
} 


class PresentationController: UIPresentationController { 

    var topLayoutGuideLength: CGFloat = 0.0 

    override var frameOfPresentedViewInContainerView: CGRect { 
     guard let containerView = containerView else { 
      return super.frameOfPresentedViewInContainerView 
     } 
     return CGRect(x: 0, y: topLayoutGuideLength, width: containerView.bounds.width, height: containerView.bounds.height - topLayoutGuideLength) 
    } 
} 

Единственная проблема в том, когда вы звоните presentModalViewController из компактного режима, topLayoutGuide.length является 172.0 по неизвестной причине. Поэтому мне пришлось жестко указать значение для этого случая.

+1

Это великолепно! Другая вещь, которую я должен был сделать, - это внести изменения ориентации в учет, закрыв и снова открыв этот контроллер представления в переопределенном методе viewWillTransition. – Swindler

0

я использовал немного разнообразную версию Андрея

class MyViewController: MSMessagesAppViewController { 
    private func presentModalViewController() { 
     let imagePicker = UIImagePickerController() 
     imagePicker.delegate = self 
     imagePicker.sourceType = .savedPhotosAlbum 
     imagePicker.modalPresentationStyle = .custom 
     imagePicker.transitioningDelegate = self 
     present(
      imagePicker, 
      animated: true, 
      completion: nil 
     ) 
    } 
} 

extension MyViewController: UIViewControllerTransitioningDelegate { 
    func presentationController(
     forPresented presented: UIViewController, 
     presenting: UIViewController?, 
     source: UIViewController 
    ) -> UIPresentationController? { 
     let vc = PresentationController(
      presentedViewController: presented, 
      presenting: presenting 
     ) 
     vc.framePresented = modalBoundaries.frame 
     return vc 
    } 
} 

class PresentationController: UIPresentationController { 
    var framePresented = CGRect.zero 
    override var frameOfPresentedViewInContainerView: CGRect { 
     return framePresented 
    } 
} 

modalBoundaries будучи фиктивный UIView с ограничениями (через XIB в моем случае) уважать любую длину TopLayoutGuide.

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