0

アプリを Autoresize から Autolayout メカニズムに移行できませんでした。必要なのは、スーパービューと同じサイズで左上隅に接続される動的サイズとサブビューを持つビューだけです。IB では、PieView (私のスーパービュー) のサイズを 186x186 に設定しました。IB に必要なすべての制約を生成させます (コードで新しい制約を作成します)。 インターフェイスビルダー。 スクロール ビューのみに記述された制約

PieView.m -updateConstraints()

- (void)updateConstraints {
[super updateConstraints];
[self removeConstraintsAffectingViewAndSubviews];
[self setTranslatesAutoresizingMaskIntoConstraints:NO];

CGFloat sizeCoef = 0.7f;
CGFloat percent = [self.category getFillinPercent] / 100.0f;
percent = percent > 1.0f ? 1.0f : percent;
sizeCoef += (1.0f - sizeCoef) * percent;

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:self
                                                         attribute:NSLayoutAttributeWidth
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:nil
                                                         attribute:NSLayoutAttributeNotAnAttribute
                                                        multiplier:1.0f
                                                          constant:100.f];//kDiameter * sizeCoef];

NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:self
                                                          attribute:NSLayoutAttributeHeight
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:nil
                                                          attribute:NSLayoutAttributeNotAnAttribute
                                                         multiplier:1.0f
                                                           constant:100.0f];//kDiameter * sizeCoef];
//_imgEmptyCircle, _imgFullCircle - UIImageViews
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self);
NSDictionary *metrics = @{@"height":@100.0};

[self addConstraints:@[width, height]];

NSString *visualForm = @"H:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|";
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm
                                                                     options:0
                                                                     metrics:metrics
                                                                       views:views];
visualForm = @"V:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|";
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm
                                                                      options:0
                                                                      metrics:metrics
                                                                        views:views];
[self addConstraints:verticalConstraints];
[self addConstraints:horizontalConstraints];

}

その結果は本当に驚きました。青いものは思い通りに正しく表示されましたが、緑色のものは奇妙な動作をしています。

青は_imgEmptyCircle、緑は_imgFullCircle

もちろん、エラーがあります:制約を同時に満たすことができません。
最初の imageView :
NSIBPrototypingLayoutConstraint:0xa2795d0 'IB auto generated at build time with view with fixed frame' V:[UIImageView:0x8a37150(186)]> NSLayoutConstraint:0xa0305c0 V:[UIImageView: 0x8a37150
(100)]
2 番目の imageView :
同じもの
PieView の場合:
( NSLayoutConstraint:0x8a40750 V:[CEPieView:0x8a36e50(100)]、NSLayoutConstraint:0xa030570 V:|-(0)-[UIImageView:0x8a37150] (名前: '|':CEPieView:0x8a36e50)、NSLayoutViewConstraint:0xa0305c0 V:[UI :0x8a37150(100)]、NSLayoutConstraint:0xa0305f0 V:[UIImageView:0x8a37150]-(0)-[UIImageView:0xa277cf0]> NSLayoutConstraint:0xa030620 V:[UIImageView:0xa277cf0(100)]、NSLayoutConstraint[UIImageView:0xa030650 V: 0xa277cf0]-(0)-| (名前: '|':CEPieView:0x8a36e50 ) )

よろしければ、直し方を教えてください。AutoLayout メカニズムを使用して古い自動サイズ変更マスク (UIViewAutoresizingFlexibleHeight、UIViewAutoresizingFlexibleWidth) を作成する方法。どんな助けでも大歓迎です。

4

1 に答える 1

0

制約の設定方法が間違っています。基本的に、スーパービューを 100 ポイント x 100 ポイントにし、それぞれが 100 ポイント x 100 ポイントの 2 つのサブビューを含めるように要求しています。したがって、最初にスーパービューの幅および/または高さを 200pts にする必要があります。次に、2 つのビューを横に並べて上に配置することはできません。あなたが本当にやりたいことは(私が思うに)持っていることです:

NSString *visualForm = @"H:|[_imgFullCircle]|"; // No need to explicitly set the height

次に、対応する制約を追加してから、次のようにします。

visualForm = @"H:|[_imgEmptyCircle(height)]|";

このために別の制約を追加し、垂直方向の制約についても同じことを行います。

基本的には、次のようになります。

//_imgEmptyCircle, _imgFullCircle - UIImageViews
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self);

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgEmptyCircle]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgFullCircle]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];                                                                       
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgEmptyCircle]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgFullCircle]|"
                                                                 options:0
                                                                 metrics:nil
                                                                   views:views]];    
于 2013-10-08T08:54:54.743 に答える