2015-07-04 32 views
10

W moim projekcie mam przycisk na dole po prawej stronie ekranu i dodałem kolejną kontrolkę uiview do storyboardu, przeciągnąłem kontrolkę do kontrolera uiview, który chciałem jako popover, następnie ustawiłem ten rozmiar kontrolera view na (300, 300) i zaznaczone "użyj preferowanego rozmiaru jawnego". Kiedy ładuję aplikację i klikam przycisk, cały ekran zostaje zasłonięty przez "popover". Próbowałem również przejść do pliku .mm popoverViewController i ustawić rozmiar, ale to też nie działa.
Jakieś pomysły?Dlaczego fragment "obecny jako popover" obejmuje cały ekran?

Edycja: Ponieważ wygląda na to, że muszę mieć pełnoekranowy ekran, ale mam jeszcze inne problemy, które miałem wcześniej. Pojawi się mój ekran podręczny, a tło zmieni się na czarne, a na alfa na .5, dzięki czemu będzie można je przejrzeć, ale zrobi animację, a po zakończeniu animacji ekran przejdzie z .5 na całkowicie czarną i jedyną Rzecz, którą widzę, to ikona baterii.

+0

Spróbuj ustawić modalPresentationStyle na docelowym ViewController do UIModalPresentationPopover – Jef

+4

Czy testowanie z iPada lub iPhone'a ? Popover nie jest dla iPhone'a. – Leo

+1

Oh próbuję go na iphone. Jak mogę uzyskać ten efekt na telefonie iPhone? – coal175

Odpowiedz

0

W telefonie iPhone można utworzyć niestandardowy kontroler widoku, który może zarządzać wszystkimi przeglądarkami. Ponieważ każdy kontroler widoku ma własny kontroler nawigacyjny, można dodać nowy kontroler widoku do app.window.rootviewcontroller jako widok danych i przenieść wszystko na wierzch.

Jeśli nie chcesz napisać własną rękę, można użyć coś takiego na przykład: http://cocoapods.org/pods/FPPopover

17

PO używa Objective-C. Ta odpowiedź przedstawia kod w szybkim tempie. Konwersja do Celu-C powinna być łatwa.

W nowo dodane ViewController pod „symulowane Metrics” zmiana „Size” do „Freeform” i „Status Bar” na „None”.

Under „symulowane Size” zmienić wysokość i szerokość widoku danych, do rzeczywisty rozmiar, jaki ma być zawartość twojego popover.

Utwórz przejście do nowo dodanego VC. Użyj typu segue jako "Present As Popover" i podaj nazwę dla segue, na przykład "popoverSegue".

W ViewConroller, z którego ma zostać wyzwolona ta zmiana, należy dodać protokół UIPopoverPresentationControllerDelegate.

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate { 
} 

Zastępuje funkcję prepareForSegue, aby przechwycić przejście popover. Ustaw modalPresentationStyle do .Popover jednoznacznie stwierdzić, że chcesz popover a następnie przypisać właściwość delegata widoku za popoverPresentationController do siebie:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "popoverSegue" { 
      let popoverViewController = segue.destinationViewController as! UIViewController 
      popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover 
      popoverViewController.popoverPresentationController!.delegate = self 
     } 
    } 

realizacji funkcji adaptivePresentationStyleForPresentationController opowiedzieć swoją aplikację, czy naprawdę chcesz, że prezentacja popover i zaakceptuje żadnych zastępstw:

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.None 
    } 

po nich, mogę dostać popup na iPhone, która nie jest pełny ekran ale rozmiar ustawiony na ViewController.

enter image description here

Źródło: iPad Style Popovers on the iPhone with Swift

+0

To działa dla mnie, ale widzę, że popover ignoruje rozmiar widoku i po prostu daje mi losowy rozmiar, który jest jak 1/3 rozmiaru ekranu. – SomeGuy

+0

Ah, rozwiązany. Musiałem zaznaczyć pole "Użyj preferowanego rozmiaru" – SomeGuy

3

Swift 3 wersja

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == SEGUE_IDENTIFIER { 
      let popoverViewController = segue.destination as! YourViewController 

      popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover 
      popoverViewController.popoverPresentationController!.delegate = self 
     } 
    } 

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

Dzięki Bharat for the great answer, ja osobiście używać UIStoryboardSegue który robi prawie to samo. W ten sposób mogę zmienić klasę segue w serii ujęć, mieć to, co chcę, i nie zanieczyszczają moje ViewControllers:

class AlwaysPopupSegue : UIStoryboardSegue, UIPopoverPresentationControllerDelegate 
{ 
    override init(identifier: String?, source: UIViewController, destination: UIViewController) 
    { 
     super.init(identifier: identifier, source: source, destination: destination) 
     destination.modalPresentationStyle = UIModalPresentationStyle.popover 
     destination.popoverPresentationController!.delegate = self 
    } 
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { 
     return UIModalPresentationStyle.none 
    } 
}