4

Interface Builderを使用してビューにUITextViewを挿入しましたが、プログラムでコンテンツに合うようにフレームサイズを変更したいと思います。問題は、制約のためにサイズがロックされ、コードから変更できないように見えることです。ファイルインスペクターで自動レイアウトを使用して無効にすると、すべてのオブジェクトで制約が削除されますが、UITextViewのみを変更し、他のオブジェクトは変更しません。

[textview setFrame:CGRectMake(x,y,w,h)]; // This doesn't do anything to the uitextview
4

3 に答える 3

8

制約を使用している場合は、制約を使用してUITextViewのサイズを変更する必要があります。コードから変更する必要のある制約にアクセスできるように、ペン先にアウトレットを設定します。制約constantはリアルタイムで設定でき、通常はこれで十分です。

この理由を明確にするために、ビューが制約によって配置されている場合、ビューのフレームを変更することはできません。ええ、できますが、それは無益であり、悪い習慣です。これは、制約自体がビューのフレームを変更するためにレイアウトシステムによって使用されるためです。したがって、フレームを変更することはできますが、レイアウトシステムは制約を読み取って解決し、フレームを再度変更します。

制約は、レイアウトシステムの「やることリスト」と考えてください。制約はそれ自体では何もしません。それらは単なるルールのリストです。作業を行うのはレイアウトシステムです(layoutSubviews呼び出されたとき)。レイアウトが必要になるたびに、レイアウトシステムが登場し、制約を読み取り、それらに従う方法を見つけ出します。これは、ビューのフレームを設定することによって行われます。あなたはそのシステムに反対するのではなく、そのシステムで作業する必要があります

于 2013-02-01T18:26:39.767 に答える
0

すべてのUIViewとクラスはUIViewから継承され、同じプロパティがあります:XIBファイルの「ロック」。 それらのビューのフレームを変更したい場合。Lockis "Nothing"を設定する必要があります

ここに画像の説明を入力してください

于 2014-04-14T08:20:08.860 に答える
0

制約のエキスパートになることを気にしない場合は、このようにします(ビューコントローラーで)。

@property UITextView * textView;

//viewWillAppearでその場でUITextViewを作成します

rect = CGRectMake(194., 180., 464., 524.);
_textView =  [[UITextView alloc] initWithFrame:rect];
[self.view addSubview:_textView];

//これで自由にサイズ変更できます

 CGRect oldFrame = _textView.frame;
 CGRect newFrame = oldFrame;
 newFrame.size.height += 300;
 [_textView setFrame:newFrame];
于 2015-07-02T14:42:44.887 に答える