回答:
私も同じ問題を抱えていました。しかし、私はそれを解決しました。
はい、UIView
Xcode 4.3以降でデフォルトで設定されているxibまたはストーリーボード全体に対して無効にする代わりに、特定のの実行時に自動レイアウトを無効にすることができます。
サブビューのフレームを設定する前translatesAutoresizingMaskIntoConstraints
にYES
、に設定します。
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
Autolayoutが実行時にフレーム設定の一部を上書きするという同様の問題がありました(場合によっては、新しいビューコントローラーを押す動的ビューがありました...押してから[戻る]を押すと、初期ビューがリセットされます)。
これを回避するにviewDidLayoutSubviews
は、View Controllerに操作コードを配置しました。これは、mojoが呼び出された後、viewDidAppearの前に呼び出されるように見えるため、ユーザーは賢明ではありません。
iOS 8では、NSLayoutConstraintをアクティブにするかどうかを設定できます。したがって、インターフェイスビルダーを使用している場合は、すべての制約をOutletCollectionに追加してから、以下を使用してアクティブ化または非アクティブ化します。
NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
ここで使用している特定のアプリケーションは、縦長モードと横長モードで異なる制約があり、デバイスの回転に基づいてアクティブ化/非アクティブ化します。つまり、両方の方向のインターフェイスビルダーですべて複雑なレイアウト変更を作成でき、詳細な自動レイアウトコードがなくても自動レイアウトを使用できます。
または、removeConstraintsおよびaddConstraintsを使用してアクティブ化/非アクティブ化できます。
これが他の人に役立つかどうかはわかりませんが、これを便利にするためのカテゴリを作成しました。
UIView + DisableAutolayoutTemporarily.h
#import <UIKit/UIKit.h>
@interface UIView (DisableAutolayoutTemporarily)
// the view as a parameter is a convenience so we don't have to always
// guard against strong-reference cycles
- (void)resizeWithBlock:(void (^)(UIView *view))block;
@end
UIView + DisableAutolayoutTemporarily.m
#import "UIView+DisableAutoResizeTemporarily.h"
@implementation UIView (DisableAutoResizeTemporarily)
- (void)resizeWithBlock:(void (^)(UIView * view))block
{
UIView *superview = self.superview;
[self removeFromSuperview];
[self setTranslatesAutoresizingMaskIntoConstraints:YES];
__weak UIView *weakSelf = self;
block(weakSelf);
[superview addSubview:self];
}
@end
私はそれを次のように使用します:
[cell.argumentLabel resizeWithBlock:^(UIView *view) {
[view setFrame:frame];
}];
それが役に立てば幸い。
一部のビューで自動レイアウトを使用する場合は、複数のストーリーボードに分割できます。
これは、ストーリーボードまたはxibファイルのないプロジェクトで発生しました。すべて100%コード。下部に広告バナーがあり、ビュー境界が広告バナーで止まるようにしたかった。ロード後、ビューは自動的にサイズを変更します。このページのすべての解決策を試しましたが、どれもうまくいきませんでした。
高さを短くしてサブビューを作成し、コントローラーのメインビューに配置しました。次に、すべてのコンテンツがサブビュー内に移動しました。それは、穀物に反するようなことをすることなく、問題を非常に簡単に解決しました。
ウィンドウを埋める通常のサイズではないビューが必要な場合は、そのためにサブビューを使用する必要があると考えています。
自動レイアウトを無効にする代わりに、置き換えるフレームで新しい制約を計算します。それは私には適切な方法であるように見えます。制約に依存するコンポーネントを調整する場合は、それに応じて調整します。
たとえば、2つのビュー(myViewとotherView)の間に垂直方向の制約0があり、パンジェスチャーまたはmyViewの高さを調整するものがある場合、調整した値で制約を再計算できます。
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];