2014-02-16 15 views
9

Ich habe eine UIPageViewController Unterklasse, und in seiner viewDidLoad möchte ich eine UILabel zu seiner self.view hinzufügen. Das funktioniert gut, wenn ich seine Position Frames verwenden, aber wenn ich versuche, es zu positionieren Auto-Layout verwenden, erhalte ich:Wie positioniere ich eine Unteransicht in UIPageViewController mit Auto Layout?

* Assertionsfehler in - [_ UIPageViewControllerContentView layoutSublayersOfLayer:]/SourceCache/UIKit_Sim/UIKit -2.935,58/UIView.m: 8742

Wie soll ich dieses UILabel positionieren in der UIPageViewController zu zeigen?

+0

diese Behauptung Unter der Annahme wegen eines Constraint Konflikt, hast du noch translatesAutoresizingMaskIntoConstraints = NO? –

+0

Ja, ich erinnere mich daran. –

+1

Wird nach der Ausführung von -layoutSubviews auch die Meldung "Auto-Layout ist noch erforderlich?" Angezeigt? – Moonwalkr

Antwort

7

Dies scheint zu geschehen, weil UIPageViewController 's Ansicht (die eigentlich eine _UIPageViewControllerContentView ist) nicht Subviews und Autolayout wie erwartet behandelt (zumindest in iOS 7; es funktionierte gut für mich in iOS 8).

Sie können umgehen, indem Sie nicht automatisches Layout verwenden, aber ich wollte Auto-Layout verwenden, so endete ich meine Ansicht-Controller neu zu erstellen, um das Hinzufügen von Unteransichten zu UIPageViewController zu vermeiden.

Anstelle der Unterklasse UIPageViewController habe ich einen Containeransicht-Controller (eine Unterklasse von UIViewController) mit einem UIPageViewController als untergeordneten Ansichtscontroller erstellt. Die benutzerdefinierten Teilansichten, die ich ursprünglich in UIPageViewController hatte, wurden dann zum view des Containers hinzugefügt. Ich machte auch den Container zur Datenquelle und Delegierten für die UIPageViewController.

Es gibt einen verwandten Thread, bei dem die Leute den gleichen Assertionsfehler haben, aber mit einem UITableViewCell: "Auto Layout still required after executing -layoutSubviews" with UITableViewCell subclass. Die meisten Vorschläge dort funktionieren nicht oder sind nicht auf UIPageViewController anwendbar, aber es half mir herauszufinden, warum das Hinzufügen von Subviews mit Auto-Layout möglicherweise ein Problem verursacht.

1

Sie können auch UIPageViewController Unterklasse und diese Problemumgehung implementieren:

#import <objc/runtime.h> 

@interface MyPageViewController : UIPageViewController 
@end 

@implementation MyPageViewController 
- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [self applyLayoutSubviewsWorkaroundIfNeeded]; 
} 

- (void)applyLayoutSubviewsWorkaroundIfNeeded { 
    // UIPageViewController does not support AutoLayout in iOS7, we get the following runtime error 
    // "_UIPageViewControllerContentView’s implementation of -layoutSubviews needs to call super…" 
    // This workaround calls the missing layoutSubviews method of UIView. 
    if ([self iOSVersionIsLowerThan8]) { 
     IMP uiviewLayoutSubviewsImplementation = class_getMethodImplementation([self.view class], @selector(layoutSubviews)); 
     typedef void (*FunctionFromImplementation)(id, SEL); 
     FunctionFromImplementation uiviewLayoutSubviewsFunction = (FunctionFromImplementation)uiviewLayoutSubviewsImplementation; 
     uiviewLayoutSubviewsFunction(self.view, @selector(layoutSubviews)); 
    } 
} 

- (BOOL)iOSVersionIsLowerThan8 { 
    // This is just one way of checking if we are on iOS7. 
    // You can use whatever method suits you best 
    return ![self respondsToSelector(popoverPresentationController)]; 
} 
@end 
Verwandte Themen