フレームをプログラムで操作する必要があるビューがあります。これは、フレームの原点を操作してスーパービューの周りをスクロールおよびズームするコンテンツにラップする一種のドキュメント ビューです。自動レイアウトは実行時にこれと戦います。
自動レイアウトを完全に無効にすることは、他のビューのレイアウトを処理するために合理的に使用できるため、少し厳しいように思えます。私が望むのは、ある種の「null制約」のようです。
フレームをプログラムで操作する必要があるビューがあります。これは、フレームの原点を操作してスーパービューの周りをスクロールおよびズームするコンテンツにラップする一種のドキュメント ビューです。自動レイアウトは実行時にこれと戦います。
自動レイアウトを完全に無効にすることは、他のビューのレイアウトを処理するために合理的に使用できるため、少し厳しいように思えます。私が望むのは、ある種の「null制約」のようです。
私も同じ問題を抱えていました。しかし、私はそれを解決しました。はい、 Xcode 4.3 以降でデフォルトで設定されている xib またはストーリーボード全体に対して自動レイアウトを無効にする代わりに
、特定の に対して実行時に自動レイアウトを無効にすることができます。UIView
サブビューのフレームを設定する前に、に設定しtranslatesAutoresizingMaskIntoConstraints
ます。YES
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
Autolayout が実行時にフレーム設定の一部をオーバーライドするという同様の問題がありました (場合によっては新しいビュー コントローラーをプッシュする動的ビューがありました...プッシュしてから [戻る] を押すと初期ビューがリセットされます)。
viewDidLayoutSubviews
ビューコントローラーに操作コードを入れることで、これを回避しました。これは、constraint mojo が呼び出された後、viewDidAppear の前に呼び出されるように見えるため、ユーザーはそれほど賢くありません。
おそらく、に設定translatesAutoresizingMaskIntoConstraints
するだけでYES
(そのビューに影響する追加の制約を追加しないで)、自動レイアウト システムと戦うことなくフレームを設定できます。
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/storyboard で必要な UIView のユーザー定義のランタイム属性でtranslatesAutoresizingMaskIntoConstraints
type 、Value Yesを設定できます。Boolean
私の見解では、ラベルとテキストがありました。ラベルにはパン ジェスチャがありました。ドラッグ中にラベルがうまく動きます。しかし、テキスト ボックス キーボードを使用すると、ラベルの位置が自動レイアウトで定義された元の位置にリセットされます。ラベルにswiftで以下を追加すると、問題は解決しました。これを viewWillAppear に追加しましたが、ターゲット フィールドにアクセスできるほとんどの場所に追加できます。
self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
一部のビューで自動レイアウトを使用する場合は、複数のストーリーボードに分割できます。
私にとっては、プログラムでサブビューを作成することができました.私の場合、自動レイアウトは、その中心を中心に回転する必要があるビューをいじっていましたが、プログラムでこのビューを作成すると、機能しました.
自動レイアウトを無効にする代わりに、置き換えるフレームで新しい制約を計算するだけです。それは私には適切な方法のようです。拘束に依存するコンポーネントを調整する場合は、それに応じて調整します。
たとえば、2 つのビュー (myView と otherView) の間に 0 の垂直制約があり、パン ジェスチャまたは myView の高さを調整する何かがある場合、調整された値で制約を再計算できます。
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
自動レイアウトを使用している方は、こちらのソリューションをご覧ください。@IBOutlet
調整したい制約を作成してから、それらの定数を変更する必要があります。
xib ファイルの場合: