12

いくつかの制約が設定された UITableViewCell のカスタム サブクラスがあります。

問題は、次のように 1 つのビューのサイズを変更しようとしたときです。

CGRect frm = CGRectMake(0, 0, someValue, 30);
cell.indentView.frame = frm;

cell.indentView の幅に依存する他のビューはまったく移動していません。

どのような場合がありますか?

このコードは動作します:

// enumerate over all constraints
for (NSLayoutConstraint *constraint in cell.indentView.constraints) {
    // find constraint on this view and with 'width' attribute
    if (constraint.firstItem == cell.indentView && constraint.firstAttribute == NSLayoutAttributeWidth)
    {
        // increase width of constraint
        constraint.constant = someValue;
        break;
    }
}
4

2 に答える 2

13

これは、自動レイアウト制約を持つオブジェクトのフレームを変更することはできないためです (手動でframeプロパティを設定するのではなく、制約が場所を指示するためframe、制約が再適用されるとプロパティがリセットされるため)。ビューを移動するために制約を適切に調整する方法が示されている、この大まかに関連する投稿を参照してください。(その場合、アニメーション化していますが、これはここでは問題ではありませんが、制約を調整して の動きに影響を与える方法を示していますUIView。)

UIViewつまり、自動レイアウト内でを移動したい場合は、 を変更しようとするのframeではなく、制約自体を調整する必要があります。拘束自体の参照を作成すると、これが単純化されます。IBOutletその時点で、 の を調整できconstantますNSLayoutConstraint


アップデート:

Egor は、制約を列挙し、問題の制約に一致する制約を編集することを推奨しました。それはうまく機能しますが、個人的には、IBOutlet編集したい特定の制約を列挙して問題の制約を探すよりも、それらを編集することを好みます。の幅のIBOutlet呼び出しがあった場合は、次のように簡単に実行できます。indentViewWidthConstraintNSLayoutConstraintindentView

self.indentViewWidthConstraint.constant = newIndentConstantValue;
于 2013-01-08T13:28:35.790 に答える
2

setNeedsLayoutsetNeedsUpdateConstraintsまたはを呼び出すなどして、フレームワークに更新を指示する必要がありますlayoutIfNeeded。適切な使用方法については、 UIViewのドキュメントを参照してください。

于 2013-01-08T13:25:55.853 に答える