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)
}
출력:
UIPopover Presentation Controller를 통해 동일한 작업을 수행할 때도 여전히 수행되지 않습니다.이게 내 코드입니다.
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
사실 이것은 그것보다 훨씬 간단합니다.스토리보드에서 사용할 뷰 컨트롤러를 팝업으로 만들고 뷰 컨트롤러 클래스를 평소처럼 만들어야 합니다.팝업을 열고 싶은 개체에서 아래와 같이 seegue를 만듭니다. 이 경우에는UIBarButton
이름은 "Config"입니다.
"Mother View Controller"에서 다음을 구현합니다.UIPopoverPresentationControllerDelegate
그리고 대리인 방법:
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
.
아이폰에서도 덮어쓰기를 해야 합니다.
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return UIModalPresentationStyle.none
}
장치/방향 https://github.com/frogcjn/AdaptivePopover_iOS8_Swift 에 관계없이 항상 팝업을 표시할 수 있도록 이 모든 것을 작동시키는 방법에 대한 완벽한 예를 찾았습니다.
핵심은 UIA Adaptive Presentation Controller 딜러를 구현하는 것입니다.
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
저는 운동을 했습니다.한번 보세요.스토리보드에서 보기 컨트롤러를 만들었습니다.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.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(기본:UIView) 메서드는 ViewDidLoad 앞에 배치해야 합니다.도움이 되길 바랍니다!
iOS9 UIPoverController에서는 사용하지 않습니다.그래서 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 Code를 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;
}
ADD할 것을 기억합니다.
UIPopoverPresentationControllerDelegate, UIAdaptivePresentationControllerDelegate
이는 iOS8 Day-by-Day 블로그에서 가장 잘 설명됩니다.
간단히 말해, UIViewController의 modal Presentation Style을 로 설정한 후에 말입니다.팝업, 컨트롤러의 popover Presentation Controller 속성을 통해 UIP popover Presentation Class(새로운 iOS8 클래스)를 가져올 수 있습니다.
위의 Objective-C 버전의 Imagine Digitals 빠른 답변을 만들었습니다.사전 테스트 중에 작동하는 것 같아서 빠진 것은 없는 것 같은데 발견되면 알려주시면 업데이트하겠습니다.
-(void) presentPopover
{
YourViewController* popoverContent = [[YourViewController alloc] init]; //this will be a subclass of UIViewController
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:popoverContent];
nav.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popover = nav.popoverPresentationController;
popoverContent.preferredContentSize = CGSizeMake(500,600);
popover.delegate = self;
popover.sourceRect = CGRectMake(100,100,0,0); //I actually used popover.barButtonItem = self.myBarButton;
[self presentViewController:nav animated:YES completion:nil];
}
xcode 9.1 / swift 4에 대한 나의 2센트.
class ViewController: UIViewController, UIPopoverPresentationControllerDelegate {
override func viewDidLoad(){
super.viewDidLoad()
let when = DispatchTime.now() + 0.5
DispatchQueue.main.asyncAfter(deadline: when, execute: { () -> Void in
// to test after 05.secs... :)
self.showPopover(base: self.view)
})
}
func showPopover(base: UIView) {
if let viewController = self.storyboard?.instantiateViewController(withIdentifier: "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.present(navController, animated: true, completion: nil)
}
}
}
@IBAction func onShow(sender: UIButton){
self.showPopover(base: sender)
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle{
return .none
}
및 실험:
funcaptive PresentationStyle...
return .popover
또는: .pageSheet... 등을 반환합니다.
View 컨트롤러에 UIA Adaptive PresentationControllerDelegate를 구현합니다.그런 다음 추가:
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle{
return .none
}
다음은 팝업을 구성하고 표시하는 방법에 대한 꽤 포괄적인 가이드입니다.https://www.appcoda.com/presentation-controllers-tutorial/
요약하면, 실행 가능한 구현(Swift 4.2의 원래 기사 구문에서 일부 업데이트된 부분이 있음)은 다음과 같습니다.
func showPopover(ofViewController popoverViewController: UIViewController, originView: UIView) {
popoverViewController.modalPresentationStyle = UIModalPresentationStyle.popover
if let popoverController = popoverViewController.popoverPresentationController {
popoverController.delegate = self
popoverController.sourceView = originView
popoverController.sourceRect = originView.bounds
popoverController.permittedArrowDirections = UIPopoverArrowDirection.any
}
self.present(popoverViewController, animated: true)
}
이 중 많은 부분은 @mmc의 답변에서 이미 다루었지만, 이 기사는 사용된 코드 요소 중 일부를 설명하는 데 도움이 되며, 확장할 수 있는 방법도 보여줍니다.
또한 iPhone 대 iPad의 프레젠테이션 스타일을 처리하기 위해 위임을 사용하는 방법과 전체 화면으로 보여진 경우 팝업을 삭제할 수 있는 방법에 대한 추가 세부 정보도 제공합니다.다시, Swift 4.2용으로 업데이트됨:
func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle {
//return UIModalPresentationStyle.fullScreen
return UIModalPresentationStyle.none
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
if traitCollection.horizontalSizeClass == .compact {
return UIModalPresentationStyle.none
//return UIModalPresentationStyle.fullScreen
}
//return UIModalPresentationStyle.fullScreen
return UIModalPresentationStyle.none
}
func presentationController(_ controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
switch style {
case .fullScreen:
let navigationController = UINavigationController(rootViewController: controller.presentedViewController)
let doneButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(doneWithPopover))
navigationController.topViewController?.navigationItem.rightBarButtonItem = doneButton
return navigationController
default:
return controller.presentedViewController
}
}
// As of Swift 4, functions used in selectors must be declared as @objc
@objc private func doneWithPopover() {
self.dismiss(animated: true, completion: nil)
}
도움이 되길 바랍니다.
var popoverContent = (self.storyboard?.instantiateViewController(withIdentifier: "WhatsNewViewController"))! as UIViewController
var nav = UINavigationController(rootViewController: popoverContent)
nav.modalPresentationStyle = UIModalPresentationStyle.popover
var popover = nav.popoverPresentationController
popoverContent.preferredContentSize = CGSize(width: 500, height: 100)
popover?.delegate = self
popover?.sourceView = self.view
popover?.sourceRect = CGRectMake(100,100,0,0)
self.present(nav, animated: true, completion: nil)
공부하고 싶은 사람들을 위해!
저는 Popover view를 연구하고 사용하려는 사람들을 위해 Open Source 프로젝트를 만들었습니다.프로젝트는 여기서 찾을 수 있습니다.https://github.com/tryWabbit/KTListPopup
언급URL : https://stackoverflow.com/questions/24635744/how-to-present-popover-properly-in-ios-8
'programing' 카테고리의 다른 글
새 줄이 발견될 때까지 차단하면서 stdin에서 줄을 읽는 방법은? (0) | 2023.11.02 |
---|---|
오래된 도커 컨테이너를 제거하는 방법 (0) | 2023.11.02 |
오류: "삽입할 노드가 다른 문서 컨텍스트에 있습니다." (0) | 2023.11.02 |
우커머스를 카트 URL에 추가 (0) | 2023.11.02 |
mariadb의 "With As"를 변경하는 다른 방법 (0) | 2023.11.02 |