iOS 8 iPhone에서 UIPopover 프레젠테이션 컨트롤러
혹시 아는 사람?UIPopoverPresentationController
아이폰에서 팝업을 보여주는 데 사용할 수 있습니까?Apple이 iPad와 iPhone을 위한 보다 통합된 프레젠테이션 컨트롤러를 만들기 위해 iOS 8에 이 기능을 추가했는지 궁금합니다.
베타에서 질문/답변을 해도 되는지 확실하지 않습니다.그런 경우에는 제거하겠습니다.
기본 적응 동작을 재정의할 수 있습니다(UIModalPresentationFullScreen
콤팩트한 수평 환경, 즉 아이폰)을 사용하여adaptivePresentationStyleForPresentationController:
방법을 통해 사용 가능UIPopoverPresentationController.delegate
.
UIPresentationController
이 방법을 사용하여 새로운 프레젠테이션 스타일을 사용하도록 요청합니다. 당신의 경우에는 단순히 반환합니다.UIModalPresentationNone
원인이 될 것입니다.UIPopoverPresentationController
전체 화면 대신 팝업으로 렌더링합니다.
다음은 스토리보드의 seegue 설정을 사용한 팝업의 예입니다.UIBarButtonItem
"모달리" 발표하다UIViewController
class SomeViewController: UIViewController, UIPopoverPresentationControllerDelegate {
// override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { // swift < 3.0
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "PopoverSegue" {
if let controller = segue.destinationViewController as? UIViewController {
controller.popoverPresentationController.delegate = self
controller.preferredContentSize = CGSize(width: 320, height: 186)
}
}
}
// MARK: UIPopoverPresentationControllerDelegate
//func adaptivePresentationStyleForPresentationController(controller: UIPresentationController!) -> UIModalPresentationStyle { // swift < 3.0
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
// Return no adaptive presentation style, use default presentation behaviour
return .None
}
}
이 트릭은 WWDC 2014 세션 214 "View Controller Advancement in iOS8"(36:30)에서 언급되었습니다.
만약 누군가 코드만 있는 팝업을 보여주고 싶다면, 당신은 다음의 방법을 사용할 수 있습니다.
목표 - C
의 속성을 선언합니다.UIPopoverPresentationController
:
@property(nonatomic,retain)UIPopoverPresentationController *dateTimePopover8;
UI 버튼에서 팝업을 표시하려면 다음 방법을 사용합니다.
- (IBAction)btnSelectDatePressed:(id)sender
{
UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
dateVC.preferredContentSize = CGSizeMake(280,200);
destNav.modalPresentationStyle = UIModalPresentationPopover;
_dateTimePopover8 = destNav.popoverPresentationController;
_dateTimePopover8.delegate = self;
_dateTimePopover8.sourceView = self.view;
_dateTimePopover8.sourceRect = sender.frame;
destNav.navigationBarHidden = YES;
[self presentViewController:destNav animated:YES completion:nil];
}
다음 방법을 사용하여 UIBarButtonItem에서 팝업을 표시합니다.
- (IBAction)btnSelectDatePressed:(id)sender
{
UINavigationController *destNav = [[UINavigationController alloc] initWithRootViewController:dateVC];/*Here dateVC is controller you want to show in popover*/
dateVC.preferredContentSize = CGSizeMake(280,200);
destNav.modalPresentationStyle = UIModalPresentationPopover;
_dateTimePopover8 = destNav.popoverPresentationController;
_dateTimePopover8.delegate = self;
_dateTimePopover8.sourceView = self.view;
CGRect frame = [[sender valueForKey:@"view"] frame];
frame.origin.y = frame.origin.y+20;
_dateTimePopover8.sourceRect = frame;
destNav.navigationBarHidden = YES;
[self presentViewController:destNav animated:YES completion:nil];
}
뷰 컨트롤러에서도 이 위임자 메소드를 구현합니다.
- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
return UIModalPresentationNone;
}
이 팝업을 취소하려면 보기 컨트롤러를 취소하기만 하면 됩니다.다음은 뷰 컨트롤러를 해제하는 코드입니다.
-(void)hideIOS8PopOver
{
[self dismissViewControllerAnimated:YES completion:nil];
}
스위프트
UIButton에서 팝업을 표시하려면 다음 방법을 사용합니다.
func filterBooks(sender: UIButon)
{
let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
popoverPresentationViewController?.permittedArrowDirections = .Any
popoverPresentationViewController?.delegate = self
popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
popoverPresentationViewController!.sourceView = self.view;
popoverPresentationViewController!.sourceRect = sender.frame
filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
filterDistanceViewController.navigationBarHidden = true
self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
}
다음 방법을 사용하여 UIBarButtonItem에서 팝업을 표시합니다.
func filterBooks(sender: UIBarButtonItem)
{
let filterVC = FilterDistanceViewController(nibName: "FilterDistanceViewController", bundle: nil)
var filterDistanceViewController = UINavigationController(rootViewController: filterVC)
filterDistanceViewController.preferredContentSize = CGSizeMake(300, 205)
let popoverPresentationViewController = filterDistanceViewController.popoverPresentationController
popoverPresentationViewController?.permittedArrowDirections = .Any
popoverPresentationViewController?.delegate = self
popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem
popoverPresentationViewController!.sourceView = self.view;
var frame:CGRect = sender.valueForKey("view")!.frame
frame.origin.y = frame.origin.y+20
popoverPresentationViewController!.sourceRect = frame
filterDistanceViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
filterDistanceViewController.navigationBarHidden = true
self.presentViewController(filterDistanceViewController, animated: true, completion: nil)
}
뷰 컨트롤러에서도 이 위임자 메소드를 구현합니다.
func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle{
return .None
}
대리인을 추가해주십시오.UIPopoverPresentationControllerDelegate
.h/.m/.m/.px 파일로
문제: iPhone 팝업은 전체 화면을 표시하며 선호하는 ContentSize 값을 존중하지 않습니다.
해결책: 애플이 UIPopover Presentation Controller Class 레퍼런스에서 제안한 것과는 달리, 팝업 프레젠테이션 컨트롤러를 레퍼런스 받아 구성한 후 뷰 컨트롤러를 프레젠테이션합니다.
// Get the popover presentation controller and configure it.
//...
// Present the view controller using the popover style.
[self presentViewController:myPopoverViewController animated: YES completion: nil];
UIA Adaptive Presentation Controller 딜러를 구현해야 합니다.
다음과 같이:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
return UIModalPresentationNone;
}
전체 화면 팝업을 원하지 않는 경우
해결책을 좀 찾았습니다.
Xcode 6.1에서 사용presentationController.delegate
대신에popoverPresentationController.delegate
.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier compare:@"showPopOver"] == NSOrderedSame) {
UINavigationController * nvc = segue.destinationViewController;
UIPresentationController * pc = nvc.presentationController;
pc.delegate = self;
}
}
#pragma mark == UIPopoverPresentationControllerDelegate ==
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
return UIModalPresentationNone;
}
WWDC 2014 "View Controller Advancements in iOS8"에서 아래 코드는 아이폰에서 팝업을 표시할 수 있습니다.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
UINavigationController * nvc = segue.destinationViewController;
UIPopoverPresentationController * pvc = nvc.popoverPresentationController;
pvc.delegate = self;
}
#pragma mark == UIPopoverPresentationControllerDelegate ==
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller
{
return UIModalPresentationNone;
}
하지만 Xcode 6.1에서 이 코드들은 FullScreen presentation...(nvc.popover PresentationController가 nil입니다)
애플사의 버그가 아닌지 의심이 됩니다.
8에서는 iOS 8.3의 합니다.UIPopoverPresentationControllerDelegate
을콜는콜r는elo'을UIModalPresentationStyle
.
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
UIPopover PresentationControllerDelegate를 다음과 같이 확장할 수 있습니다.
protocol PopoverPresentationSourceView {}
extension UIBarButtonItem : PopoverPresentationSourceView {}
extension UIView : PopoverPresentationSourceView {}
extension UIPopoverPresentationControllerDelegate where Self : UIViewController {
func present(popover: UIViewController,
from sourceView: PopoverPresentationSourceView,
size: CGSize, arrowDirection: UIPopoverArrowDirection) {
popover.modalPresentationStyle = .popover
popover.preferredContentSize = size
let popoverController = popover.popoverPresentationController
popoverController?.delegate = self
if let aView = sourceView as? UIView {
popoverController?.sourceView = aView
popoverController?.sourceRect = CGRect(x: aView.bounds.midX, y: aView.bounds.midY, width: 0, height: 0)
} else if let barButtonItem = sourceView as? UIBarButtonItem {
popoverController?.barButtonItem = barButtonItem
}
popoverController?.permittedArrowDirections = arrowDirection
present(popover, animated: true, completion: nil)
}
}
이제 전화하셔도 됩니다.present(popover: from: size: arrowDirection: )
구현하는 모든 보기 컨트롤러UIPopoverPresentationControllerDelegate
예를 들면
class YourViewController : UIViewController {
@IBAction func someButtonPressed(_ sender: UIButton) {
let popover = SomeViewController()
present(popover: popover, from: sender, size: CGSize(width: 280, height: 400), arrowDirection: .right)
}
}
extension YourViewController : UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
}
WEBVIEW 클래스에 이 두 가지 메서드를 추가합니다.덧붙이기
-(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender {
// Assuming you've hooked this all up in a Storyboard with a popover presentation style
if ([segue.identifier isEqualToString: @"showPopover"]) {
UINavigationController * destNav = segue.destinationViewController;
pop = destNav.viewControllers.firstObject;
// This is the important part
UIPopoverPresentationController * popPC = destNav.popoverPresentationController;
popPC.delegate = self;
}
}
- (UIModalPresentationStyle) adaptivePresentationStyleForPresentationController: (UIPresentationController * ) controller {
return UIModalPresentationNone;
}
UIA Adaptive PresentationControllerDelegate에서 다음 방법을 사용해야 합니다.
func adaptivePresentationStyle(for: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle
이 대신에:
func adaptivePresentationStyle(for: UIPresentationController) -> UIModalPresentationStyle
언급URL : https://stackoverflow.com/questions/25319179/uipopoverpresentationcontroller-on-ios-8-iphone
'programing' 카테고리의 다른 글
매트플롯 리브 임쇼() 그래프 축의 값 변경 (0) | 2023.09.06 |
---|---|
Mysql 테이블 조합 변경 (0) | 2023.09.06 |
Mysql이 아래 오류 센토스를 생성하기 시작하지 않습니다. (0) | 2023.09.06 |
이진 문자열을 10진수로 변환하는 방법은? (0) | 2023.09.06 |
입력 유형 = 파일 표시 전용 버튼 (0) | 2023.09.06 |