Popover ที่มีตัวควบคุมการนำทางในตัวไม่เคารพขนาดของการนำทางย้อนกลับ


89

ฉันมี UIPopoverController ที่โฮสต์ UINavigationController ซึ่งมีลำดับชั้นเล็ก ๆ ของตัวควบคุมมุมมอง

ฉันติดตามเอกสารและสำหรับตัวควบคุมมุมมองแต่ละตัวฉันตั้งค่าขนาดบริบทป๊อปโอเวอร์ของมุมมองดังนี้:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(ขนาดแตกต่างกันสำหรับแต่ละคอนโทรลเลอร์)

สิ่งนี้ทำงานได้ตามที่คาดไว้เมื่อฉันเลื่อนไปข้างหน้าในลำดับชั้น - ป๊อปโอเวอร์จะเคลื่อนไหวการเปลี่ยนแปลงขนาดโดยอัตโนมัติเพื่อให้สอดคล้องกับตัวควบคุมแบบพุช

อย่างไรก็ตามเมื่อฉันนำทาง "ย้อนกลับ" ผ่านสแต็กมุมมองผ่านปุ่มย้อนกลับของแถบนำทางป๊อปโอเวอร์จะไม่เปลี่ยนขนาด แต่จะยังคงมีขนาดใหญ่เท่ากับมุมมองที่ลึกที่สุด สิ่งนี้ดูเหมือนจะพังทลายสำหรับฉัน ฉันคาดหวังให้ป๊อปโอเวอร์เป็นไปตามขนาดที่ตั้งค่าเมื่อปรากฏผ่านสแต็กมุมมอง

ฉันพลาดอะไรไปรึเปล่า?

ขอบคุณ.


คุณตั้งค่าขนาดป็อปโอเวอร์ที่ใด คุณรีเซ็ตทุกครั้งที่มีการแสดงตัวควบคุมมุมมอง (เช่นในviewWillAppear:) หรือไม่?
Ole Begemann

คุณหมายถึงคุณทำตามเอกสารอะไร
Tom Hamming

คำตอบ:


94

โอเคฉันกำลังประสบปัญหาเดียวกัน วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉันเลยนั่นคือเหตุผลที่ฉันตัดสินใจทำการตรวจสอบเล็กน้อยและค้นหาว่าวิธีนี้ได้ผลอย่างไร นี่คือสิ่งที่ฉันค้นพบ: - เมื่อคุณตั้งค่าไฟล์contentSizeForViewInPopoverในตัวควบคุมมุมมองของคุณจะไม่เปลี่ยนแปลงโดยตัวป๊อปโอเวอร์แม้ว่าขนาดป๊อปโอเวอร์อาจเปลี่ยนไปในขณะที่นำทางไปยังตัวควบคุมอื่น - เมื่อขนาดของป็อปโอเวอร์จะเปลี่ยนไปในขณะที่นำทางไปยังคอนโทรลเลอร์อื่นในขณะที่ย้อนกลับขนาดของป็อปโอเวอร์จะไม่คืนค่า - การเปลี่ยนขนาดของป็อปโอเวอร์ใน viewWillAppear จะให้แอนิเมชั่นที่แปลกมาก (เมื่อสมมติว่าคุณ popController อยู่ในป๊อปโอเวอร์) - ฉันไม่แนะนำ - สำหรับฉันการตั้งค่าขนาดฮาร์ดโค้ดภายในคอนโทรลเลอร์จะไม่ทำงานเลย - บางครั้งคอนโทรลเลอร์ของฉันจะต้องใหญ่บางครั้งก็เล็ก - คอนโทรลเลอร์ที่จะนำเสนอพวกเขามีแนวคิดเกี่ยวกับขนาดแม้ว่า

วิธีแก้ปัญหาสำหรับความเจ็บปวดทั้งหมดมีดังนี้: คุณต้องรีเซ็ตขนาดของcurrentSetSizeForPopoverใน viewDidAppear แต่คุณต้องระวังเมื่อคุณตั้งค่าขนาดเดียวกับที่ตั้งไว้ในฟิลด์currentSetSizeForPopoverแล้วป๊อปโอเวอร์จะไม่เปลี่ยนขนาด เพื่อให้สิ่งนี้เกิดขึ้นขั้นแรกคุณสามารถตั้งค่าขนาดปลอม (ซึ่งจะแตกต่างจากขนาดที่ตั้งไว้ก่อนหน้านี้) ตามด้วยการตั้งค่าขนาดที่เหมาะสม โซลูชันนี้จะใช้งานได้แม้ว่าคอนโทรลเลอร์ของคุณจะซ้อนอยู่ภายในตัวควบคุมการนำทางและป๊อปโอเวอร์จะเปลี่ยนขนาดตามเมื่อคุณจะย้อนกลับระหว่างคอนโทรลเลอร์

