2012-08-06 16 views
17

Ich habe eine UIViewController namens HomeViewController und es hat ein Modell, das eine Reihe von Daten enthält. HomeViewController hat auch eine Taste, die beim Drücken eine UITableViewController zeigt, die das Datenfeld des Modells anzeigt.Wo wird die Popover-Größe eingestellt?

Meine Frage ist, was ist der Standard/beste Weg, um die Größe des Popover zu setzen? Ich möchte nur, dass das Popover groß genug ist, um die Daten anzuzeigen, aber nicht größer. Was ist gängige Praxis? Ich nehme an, dass ich irgendwann contentSizeForViewInPopover einstellen muss, aber ich bin nicht sicher wo ... In der viewDidLoad Methode der Popover-Klasse? In der prepareForSegue Methode?

Hier ist der Code, den ich bisher habe: (Beachten Sie, dass DataPresentingViewController mein popover View-Controller CLASS` ist)

//In HomeViewController 
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if([segue.destinationViewController isKindOfClass:[DataPresentingViewController class]]) 
    { 
     DataPresentingViewController *dest = (DataPresentingViewController *) segue.destinationViewController; 
     dest.mySavedData = self.myModel.mySavedData; 
    } 
} 

Ich weiß, dass ich nur die contentSizeForViewInPopover hier im prepareForSegue Verfahren festsetzen könnte; Dies scheint jedoch etwas zu sein, mit dem sich die Popover-Klasse beschäftigen sollte.

+0

Es wurde eine Lösung hinzugefügt, die eine generische Möglichkeit zur Verfügung stellt, um ein Popover auf eine beliebige TableView-Größe zu skalieren. – memmons

Antwort

21

gesetzt contentSizeForViewInPopover in ViewDidLoad Verfahren in HomeViewController

+13

-contentSizeForViewInPopover: ist in iOS 7 veraltet. Verwenden Sie -setPopoverContentSize: animated: stattdessen. – auco

+18

Ich glaube, der Ersatz für den Anruf ist setPreferredContentSize: –

1

Es sieht so aus, als ob Sie es programmgesteuert machen möchten, aber im Storyboard, bevor Sie einen View-Controller an ein Segment anschließen, gibt es unter dem Attribute-Inspektor ein "Popover, explizite Größe verwenden". Vielleicht können Sie die Größe, die am besten für Ihre App funktioniert, zuerst festlegen und sich keine Sorgen über die Größe machen, wenn Sie Code verwenden. Hoffe, das hilft, lassen Sie uns wissen, wie es geht.

+0

Das Problem ist, dass mein Modell jedes Mal, wenn die App ausgeführt wird, eine andere Größe hat, daher kann ich keine explizite Größe finden – Nosrettap

+0

@Nosrettap, Ja das würde überhaupt nicht funktionieren, wenn es sich ändert. Nun, dachte ich würde es zumindest versuchen. Halten Sie uns auf dem Laufenden, was Sie tun, würde ich gerne herausfinden. – Douglas

3

Stolperte über Ihre Frage heute. Hast du es gelöst?

Haben Sie versucht:

setPopoverContentSize:<#(CGSize)#> animated:<#(BOOL)#> 

in Ihrem segue Logikblock. Nützlich, wenn Sie möchten, dass die Popover-Größe basierend auf einem Datensatz oder einer Anzeigeposition oder was auch immer variiert.

gut sein.

1

Versuchen Sie, den folgenden Code:

- (IBAction)setData:(id)sender 
{ 
    UIViewController *popoverContent=[[UIViewController alloc] init]; 
    UITableView *tableView=[[UITableView alloc] initWithFrame:CGRectMake(265, 680, 0, 0) style:UITableViewStylePlain]; 

    UIView *popoverView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)]; 

    popoverView.backgroundColor=[UIColor whiteColor]; 

    popoverContent.view=popoverView; 
    popoverContent.contentSizeForViewInPopover=CGSizeMake(200, 420);//setting the size 
    popoverContent.view=tableView; 
    tableView.delegate=self; 
    tableView.dataSource=self; 

    self.popoverController=[[UIPopoverController alloc] initWithContentViewController:popoverContent]; 
    [self.popoverController presentPopoverFromRect:CGRectMake(400, 675, 0, 0) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES]; 
} 
1

Ein wenig bekannter Trick, um Ihre UIPopoverViewController Dimensionierung der Höhe Ihres UITableView anzupassen ist die rectForSection Methode des Tableview zu verwenden, um gib dir die Höhe. Verwenden Sie die Höhe Ihrer Viewcontroller des contentSizeForViewInPopover wie folgt aus:

- (CGSize)contentSizeForViewInPopover { 
    // Currently no way to obtain the width dynamically before viewWillAppear. 
    CGFloat width = 200.0; 
    CGRect rect = [self.tableView rectForSection:[self.tableView numberOfSections] - 1]; 
    CGFloat height = CGRectGetMaxY(rect); 
    return (CGSize){width, height}; 
} 
56

Ab iOS7 contentSizeForViewInPopover ist veraltet. Sie sollten stattdessen UIViewController 's preferredContentSize Eigenschaft verwenden.

Hoffe, das hilft!

+1

Dies scheint nicht zu funktionieren, wenn Sie ein Popover einen UINavigationController präsentieren. Mein zweiter View-Controller setzt diesen Wert zurück, wird aber nicht angepasst. Es nimmt nur den Wert des Root-View-Controllers aus irgendeinem Grund. – LightningStryk

+2

Dieser Wert kann auch in IB gesetzt werden: ** ViewControllers Attribute Inspector ** '>>' Content Size '' '** Verwendete bevorzugte explizite Größe ** – Besi

+0

Diese Antwort sollte wirklich akzeptiert werden. – tomas789

6

contentSizeForViewInPopover wird in IOS 7
Die Eigenschaft veraltet: popoverContentSize von UIPopoverController repräsentiert die Größe der Seitenansicht, die von der Steuerung in der contentViewController Eigenschaft UIPopoverController verwaltet wird.
Reference

Der Vorteil ist, dass es in iOS 3.2 und später verfügbar ist, so müssen Sie Ihre UIPopOverController Objektinstanz nicht Geräteversion jedes Mal überprüfen, ersetzen Sie einfach contentSizeForViewInPopover Methode mit.

2

// self.contentSizeForViewInPopover = CGSizeMake (320.0, 600.0); // Veraltet in ios7

self.preferredContentSize = CGSizeMake (320.0, 600.0); // stattdessen verwendet

Verwandte Themen