2015-01-12 14 views
12

Ich habe eine separate .xib erstellt, weil ich eine UIView mit autolayout außerhalb eines ViewController entwerfen wollte. Ich erstellte die .xib, fügte die UIView und die Einschränkungen mit wCompact hRegular hinzu. Einfach.UIView in XIB mit Auto-Layout ist immer 600x600

enter image description here

Dann fügen Sie es zu meinem viewController in viewDidLoad:

UIView *header = [[[NSBundle mainBundle] loadNibNamed:@"HeaderSearch" owner:self options:nil] lastObject]; 
NSLog(@"%@", NSStringFromCGRect(header.frame)); 
[self.view addSubview:header]; 

Aber, wenn es hinzugefügt wird, die Rahmengröße 600x600 und ich kann nicht herausfinden, warum.

Was habe ich hier falsch gemacht, dass diese seltsame Größe zwingt?

+0

Welche Rahmengröße erwartest du es sein? – gabbler

+0

Kannst du seine Höhe und Breite wahrscheinlich mit einer Beschränkung festlegen? Ich nehme an, der Screenshot zeigt die richtige Bildgröße? –

+0

@gabbler - ich hatte gehofft, dass es durch die Breite des Super 130 groß sein, aber nicht sicher, ob ich mit einem separaten xib tun ... –

Antwort

9

Sie benötigen 'Use Größenklassen' in Ihrem xib

uncheck size classes

und die Aussicht Rahmengröße wird derjenige sein, der euch und nicht 600x600

+0

Aber warum zur Hölle existiert dieses Problem? Ich war auch verrückt! Wenn ich Größenklassen verwendet habe, dann sollte ich in der Lage sein, die Ansicht entsprechend den Größenklassen einzustellen. Gibt es einen Grund dafür? – Developer

+1

Und wie wird die Höhe des Views bei verschiedenen iPhones verwaltet? – Developer

+1

Und wenn ich Größenklassen verwenden möchte ?! –

2

Bitte beachten Sie diese.

header.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview:header]; 

NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:header attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0]; 
[self.view addConstraint:widthConstraint]; 

NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:header attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:130.0]; 
[self.view addConstraint:widthConstraint]; 
[self.view addConstraint:heightConstraint]; 
1

deaktivieren, wenn es Xcode 8 Deaktivieren Sie "Use Trait Variations"

enter image description here

+4

aber dann verliere ich die "Sicht als" iPad Möglichkeiten; ist das sicher der Weg zu gehen? – swalkner

0

Ich hatte ein ähnliches Problem, aber in meinem Fall habe ich nicht gerne Merkmalsvariationen oder Größenklassen deaktiviert. Ich lade auch einige Ansichten von XIBs aber ich benutze diese handliche Helfer Kategorie:

@implementation UIView (Initialization) 

+ (instancetype)instantiateFromNib { 
    return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject]; 
} 

@end 

Ich möchte nicht Zwänge in einem Code geschrieben einzuführen, um ein außer Kraft gesetzt viewWillLayoutSubviews Methode meiner Ansicht-Controller hinzugefügt wie folgt vor:

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [self.firstView setFrame:self.view.bounds]; 
    [self.secondView setFrame:self.view.bounds]; 
} 

In meinem Fall firstView und secondView sind nur ein Overlay für die gesamte Ansicht Controller.