คุณสามารถสร้างหมวดหมู่บน UIViewController ได้อย่างง่ายดายด้วยวิธีการช่วยเหลือต่อไปนี้ที่จะทำเคล็ดลับด้วยการตั้งค่าขนาด:


- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

จากนั้นเรียกใช้ใน-viewDidAppearคอนโทรลเลอร์ที่ต้องการ


1
หมวดหมู่ข้างต้นเป็นวิธีเดียวที่ฉันสามารถทำให้มันใช้งานได้ ขอบคุณ.
RickiG

นี้ได้ผล ฉันต้องหาวิธีป้องกันไม่ให้มุมมองตารางกลายเป็น "สีดำ" ในพื้นที่หดตัวเมื่อป๊อปโอเวอร์ลดขนาดลง แต่วิธีนี้ทำให้ (ในที่สุด!) ทำให้ป๊อปโอเวอร์ย้ายไปยังขนาดที่ถูกต้องสำหรับแต่ละระดับสแต็ก ขอบคุณ!
Ben Zotto

2
ฉันห่อไว้ใน [UIView beginAnimations: nil context: nil]; และ [UIView CommitAnimations]; - ทำให้สั่นน้อยลง
Dustin

2
สำหรับฉันใช้ self.contentSizeForViewInPopover = CGSizeZero; บันทึกบรรทัดและมีผลเช่นเดียวกัน ขอบคุณมาก!
rob5408

ฉันสามารถใช้วิธีนี้ได้ก็ต่อเมื่อฉันเพิ่ม self.contentSizeForPopover = CGSizeZero; ในเมธอด viewWillDisappear ของฉันของ VC ที่ฉันโผล่มา
LightningStryk

18

นี่คือวิธีที่ฉันแก้ไขสำหรับ iOS 7 และ 8:

ใน iOS 8 iOS จะตัดมุมมองที่คุณต้องการในป็อปโอเวอร์ลงในการนำเสนอ ViewController ของตัวควบคุมมุมมองการนำเสนอ ViewController มีวิดีโอ WWDC ปี 2014 ที่อธิบายว่ามีอะไรใหม่ในตัวควบคุมป๊อปโอเวอร์ที่พวกเขาสัมผัสกับสิ่งนี้

อย่างไรก็ตามสำหรับตัวควบคุมมุมมองที่แสดงบนสแต็กตัวควบคุมการนำทางที่ทุกคนต้องการขนาดของตัวเองตัวควบคุมมุมมองเหล่านี้ต้องการ (ภายใต้ iOS 8) เพื่อเรียกรหัสนี้เพื่อตั้งค่าเนื้อหาที่ต้องการแบบไดนามิก:

self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

แทนที่ heightOfTable ด้วยตารางคำนวณหรือความสูงของมุมมอง

เพื่อหลีกเลี่ยงรหัสซ้ำกันจำนวนมากและเพื่อสร้างโซลูชัน iOS 7 และ iOS 8 ทั่วไปฉันจึงสร้างหมวดหมู่บน UITableViewController เพื่อทำงานนี้เมื่อ viewDidAppear ถูกเรียกใน tableview ของฉัน:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    [self setPopOverViewContentSize];
}

Category.h:

#import <UIKit/UIKit.h>

@interface UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize;

@end

หมวดหมู่ m:

#import "Category.h"

@implementation UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize
{
    [self.tableView layoutIfNeeded];
    int heightOfTable = [self.tableView contentSize].height;

    if (heightOfTable > 600)
        heightOfTable = 600;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
            self.preferredContentSize=CGSizeMake(320, heightOfTable);
        else
            self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);
    }
}

@end

