আইওএস 8-তে কীভাবে পপওভারটি উপস্থাপন করা যায়


118

আমি আমার সুইফট আইওএস 8 অ্যাপে একটি ইউআইপিপওভারভিউ যুক্ত করার চেষ্টা করছি, তবে পপওভারটি সঠিক আকারে প্রদর্শন না করায় আমি পপওভার কনসেন্টসাইজ সম্পত্তিটি অ্যাক্সেস করতে পারছি না। আমার কোড:

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)
}

আউটপুট:

এখানে চিত্র বর্ণনা লিখুন

আমি যখন ইউআইপিপওভারপ্রেজেশন কনট্রোলারের মাধ্যমে একই জিনিসটি করি তখনও আমি এটি সম্পন্ন করি না। এটি আমার কোড:

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)

}

আমি ঠিক একই আউটপুট পেতে।

আমি কীভাবে আমার পপওভারের আকারটি কাস্টমাইজ করব? কোন সাহায্যের অত্যন্ত প্রশংসা হবে!


বিকাশকারী সাইটে "ডাব্লুডাব্লুডিসি" ভিডিও রয়েছে যা "এ লুক ইনসাইড প্রেজেন্টেশন কন্ট্রোলারস" নামে বর্ণনা করেছে এটি কীভাবে
ইউআইপিপভারপ্রেজিয়েশন

আমি ইউআইপিপোভারপ্রেসেন্টেশন কন্ট্রোলার সম্পর্কিত অ্যাপল ভিডিও অনুসারে আমার প্রশ্নটি সম্পাদনা করেছি, তবে কিছুই পরিবর্তন হয়নি! আপনি কি আমার সম্পর্কে এই পরিবর্তন করা উচিত যে কিছু সেফ? যদিও ইনপুট জন্য ধন্যবাদ!
জোরিস 416

উত্তর:


148

ঠিক আছে, একজন বাড়ির সহকর্মী এটি একবার দেখেছিলেন এবং তা আবিষ্কার করেছিলেন:

 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


15
সম্ভবত সুস্পষ্ট উল্লেখ করে, তবে এটি কেবল দ্রুত-সম্পর্কিত নয়। আমার প্রযোজনা-সি অ্যাপেও এটি করতে হয়েছিল :)
কেভিন আর

4
কোড সম্পর্কে আরেকটি মন্তব্য - আপনি "var" এর পরিবর্তে "let" ব্যবহার করতে পারেন। অ্যাপল আপনাকে এমন ক্ষেত্রে ক্ষেত্রে এটির জন্য সুপারিশ করে যেখানে মানটি পুনরায় স্বাক্ষর করতে হবে না।
ইপেজ_এড

3
এটি জিএম-এ আইফোনের জন্য বাগড হয়েছে। আপনি যদি সিমুলেটর প্রতিকৃতিতে উপস্থিত হওয়ার চেষ্টা করেন তবে এটি সর্বদা পূর্ণ পর্দা থাকে। আপনি ল্যান্ডস্কেপ এ ঘোরা, এটি একটি পপওভার হয়ে ওঠে। আপনি যদি আবার প্রতিকৃতিতে ঘোরান, এটি পপওভার থেকে যায়।
jjxtra

1
সমাধানটি হল ভিউকন্ট্রোলারকে কল করার আগে পপওভার সেট আপ করা। এটি অ্যাপলের উদাহরণের ঠিক বিপরীত যেখানে তারা আপনাকে স্পষ্টভাবে উপস্থিত ভিউকন্ট্রোলারকে কল করার পরে পপওভার সেট আপ করতে বলে।
jjxtra

1
@ সাইকোড্যাড আপনি দয়া করে উল্লিখিত সমাধানটির লিঙ্ক সরবরাহ করতে পারেন। আমি তখনও আটকে আছি "যখন সিমুলেটর প্রতিকৃতিতে থাকে, এটি সর্বদা পূর্ণ পর্দা থাকে"। ধন্যবাদ
নিশান্ত

53

আসলে এটি এর চেয়ে অনেক সহজ। স্টোরিবোর্ডে আপনার পপওভার হিসাবে ব্যবহার করতে চান এমন ভিউ কনট্রোলার তৈরি করা উচিত এবং এর জন্য যথারীতি ভিউকন্ট্রোলার ক্লাস করা উচিত। আপনি পপওভারটি খুলতে চান সেই অবজেক্টটি থেকে নীচে দেখানো হয়েছে সেগ করুন, এই ক্ষেত্রে UIBarButton"কনফিগারেশন" নামকরণ করা হয়েছে।

এখানে চিত্র বর্ণনা লিখুন

