今まで XCode 6 を使用していても、コントロールを .xib ファイルのトップ レイアウト ガイドに揃えることができませんでした。代わりに、別の方法を使用しています。
まず、インターフェイスビルダーで、コントロールをビューコントローラーのビューの上部境界線に合わせます。
次に、viewDidLoad メソッドで、いくつかの制約を置き換えて、メイン ビューではなくトップ レイアウト ガイドに合わせます。
- (void)viewDidLoad
{
[super viewDidLoad];
NSArray *constraints = self.view.constraints;
for (NSLayoutConstraint *constraint in constraints) {
if ( (constraint.firstItem == self.view) && (constraint.firstAttribute == NSLayoutAttributeTop) ) {
NSLayoutConstraint *newConstraint = [self constraint:constraint replaceFirstItemBy:self.topLayoutGuide attribute:NSLayoutAttributeBottom];
[self.view removeConstraint:constraint];
[self.view addConstraint:newConstraint];
} else if ( (constraint.secondItem == self.view) && (constraint.secondAttribute == NSLayoutAttributeTop) ) {
NSLayoutConstraint *newConstraint = [self constraint:constraint replaceSecondItemBy:self.topLayoutGuide attribute:NSLayoutAttributeBottom];
[self.view removeConstraint:constraint];
[self.view addConstraint:newConstraint];
}
}
}
- (NSLayoutConstraint*)constraint:(NSLayoutConstraint*)constraint replaceFirstItemBy:(id)newItem attribute:(NSLayoutAttribute)newAttribute {
UILayoutPriority priority = constraint.priority;
NSLayoutRelation relation = constraint.relation;
id secondItem = constraint.secondItem;
NSLayoutAttribute secondAttribute = constraint.secondAttribute;
CGFloat multiplier = constraint.multiplier;
CGFloat constant = constraint.constant;
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:newItem attribute:newAttribute relatedBy:relation toItem:secondItem attribute:secondAttribute multiplier:multiplier constant:constant];
newConstraint.priority = priority;
return newConstraint;
}
- (NSLayoutConstraint*)constraint:(NSLayoutConstraint*)constraint replaceSecondItemBy:(id)newItem attribute:(NSLayoutAttribute)newAttribute {
UILayoutPriority priority = constraint.priority;
id firstItem = constraint.firstItem;
NSLayoutAttribute firstAttribute = constraint.firstAttribute;
NSLayoutRelation relation = constraint.relation;
CGFloat multiplier = constraint.multiplier;
CGFloat constant = constraint.constant;
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:firstItem attribute:firstAttribute relatedBy:relation toItem:newItem attribute:newAttribute multiplier:multiplier constant:constant];
newConstraint.priority = priority;
return newConstraint;
}
インターフェイスビルダーで定義したオブジェクトを置き換えるため、これは最善の方法ではないと考えてください。しかし、それは私たちが考えることができる別の方法かもしれません.