[ios] iOS 8에서 올바르게 팝 오버를 표시하는 방법
Swift iOS 8 앱에 UIPopoverView를 추가하려고하는데 팝 오버가 올바른 모양으로 표시되지 않기 때문에 PopoverContentSize 속성에 액세스 할 수 없습니다. 내 코드 :
var popover: UIPopoverController? = nil
func addCategory() {
var newCategory = storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: newCategory)
popover = UIPopoverController(contentViewController: nav)
popover!.setPopoverContentSize(CGSizeMake(550, 600), animated: true)
popover!.delegate = self
popover!.presentPopoverFromBarButtonItem(self.navigationItem.rightBarButtonItem, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
산출:
UIPopoverPresentationController를 통해 동일한 작업을 수행 할 때도 여전히 수행되지 않습니다. 이것은 내 코드입니다.
func addCategory() {
var popoverContent = self.storyboard.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController as UIPopoverPresentationController
popover.delegate = self
popover.popoverContentSize = CGSizeMake(1000, 300)
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
나는 똑같은 출력을 얻습니다.
팝 오버의 크기를 어떻게 사용자 정의합니까? 어떤 도움이라도 대단히 감사하겠습니다!
답변
좋아, 한 집 친구가 그것을보고 알아 냈다.
func addCategory() {
var popoverContent = self.storyboard?.instantiateViewControllerWithIdentifier("NewCategory") as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.Popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSizeMake(500,600)
popover.delegate = self
popover.sourceView = self.view
popover.sourceRect = CGRectMake(100,100,0,0)
self.presentViewController(nav, animated: true, completion: nil)
}
바로 그거야.
더 이상 팝 오버 자체와 대화하지 않고 속성을 호출하여 콘텐츠 크기를 설정하기 위해 그 안에있는 뷰 컨트롤러와 대화합니다. preferredContentSize
답변
사실 그것은 그것보다 훨씬 간단합니다. 스토리 보드에서 팝 오버로 사용할 viewcontroller를 만들고 평소와 같이 viewcontroller 클래스를 만들어야합니다. 팝 오버를 열려는 개체에서 아래와 같이 segue를 만듭니다.이 경우에는 UIBarButton
“Config”라는 이름으로 지정합니다.
“mother viewcontroller”에서 UIPopoverPresentationControllerDelegate
및 delegate 메소드를 구현합니다 .
func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController) {
//do som stuff from the popover
}
다음 prepareForSeque
과 같이 메서드를 재정의합니다 .
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//segue for the popover configuration window
if segue.identifier == "yourSegueIdentifierForPopOver" {
if let controller = segue.destinationViewController as? UIViewController {
controller.popoverPresentationController!.delegate = self
controller.preferredContentSize = CGSize(width: 320, height: 186)
}
}
}
그리고 당신은 끝났습니다. 이제 팝 오버보기를 다른보기로 취급 할 수 있습니다. 필드를 추가하고 무엇을하지 마십시오! 그리고 다음을 사용하여 콘텐츠 컨트롤러를 확보 할 수 있습니다.popoverPresentationController.presentedViewController
메서드를 를 확보합니다 UIPopoverPresentationController
.
또한 iPhone에서는 덮어 써야합니다.
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
답변
장치 / 방향 https://github.com/frogcjn/AdaptivePopover_iOS8_Swift에 관계없이 항상 팝 오버를 표시 할 수 있도록이 모든 작업을 수행하는 방법에 대한 완전한 예제를 찾았습니다 .
핵심은 UIAdaptivePresentationControllerDelegate를 구현하는 것입니다.
func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {
// This *forces* a popover to be displayed on the iPhone
return .None
}
그런 다음 위의 예를 확장합니다 (Imagine Digital).
nav.popoverPresentationController!.delegate = implOfUIAPCDelegate
답변
스위프트 2.0
글쎄요. 보세요. StoryBoard에서 ViewController를 만들었습니다. PopOverViewController 클래스와 연결됩니다.
import UIKit
class PopOverViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.preferredContentSize = CGSizeMake(200, 200)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")
}
func dismiss(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
ViewController를 참조하십시오.
// ViewController.swift
import UIKit
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
func showPopover(base: UIView)
{
if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {
let navController = UINavigationController(rootViewController: viewController)
navController.modalPresentationStyle = .Popover
if let pctrl = navController.popoverPresentationController {
pctrl.delegate = self
pctrl.sourceView = base
pctrl.sourceRect = base.bounds
self.presentViewController(navController, animated: true, completion: nil)
}
}
}
override func viewDidLoad(){
super.viewDidLoad()
}
@IBAction func onShow(sender: UIButton)
{
self.showPopover(sender)
}
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
return .None
}
}
참고 : func showPopover (base : UIView) 메서드는 ViewDidLoad 앞에 배치해야합니다. 도움이 되길 바랍니다!
답변
iOS9에서 UIPopoverController는 감가 상각됩니다. 따라서 iOS9.x 이상의 Objective-C 버전에 대해 아래 코드를 사용할 수 있습니다.
- (IBAction)onclickPopover:(id)sender {
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
UIViewController *viewController = [sb instantiateViewControllerWithIdentifier:@"popover"];
viewController.modalPresentationStyle = UIModalPresentationPopover;
viewController.popoverPresentationController.sourceView = self.popOverBtn;
viewController.popoverPresentationController.sourceRect = self.popOverBtn.bounds;
viewController.popoverPresentationController.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:viewController animated:YES completion:nil]; }
답변
여기에서 “Joris416″Swift 코드를 Objective-c로 변환합니다.
-(void) popoverstart
{
ViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"PopoverView"];
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:controller];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController *popover = nav.popoverPresentationController;
controller.preferredContentSize = CGSizeMake(300, 200);
popover.delegate = self;
popover.sourceView = self.view;
popover.sourceRect = CGRectMake(100, 100, 0, 0);
popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:nav animated:YES completion:nil];
}
-(UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller
{
return UIModalPresentationNone;
}
추가하는 것을 잊지 마십시오
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
답변
간단히 말해 UIViewController의 modalPresentationStyle을 .Popover로 설정하면 컨트롤러의 popoverPresentationController 속성을 통해 UIPopoverPresentationClass (새로운 iOS8 클래스)를 확보 할 수 있습니다.