"মাদার ভিউ কন্ট্রোলার" তে 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
    } 

28

এই সমস্ত কীভাবে কাজ করা যায় তার একটি সম্পূর্ণ উদাহরণ আমি পেয়েছি যাতে আপনি সর্বদা ডিভাইস / ওরিয়েন্টেশন https://github.com/frogcjn/AdaptivePopover_iOS8_Swift এ কোনও পপওভার প্রদর্শন করতে পারেন ।

মূলটি হ'ল ইউআইএডিএটিপটিভপ্রেসিভেশন কন্ট্রোলারডেলিগেটটি কার্যকর করা

func adaptivePresentationStyleForPresentationController(PC: UIPresentationController!) -> UIModalPresentationStyle {
    // This *forces* a popover to be displayed on the iPhone
    return .None
}

তারপরে উপরের উদাহরণটি প্রসারিত করুন (ডিজিটাল ডিজাইন থেকে):

nav.popoverPresentationController!.delegate = implOfUIAPCDelegate

আমি ইউআইপিপওভারপ্রেমেশন কনট্রোলারডেলিগেট ব্যবহার করি
onwayway133

3
সঠিক, ইউআইপিপোভারপ্রেসেশন কনট্রোলারডেলিগেটটি ইউআইএডেপটিভপ্রেসিভেশন কন্ট্রোলারডেলিগেট প্রসারিত করে। সুতরাং, সংজ্ঞা অনুসারে, উভয়টিতেই 'অ্যাডেটিভপ্রেজেন্টেশনস্টাইলফোরপ্রেসেশন কন্ট্রোলার' পদ্ধতি রয়েছে। আমি বেস ইন্টারফেসটি সেভাবেই সরবরাহ করেছি যেখানে অ্যাপল এর এপিআই নথিগুলিতে পদ্ধতিটি নথিভুক্ত করা হয়।
ডেভিড হান্ট

1
নোট করুন এটি অননুমোদিত আচরণ। ডকটি বলেছেন যে এই প্রতিনিধি পদ্ধতিটি অবশ্যই "হয় UIModalPresentationFullScreenবা UIModalPresentationOverFullScreen" ফিরবে । অধিকন্তু, "আপনি এই পদ্ধতি বাস্তবায়ন রাখতে না পারেন বা কোনো শৈলী ছাড়া অন্য আসতে UIModalPresentationFullScreenবা UIModalPresentationOverFullScreen, উপস্থাপনা কন্ট্রোলার উপস্থাপনা শৈলী সামঞ্জস্য UIModalPresentationFullScreenশৈলী।"
টম

1
বর্তমান ডকুমেন্টেশন পরামর্শ দেয় যে আইওএস 8.3 এর পরে আপনার ব্যবহার করা উচিত - অ্যাডাপটিভপ্রেডিশনস্টাইলফোরপ্রেসেশন কনট্রোলার: বৈশিষ্ট্য সংগ্রহ: এবং ফিরে আসা শৈলীটি অবশ্যই "ইউআইমোডালপ্রেজেন্টেশনফুলস্ক্রিন, ইউআইমোডালপ্রেজেন্টেশন ওভারফুলস্ক্রিন, ইউআইমোডালপ্রেজিশনফর্মশিট বা ইউআইমোডালপ্রেজনেশননিউন" হতে হবে।
ডেল

25

সুইফট ২.০

ভাল আমি কাজ করেছিলাম। একবার দেখুন। স্টোরিবোর্ডে একটি ভিউ কন্ট্রোলার তৈরি করেছেন। পপওভারভিউ নিয়ন্ত্রণকারী শ্রেণীর সাথে যুক্ত with

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
    }
}  

দ্রষ্টব্য: ফানক শোপোভার (বেস: ইউআইভিউ) পদ্ধতিটি ভিউডিডলডের আগে স্থাপন করা উচিত। আশা করি এটা সাহায্য করবে !


হাই @ অ্যালভিন, আমি মানচিত্রের টীকা থেকে একটি দৃশ্য পপআপ করতে যাচ্ছি। সুতরাং আমি আপনার মত একই কাজ। পার্থক্যটি হচ্ছে দেখার পরিবর্তে টেবিলভিউ নিয়ন্ত্রণকারীকে স্থাপন করতে চলেছি। এখন সমস্যা প্রতিনিধি পদ্ধতির উপর চাপ দিচ্ছে না " আমি যখন নিয়ামককে বরখাস্ত করি। তুমি কি সাহায্য করতে পারো ? (প্রশ্ন পোস্ট সম্পর্কিত নয়)
সাবিন কে কুরিকোজে

1
কেন showPopover(base: UIView)আগে একটি পদ্ধতি রাখা উচিত viewDidLoad()?
আইমান্তাস

