2016-04-05 2 views
2

Обычно я следовал инструкциям здесь: https://stackoverflow.com/a/24687152/3741933.Как представить UIViewController как Popover в Swift программно на iPhone

Однако, как обсуждалось в его комментариях, popover всегда является полноэкранным независимо от preferredContentSize или sourceRect.

Кнопка представить поповер:

func buttonClicked(sender: UIButton!) { 
    let ac = EmptyViewController() as UIViewController 
    ac.modalPresentationStyle = .Popover 
    ac.preferredContentSize = CGSizeMake(200, 200) 
    let popover = ac.popoverPresentationController 
    popover?.delegate = self 
    popover?.permittedArrowDirections = .Any 
    popover?.sourceView = self.view 
    popover?.sourceRect = CGRect(x: 100, y: 100, width: 100, height: 100) 

    presentViewController(ac, animated: true, completion: nil) 
} 

UIViewController:

import UIKit 

class EmptyViewController : UIViewController { 
    override func viewDidLoad() { 
     view.backgroundColor = UIColor.redColor() 
    } 
} 

enter image description here

Я задаюсь вопросом, как сделать это реальный поповер (не полный размер экрана). Кстати, как отметил @EI Captain, он отлично работает на iPad, но всегда полноэкранный режим на iPhone.

+0

в iPhone с портретным режимом, с этим кодом popover всегда в полноэкранном режиме ... в iPad он отлично работает ... по-прежнему проверяйте это http://richardallen.me/2014/11/28/popovers.html –

+0

@EICaptain Вы правы, что он отлично работает на iPad. Однако учебник работает с IB. Мне интересно, как это сделать программно. –

+0

Возможно, вам нужно сделать индивидуальный просмотр или использовать любую библиотеку для этого –

ответ

0

Вы не можете сделать это в iPhone с портретным режимом с этим кодом ... вы можете проверить popover section in apple doc here..

Это говорит о том, что:

В прошивке 8 и более поздние версии вы используете UIPopoverPresentationController для представления popover. UIPopoverPresentationController определяет делегата, который позволяет настраивать стиль отображения вашего содержимого popover в соответствии с текущей средой отображения. Например, в горизонтально-обычной среде ваш контент может отображаться внутри popover; в горизонтально компактной среде, ваш контент может отображаться в полноэкранном режиме.

И как я уже сказал, если вы можете проверить iPad, ваш контент может отображаться внутри popover.

4

Это возможно! Я не уверен, так как, когда, хотя ...

В viewDidLoad вашего UIViewController, который отображается в виде: пирог

self.preferredContentSize = CGSize(width: myWidth, height: myHeight) 

В UIViewController, который отображает поповер, установить класс как UIPopoverPresentationControllerDelegate и :

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "Identifier" { 
     let vc: UIViewController = segue.destination 

     let pvc = vc.popoverPresentationController 
     pvc?.delegate = self 
     return 
    } 

} 

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { 
    return .none 
} 

PS: в раскадровке, не забудьте установить SEGUE вид, как "Present Как поповер"

Вот и все!

+0

Как обойтись без segue? –

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