107

フレームをプログラムで操作する必要があるビューがあります。これは、フレームの原点を操作してスーパービューの周りをスクロールおよびズームするコンテンツにラップする一種のドキュメント ビューです。自動レイアウトは実行時にこれと戦います。

自動レイアウトを完全に無効にすることは、他のビューのレイアウトを処理するために合理的に使用できるため、少し厳しいように思えます。私が望むのは、ある種の「null制約」のようです。

4

14 に答える 14

171

私も同じ問題を抱えていました。しかし、私はそれを解決しました。はい、 Xcode 4.3 以降でデフォルトで設定されている xib またはストーリーボード全体に対して自動レイアウトを無効にする代わりに
、特定の に対して実行時に自動レイアウトを無効にすることができます。UIView

サブビューのフレームを設定する前に、に設定しtranslatesAutoresizingMaskIntoConstraintsます。YES

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
于 2013-03-06T08:10:04.353 に答える
50

Autolayout が実行時にフレーム設定の一部をオーバーライドするという同様の問題がありました (場合によっては新しいビュー コントローラーをプッシュする動的ビューがありました...プッシュしてから [戻る] を押すと初期ビューがリセットされます)。

viewDidLayoutSubviewsビューコントローラーに操作コードを入れることで、これを回避しました。これは、constraint mojo が呼び出された後、viewDidAppear の前に呼び出されるように見えるため、ユーザーはそれほど賢くありません。

于 2012-11-28T20:02:58.700 に答える
30

おそらく、に設定translatesAutoresizingMaskIntoConstraintsするだけでYES(そのビューに影響する追加の制約を追加しないで)、自動レイアウト システムと戦うことなくフレームを設定できます。

于 2012-09-21T21:02:15.440 に答える
17

iOS 8 では、NSLayoutConstraint をアクティブにするかどうかを設定できます。したがって、インターフェイス ビルダーを使用している場合は、すべての制約を OutletCollection に追加し、次を使用してアクティブ化または非アクティブ化します。

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)

ここで使用している特定のアプリケーションは、縦向きモードと横向きモードで異なる制約があり、デバイスの回転に基づいてアクティブ化/非アクティブ化します。これは、複雑なレイアウトの変更をインターフェイス ビルダーで両方の方向に対して作成し、冗長な自動レイアウト コードを使用せずに自動レイアウトを使用できることを意味します。

または、removeConstraints と addConstraints を使用してアクティブ化/非アクティブ化できます。

于 2014-12-31T21:09:50.107 に答える
9

これが他の人に役立つかどうかはわかりませんが、これを便利にするためにカテゴリを書きました。

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];
}];

それが役に立てば幸い。

于 2014-07-01T02:40:42.200 に答える
6

xib/storyboard で必要な UIView のユーザー定義のランタイム属性でtranslatesAutoresizingMaskIntoConstraintstype 、Value Yesを設定できます。Boolean

于 2014-03-11T18:41:39.850 に答える
3

私の見解では、ラベルとテキストがありました。ラベルにはパン ジェスチャがありました。ドラッグ中にラベルがうまく動きます。しかし、テキスト ボックス キーボードを使用すると、ラベルの位置が自動レイアウトで定義された元の位置にリセットされます。ラベルにswiftで以下を追加すると、問題は解決しました。これを viewWillAppear に追加しましたが、ターゲット フィールドにアクセスできるほとんどの場所に追加できます。

self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
于 2016-01-16T06:47:45.513 に答える
2
  • 4.5 でプロジェクトを開く
  • 絵コンテを選択
  • ファイルインスペクターを開く
  • [Interface Builder Document] の下で、[Use Autolayout] のチェックを外します

一部のビューで自動レイアウトを使用する場合は、複数のストーリーボードに分割できます。

于 2012-07-30T22:31:48.040 に答える
1

私にとっては、プログラムでサブビューを作成することができました.私の場合、自動レイアウトは、その中心を中心に回転する必要があるビューをいじっていましたが、プログラムでこのビューを作成すると、機能しました.

于 2014-01-20T01:48:15.607 に答える
0

自動レイアウトを無効にする代わりに、置き換えるフレームで新しい制約を計算するだけです。それは私には適切な方法のようです。拘束に依存するコンポーネントを調整する場合は、それに応じて調整します。

たとえば、2 つのビュー (myView と otherView) の間に 0 の垂直制約があり、パン ジェスチャまたは myView の高さを調整する何かがある場合、調整された値で制約を再計算できます。

self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
于 2015-05-26T20:56:31.157 に答える
0

自動レイアウトを使用している方は、こちらのソリューションをご覧ください。@IBOutlet調整したい制約を作成してから、それらの定数を変更する必要があります。

于 2015-06-06T21:56:01.647 に答える
-16

xib ファイルの場合:

  1. .xib ファイルを選択します
  2. 「ファイルの所有者」を選択します
  3. ユーティリティを表示
  4. クリック:「ファイルインスペクタ」
  5. 「Interface Builder Document」の下で、「Use Autolayout」を無効にします。
于 2012-12-03T13:32:43.917 に答える