เคล็ดลับของคุณพร้อมpresentingViewControllerผลงาน หากฉันตั้งค่าpreferredContentSizeในviewDidLoadมีพฤติกรรมแปลก ๆ : การนำทางกลับจากตัวควบคุมมุมมองอื่นในป๊อปโอเวอร์จะทำให้เกิดการเปลี่ยนแปลงขนาดป็อปโอเวอร์ที่ไม่ถูกต้อง ดูเหมือนว่ามีการตั้งค่าขนาดป็อปโอเวอร์เป็นศูนย์ แต่ขนาดถูกต้อง ในกรณีนี้ป๊อปโอเวอร์จะใช้ความสูงของหน้าจอทั้งหมด คุณรู้หรือไม่ว่าทำไมถึงเป็นเช่นนี้? ฉันไม่มีข้อ จำกัด ในการใช้ 600 คะแนนเพราะจากประสบการณ์ของฉันระบบปฏิบัติการไม่อนุญาตให้คุณระบุขนาดที่สูงกว่าขนาดหน้าจอ
ทดสอบ

ลองใช้ viewDidAppear แทน viewDidLoad เพื่อให้โค้ดดำเนินการเมื่อคุณนำทางสำรองสแต็ก
Wesley Filleman

นั่นคือวิธีที่ฉันใช้ แต่ฉันไม่เข้าใจว่าทำไมมันถึงใช้ไม่ได้ถ้าคุณตั้งค่านี้ในviewDidLoad...
ทดสอบ

1
น่าเสียดายที่นั่นไม่ใช่วิธีที่ Apple เขียน view stack ค่า contentSize เหล่านี้ไม่คงอยู่จริงๆเมื่อ viewController ถูกซ่อนจากมุมมอง นั่นเป็นเหตุผลที่คุณต้อง "เตือน" ป๊อปโอเวอร์ทุกครั้งที่มีมุมมองมาที่โฟร์กราวด์โดยการกดหรือป๊อป คำแนะนำของฉันคือยื่นรายงานข้อบกพร่องกับ Apple หากคุณคิดว่าป๊อปโอเวอร์ควรเก็บข้อมูลนี้ไว้
Wesley Filleman

12

นี่คือการปรับปรุงคำตอบของ krasnyk
วิธีแก้ปัญหาของคุณดีมาก แต่ไม่ได้เป็นภาพเคลื่อนไหวอย่างราบรื่น
การปรับปรุงเล็กน้อยให้ภาพเคลื่อนไหวที่ดี:

ลบบรรทัดสุดท้ายใน- (void) forcePopoverSizeวิธีการ:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
}

ใส่ [self forcePopoverSize] ใน- (void)viewWillAppear:(BOOL)animatedวิธีการ:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self forcePopoverSize];
}

และสุดท้าย - กำหนดขนาดที่ต้องการใน- (void)viewDidAppear:(BOOL)animatedวิธีการ:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

8

คุณต้องตั้งค่าขนาดเนื้อหาอีกครั้งใน viewWillAppearคุณจำเป็นต้องกำหนดขนาดเนื้อหาอีกครั้งในโดยเรียกเมธอด delagate ซึ่งคุณกำหนดขนาดของ popovercontroller ฉันก็มีปัญหาเดียวกัน แต่เมื่อฉันเพิ่มปัญหานี้แก้ไขได้

อีกอย่างหนึ่ง: หากคุณใช้เวอร์ชันเบต้าน้อยกว่า 5 ป๊อปโอเวอร์จะจัดการได้ยากกว่า พวกเขาดูเหมือนจะเป็นมิตรมากขึ้นจากเบต้าเวอร์ชัน 5 เป็นเรื่องดีที่เวอร์ชันสุดท้ายจะออกมา ;)

หวังว่านี่จะช่วยได้


ฉันเกลียดสิ่งนี้เช่นกัน มันติดตาฉันเช่นกัน Apple: ทำไมเราล็อคป๊อปโอเวอร์กับ navcontroller เป็นขนาดที่กำหนดไม่ได้!
ม.ค.

2
การตั้งค่าขนาดเนื้อหาในviewWillAppearไม่ได้ผลสำหรับฉัน การตั้งค่าขนาดของป๊อปโอเวอร์ได้ผลอย่างชัดเจน แต่นั่นก็เป็นสลัม
Ben Zotto

@quixoto ฉันไม่รู้ว่าปัญหาของคุณคืออะไร แต่ฉันยังคงใช้สิ่งเดิมและทำงานได้อย่างสมบูรณ์
Madhup Singh Yadav

5

ใน-(void)viewDidLoadตัวควบคุมมุมมองทั้งหมดที่คุณใช้ในตัวควบคุมการนำทางให้เพิ่ม:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

3

ฉันรีเซ็ตขนาดในเมธอดการเคลื่อนไหว viewWillDisappear: (BOOL) ของตัวควบคุมมุมมองที่ถูกนำทางกลับจาก:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    CGSize contentSize = [self contentSizeForViewInPopover];
    contentSize.height = 0.0;
    self.contentSizeForViewInPopover = contentSize;
}