15

আইওএস 9 ইউআইপিপওভারকন্ট্রোলার হ্রাস করা হয়। সুতরাং আইওএস 9.x এর উপরে ওজেক্টিভ-সি সংস্করণের জন্য নীচের কোডটি ব্যবহার করতে পারেন,

- (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]; }

প্রশ্নটি বিশেষত সুইফটকে জিজ্ঞাসা করে, উদ্দেশ্য-সি এর জন্য নয়।
এরিক আয়া

8

এখানে আমি "Joris416" স্যুইফ্ট কোডটি উদ্দেশ্য-সি তে রূপান্তর করি,

-(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


প্রশ্নটি বিশেষত সুইফটকে জিজ্ঞাসা করে, উদ্দেশ্য-সি এর জন্য নয়।
এরিক আয়া

4

এটি আইওএস 8 ডে-বাই-ডে ব্লগে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে

সংক্ষেপে, একবার আপনি আপনার ইউআইভিউউকন্ট্রোলারের মডেলপ্রেমেনশনস স্টাইল সেট করে P


3

আমি উপরের চিত্রের ডিজিটালগুলির দ্রুত উত্তরটির একটি উদ্দেশ্য-সি সংস্করণ তৈরি করেছি। আমার মনে হয় না যে প্রাথমিক পরীক্ষার অধীনে কাজ করার মতো মনে হচ্ছে আমি কোনও কিছু মিস করেছি, যদি আপনি কোনও কিছু আমাকে জানান তবে আমি তা আপডেট করব

-(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];
}

আমি মনে করি আপনি ছেড়ে গেছেন popover.sourceView = self.view;
ghr

প্রশ্নটি বিশেষত সুইফটকে জিজ্ঞাসা করে, উদ্দেশ্য-সি এর জন্য নয়।
এরিক আয়া

4
আমি বুঝতে পেরেছি, তবে গুগল আপনাকে এখানে এনেছে এমনকি আপনি উদ্দেশ্য-সি অনুসন্ধান করছেন are আমি এখানেই শেষ হয়ে গেলাম।
নার্কো

3

এক্সকোড 9.1 / সুইফ্ট 4 এর জন্য আমার দুটি সেন্ট।

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
}

এবং পরীক্ষায়:

ফানক অভিযোজিতপ্রেমেশন স্টাইল ...

    return .popover

বা: ফিরুন .পেজপত্রক .... এবং আরও কিছু ..


2

আপনার ভিউকন্ট্রোলারের মধ্যে ইউআইএডিপটিভপ্রেসিভেশন কন্ট্রোলারডেলিগেট প্রয়োগ করুন। তারপর যোগ :

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

1

নীচে পপওভারগুলি কনফিগার ও উপস্থাপনের জন্য একটি বিস্তৃত বিস্তৃত গাইড রয়েছে। https://www.appcoda.com/presentation-controllers-tutorial/

সংক্ষেপে, একটি কার্যকর বাস্তবায়ন ( সুইফট ৪.২ এর মূল নিবন্ধ সিনট্যাক্স থেকে কিছু আপডেট সহ ), অন্য কোথাও থেকে ডেকে আনার জন্য, নিম্নলিখিতগুলির মতো কিছু হবে:

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)
}

এটি ইতিমধ্যে @ এমএমসি থেকে উত্তরে কভার করা হয়েছিল, তবে নিবন্ধটি ব্যবহার করা কয়েকটি কোড উপাদানগুলির ব্যাখ্যা করতে এবং এটি কীভাবে প্রসারিত হতে পারে তাও দেখায়।

এটি আইফোন বনাম আইপ্যাডের জন্য উপস্থাপনা শৈল পরিচালনা করার জন্য প্রতিনিধিদের ব্যবহার এবং পপওভারকে যদি পুরো-স্ক্রিনটি কখনও প্রদর্শিত হয় তবে তা বরখাস্ত করার অনুমতি দেওয়ার বিষয়ে প্রচুর অতিরিক্ত বিশদ সরবরাহ করে। আবার, সুইফট ৪.২ এর জন্য আপডেট হয়েছে :

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)
}

আশাকরি এটা সাহায্য করবে.


0

যারা পড়াশোনা করতে চান তাদের জন্য!

যারা পড়াশোনা করতে এবং যেকোনো উদ্দেশ্যে পপওভার ভিউ ব্যবহার করতে চান তাদের জন্য আমি একটি ওপেন সোর্স প্রকল্প তৈরি করেছি। আপনি এখানে প্রকল্প খুঁজে পেতে পারেন। https://github.com/tryWabbit/KTListPopup

KTListNewResize

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.