2016-05-13 2 views
1

私は自分のアプリに、UITextFieldと、右側にUIButtonという1つを持っています。テキストフィールドは、スーパービュー(コンテナビュー)の左側とボタンの右側に固定されています。 だからテキストフィールドの左側に容器iOS:同時に制約とフレームを更新する

と右ボタンの関係にスペース= 0末尾

上の関係にスペース= 0をリード

がある

ボタンを右に移動してx原点値を変更すると、なぜテキストフィールドが拡大しないのですかその幅?

(明らかにボタンの幅と高さ程度と位置についての制約がありますが、いないテキストフィールドをロックすること)

ので、私はこの

をすれば
self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

右方向に移動するボタンが、テキストフィールドは幅を拡大しないようです。 あなたはその理由を知っていますか?

+0

はそれですかテキストフィールドに幅の制約を与え、それをプログラム的に変更する –

答えて

0

あなたはボタンの末尾の制約をアニメーション化しようとしてもらえますか?

ので(私は、例示の目的のためのアニメーションブロック内の制約を変更)のように:

UIView.animateWithDuration(
    5.0, 
    animations: { 
     self.buttonTrailingMarginConstraint.constant = 0 
     self.view.layoutIfNeeded() // Necessary when changing constraints. 
    } 
) 

最終結果:

Example

Gitのクローンプロジェクト:https://github.com/backslash-f/animating-constraints

2

自動レイアウトとプログラムによる位置決め/サイジングの両方で作業すると、多くの頭痛が発生する可能性があります。これは、自動レイアウトで制約を作成したためです。これは基本的に、ビューのすべてをレイアウトするときにアプリケーションが従わなければならない「ルール」であり、フレーム、境界、またはセンターのプロパティを変更すると、 。しかし、Auto Layoutは常にビューのレイアウトを再計算するわけではないので、レイアウトの再計算がトリガーされるまで、問題は気付かないことがあります。

質問に答えるために、ボタンの枠を変更しても、自動レイアウトでは何も変更されていないため、テキストが変更されません。さらに、ボタンの制約を変更していないので、テキストフィールドとボタンで- (void) setNeedsUpdateConstraintsを呼び出した場合、探している変更は行われません。ボタンは最初の位置に戻ります。これは、制約で設定したものです。

ボタンがX軸(つまり、使用している場合はその後ろのスペース)にどのように配置されるかを制御するものに、IBOutletを作成することができます。

self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height); 

あなたは何ができる何かのように:その後、代わりにやっての

self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100 
[self.parentView setNeedsUpdateConstraints] 

二行目は、自動レイアウトは、制約が変更されている知っていることを確実にするためであり、それはすべてのビューのレイアウトを再計算する必要があること親の制約に関係している。

これは、同様にあなたに興味があるかもしれ - iOS Developer Library - Auto Layout Guide

関連する問題