จากนั้นเมื่อมุมมองที่ถูกนำทางกลับไปปรากฏขึ้นฉันรีเซ็ตขนาดให้เหมาะสม:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGSize contentSize;
    contentSize.width = self.contentSizeForViewInPopover.width;
    contentSize.height = [[self.fetchedResultsController fetchedObjects] count] *  self.tableView.rowHeight;
    self.contentSizeForViewInPopover = contentSize;
}

อืม .. ไม่จำเป็นต้องรีเซ็ต ฉันใส่ self.contentSizeForViewInPopover = self.view.frame.size ใน viewWillAppear ทั้งหมดของตัวควบคุมมุมมองทั้งหมด
เดียว

ฉันจะใส่อะไรสำหรับ fetchedResultsController fetchedObjects ไม่สามารถทำงานนี้ได้
Jules

2

สำหรับ iOS 8 การทำงานดังต่อไปนี้:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.preferredContentSize;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.preferredContentSize = fakeMomentarySize;
    self.navigationController.preferredContentSize = fakeMomentarySize;
    self.preferredContentSize = currentSetSizeForPopover;
    self.navigationController.preferredContentSize = currentSetSizeForPopover;
}

BTW ฉันคิดว่ามันน่าจะเข้ากันได้กับ iOS เวอร์ชันก่อนหน้า ...


ฉันมีปัญหากับแอพใน iOS8 ที่คอมไพล์ด้วย iOS7 sdk สิ่งนี้ได้ผลขอบคุณ
Climbatize

ในการแก้ไขขนาดเมื่อเปลี่ยนการหมุนให้เรียกเมธอดนี้willTransitionToTraitCollectionในanimateAlongsideTransitionบล็อกเสร็จสิ้น
Geva

2
Well i worked out. Have a look.


Made a ViewController in StoryBoard. Associated with PopOverViewController class.


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




See ViewController:


//
//  ViewController.swift
//  iOS8-PopOver
//
//  Created by Alvin George on 13.08.15.
//  Copyright (c) 2015 Fingent Technologies. All rights reserved.
//

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


Note: The func showPopover(base: UIView) method should be placed before ViewDidLoad. Hope it helps !

1

สำหรับฉันวิธีนี้ใช้ได้ผล นี่เป็นวิธีการจากตัวควบคุมมุมมองของฉันซึ่งขยาย UITableViewController และเป็นตัวควบคุมรากสำหรับ UINavigationController

-(void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     self.contentSizeForViewInPopover = self.tableView.bounds.size;
}

และอย่าลืมกำหนดขนาดเนื้อหาสำหรับตัวควบคุมมุมมองที่คุณจะผลักเข้าไปในสแต็กการนำทาง

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
    dc = [[DetailsController alloc] initWithBookmark:[[bookmarksArray objectAtIndex:indexPath.row] retain] bookmarkIsNew:NO];
    dc.detailsDelegate = self;
    dc.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
    [self.navigationController pushViewController:dc animated:YES]; 
 }

1

หากคุณสามารถจินตนาการถึงผู้โจมตีฉันคิดว่าสิ่งนี้ดีกว่าเล็กน้อย:

- (โมฆะ) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = CGSizeMake (0, 0);
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

2
ยิ่งไปกว่านั้นจะใช้CGSizeZeroแทนการทำด้วยตัวเองในCGSizeMake(0,0)
Julian Król

1

คำตอบที่ได้รับการยอมรับไม่ได้ปรับการทำงานกับ iOS 8. สิ่งที่ฉันไม่ได้รับการสร้างคลาสย่อยของตัวเองUINavigationControllerเพื่อใช้ในการ popover ที่และแทนที่วิธีpreferredContentSizeในลักษณะนี้:

- (CGSize)preferredContentSize {
    return [[self.viewControllers lastObject] preferredContentSize];
}

ยิ่งไปกว่านั้นแทนที่จะเรียกforcePopoverSize(วิธีการดำเนินการโดย @krasnyk) ในviewDidAppearฉันตัดสินใจที่จะตั้งค่า viewController (ซึ่งแสดง popover) เป็นตัวแทนสำหรับการนำทางที่กล่าวถึงก่อนหน้านี้ (ใน popover) และ do (วิธีการบังคับทำอะไร) ใน:

