2016-10-05 11 views
0

私は基本的なUIViewサブクラスを新しいXcodeで設定していて、奇妙な動作に遭遇しました。サブクラス化されたビューは一見正常にロードするように表示されます。Xcode 8 - Autolayouts Issue

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
     if (self) { 
      [self baseInit]; 
} 
    return self; 
} 
- (void)awakeFromNib 
{ 
    [super awakeFromNib]; 
    [self baseInit]; 
} 

私は、私は1つを所有してiPhone 6の大きさに設定され、ストーリーボード内の別のコンテナビューを構築するために始めました。非常に少ないオブジェクトで少し複雑なレイアウトになっていましたが、制約を設定してもレイアウトがずれていました。

私はXcodeのアップグレード後に問題がどこにあるかを見るために、簡単なビューで実験を始めました。

2つのUIViewでの簡単なエクササイズ。

enter image description here

優先設定は、各制約する1000に設定し、デバイスがiPhone 6Sに設定しました。 enter image description here

しかし、iPhone 6 /秒の結果や自分のデバイスiPhone 6がシフトしている:

enter image description here

私は周りいじるし始めたときに、私は次の場合には、iPhoneにストーリーボードデバイスを設定することを発見しましたSEは、それは、iPhone 6シミュレータとiPhone 6デバイスの両方に正しくコンテンツが表示されます:

enter image description here enter image description here

設定が間違っています。私は新しいXcodeバージョンで何かを見逃してしまったのですか?オートレイアウトと制約を扱う方法は?

baseInitがUIViewsとフレームサイズで何かをやっている場合は、viewDidLayoutSubviews内で呼び出す必要がありますあなたの A.

答えて

2

ありがとうございます。これは、ビューの制約に従ってビューがレイアウトされた後に呼び出されます。

static dispatch_once_t oncePerLoadToken; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    oncePerLoadToken = 0; 
} 

- (void)viewDidLayoutSubviews { 
    dispatch_once(&oncePerLoadToken, ^{ 
     [self baseInit]; 
    }); 
} 
+0

ありがとう、それはトリックでした! – Alessign