-(void)navigationController:(UINavigationController *)navigationController
      didShowViewController:(UIViewController *)viewController 
                   animated:(BOOL)animated  

viewControllerวิธีการสำหรับผู้ร่วมประชุมผ่าน สิ่งหนึ่งที่สำคัญทำforcePopoverSizeในวิธีการที่ดีถ้าคุณไม่จำเป็นต้องมีการเคลื่อนไหวที่จะต้องเรียบถ้าเป็นเช่นนั้นแล้วจะทิ้งไว้ในUINavigationControllerDelegateviewDidAppear


ทำไมลงคะแนน? อาจมีข้อเสนอแนะบางอย่างที่แตกต่างจากความไม่เห็นด้วย :)
Julian Król

สวัสดี @ JulianKrólคุณสามารถดูstackoverflow.com/questions/28112617/…นี้ได้ไหมฉันมีปัญหาเดียวกัน
Ranjit

ขอบคุณสิ่งนี้ช่วยฉันได้ อาจต้องการทำให้ชัดเจนที่ด้านบนของความคิดเห็นของคุณว่าปัญหาคือคุณต้องอัปเดต navigationController recommendedContentSize รวมทั้ง visibleVC ที่ต้องการContentSize ดังนั้นการตั้งค่าทั้งสองอย่างก็ใช้งานได้โดยตรงเช่นกัน
Michael Kernahan

0

ฉันประสบปัญหาเดียวกัน แต่คุณไม่ต้องการตั้งค่าเนื้อหาในเมธอด viewWillAppear หรือ viewWillDisappear

AirPrintController *airPrintController = [[AirPrintController alloc] initWithNibName:@"AirPrintController" bundle:nil];
airPrintController.view.frame = [self.view frame];
airPrintController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
[self.navigationController pushViewController:airPrintController animated:YES];
[airPrintController release];

ตั้งค่าคุณสมบัติ contentSizeForViewInPopover สำหรับคอนโทรลเลอร์นั้นก่อนที่จะดันคอนโทรลเลอร์นั้นไปยัง navigationController


0

ฉันโชคดีโดยใส่สิ่งต่อไปนี้ในมุมมองปรากฏขึ้น:

[self.popoverController setPopoverContentSize:self.contentSizeForViewInPopover animated:NO];

แม้ว่าสิ่งนี้อาจไม่เคลื่อนไหวอย่างสวยงามในกรณีที่คุณกำลังผลัก / เปิดป๊อปโอเวอร์ขนาดต่างๆ แต่ในกรณีของฉันใช้งานได้ดี!


0

สิ่งที่คุณต้องทำคือ:

- ในเมธอด viewWillAppear ของ popOvers contentView ให้เพิ่มข้อมูลโค้ดที่ระบุด้านล่าง คุณจะต้องระบุขนาดของ popOver เป็นครั้งแรกเมื่อโหลด

CGSize size = CGSizeMake(width,height);
self.contentSizeForViewInPopover = size;

0

ฉันมีปัญหานี้กับตัวควบคุมป๊อปโอเวอร์ที่มี popoverContentSize = CGSizeMake (320, 600) ในตอนเริ่มต้น แต่จะใหญ่ขึ้นเมื่อนำทางผ่าน ContentViewController (UINavigationController)

ตัวควบคุมการนำทางเป็นเพียงการผลักดันและเปิด UITableViewControllers ที่กำหนดเองดังนั้นในคลาส viewDidLoad ของตัวควบคุมมุมมองตารางที่กำหนดเองของฉันฉันตั้งค่า self.contentSizeForViewInPopover = CGSizeMake (320, 556)

พิกเซลที่น้อยกว่า 44 พิกเซลจะต้องคำนึงถึงแถบนำทางของตัวควบคุม Nav และตอนนี้ฉันก็ไม่มีปัญหาอีกต่อไป


0

ใส่สิ่งนี้ไว้ในตัวควบคุมมุมมองทั้งหมดที่คุณกำลังผลักดันภายในป๊อปโอเวอร์

CGSize currentSetSizeForPopover = CGSizeMake(260, 390);
CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,
                                      currentSetSizeForPopover.height - 1.0f);
self.contentSizeForViewInPopover = fakeMomentarySize;
self.contentSizeForViewInPopover = currentSetSizeForPopover;

ในเมธอด viewwillAppear และ currentSetSizeForPopover กำหนดขนาดที่คุณต้องการ
alok

0

ประสบปัญหาเดียวกันและแก้ไขโดยการตั้งค่าขนาดมุมมองเนื้อหาเป็นตัวควบคุมการนำทางและตัวควบคุมมุมมองก่อนที่จะวาง UIPopoverController

     CGSize size = CGSizeMake(320.0, _options.count * 44.0);
    [self setContentSizeForViewInPopover:size];
    [self.view setFrame:CGRectMake(0.0, 0.0, size.width, size.height)];
    [navi setContentSizeForViewInPopover:size];

    _popoverController = [[UIPopoverController alloc] initWithContentViewController:navi];

0

ฉันแค่อยากจะเสนอวิธีแก้ปัญหาอื่นเนื่องจากสิ่งเหล่านี้ไม่ได้ผลสำหรับฉัน ...

ฉันใช้มันกับhttps://github.com/nicolaschengdev/WYPopoverController

เมื่อคุณเรียกป๊อปอัปครั้งแรกให้ใช้สิ่งนี้

if ([sortTVC respondsToSelector:@selector(setPreferredContentSize:)]) {
   sortTVC.preferredContentSize = CGSizeMake(popoverContentSortWidth,
        popoverContentSortHeight);
}
else 
{
   sortTVC.contentSizeForViewInPopover = CGSizeMake(popoverContentSortWidth, 
        popoverContentSortHeight);
}

จากนั้นในป๊อปอัปนั้นให้ใช้สิ่งนี้

-(void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:YES];

  if ([self respondsToSelector:@selector(setPreferredContentSize:)]) {
    self.preferredContentSize = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
  else 
  {
    self.contentSizeForViewInPopover = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
}

-(void)viewDidDisappear:(BOOL)animated {
 [super viewDidDisappear:YES];

self.contentSizeForViewInPopover = CGSizeZero;

}

จากนั้นทำซ้ำสำหรับมุมมองเด็ก ...


0

นี่เป็นวิธีที่ถูกต้องใน iOS7 ในการดำเนินการตั้งค่าขนาดเนื้อหาที่ต้องการใน viewDidLoad ในตัวควบคุมมุมมองแต่ละตัวในสแต็กการนำทาง (ทำได้เพียงครั้งเดียว) จากนั้นใน viewWillAppear จะได้รับการอ้างอิงถึงตัวควบคุมป็อปโอเวอร์และอัปเดต contentSize ที่นั่น

-(void)viewDidLoad:(BOOL)animated
{
    ...

    self.popoverSize = CGSizeMake(420, height);
    [self setPreferredContentSize:self.popoverSize];
}

-(void)viewWillAppear:(BOOL)animated
{
    ...

    UIPopoverController *popoverControllerReference = ***GET REFERENCE TO IT FROM SOMEWHERE***;
    [popoverControllerReference setPopoverContentSize:self.popoverSize];
}

0

โซลูชัน @krasnyk ทำงานได้ดีใน iOS เวอร์ชันก่อนหน้า แต่ไม่ทำงานใน iOS8 วิธีแก้ปัญหาต่อไปนี้ใช้ได้ผลสำหรับฉัน

    - (void) forcePopoverSize {
        CGSize currentSetSizeForPopover = self.preferredContentSize;
       //Yes, there are coupling. We need to access the popovercontroller. In my case, the popover controller is a weak property in the app's rootVC.
        id mainVC = [MyAppDelegate appDelegate].myRootVC;
        if ([mainVC valueForKey:@"_myPopoverController"]) {
            UIPopoverController *popover = [mainVC valueForKey:@"_myPopoverController"];
            [popover setPopoverContentSize:currentSetSizeForPopover animated:YES];
        }
    }

ไม่ใช่ทางออกที่ดีที่สุด แต่ได้ผล

UIPopoverPresentationController ใหม่ยังมีปัญหาในการปรับขนาด :(


1
บางทีแทนที่จะเข้าถึงตัวควบคุมมุมมองจากคุณสมบัติ AppDelegate ให้พิจารณาวิธีแก้ปัญหาของฉัน (ดูเหมือนจะสะอาดกว่า)
Julian Król

ใช่นี่เป็นวิธีแก้ปัญหาที่เร็วที่สุดโดยไม่ต้องแก้ไขโค้ดเบสที่มีอยู่ของฉัน Btw vl ลองวิธีแก้ปัญหา
Clement Prem

0

คุณต้องตั้งค่าpreferredContentSizeคุณสมบัติของ NavigationController ในviewWillAppear:

-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.preferredContentSize = CGSizeMake(320, 500);}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.