17

以下のコードでは、複数行のラベルの後にボタンが続くはずですが、レイアウト後に表示されるラベルは 1 行だけです。目的を無効にする垂直レイアウトに明示的な高さを設定することはできますが。他にどのような制約を適用する必要があるかについてのアイデアはありますか?

UILabel *lbExplain = [[UILabel alloc] init];
lbExplain.text = @"The Sync process allows you to synchronize your library between different devices. By clicking on the button below you can find other devices to sync with. The other device also has to be running this applicaton.";
lbExplain.lineBreakMode = NSLineBreakByWordWrapping;
lbExplain.numberOfLines = 0;
lbExplain.translatesAutoresizingMaskIntoConstraints = NO;

UIButton *btnPartner = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btnPartner setTitle:@"Look for Partners" forState:UIControlStateNormal];
[btnPartner addTarget:self action:@selector(findPartners:) forControlEvents:UIControlEventTouchUpInside];
btnPartner.translatesAutoresizingMaskIntoConstraints = NO;

[self.view addSubview:lbExplain];
[self.view addSubview:btnPartner];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[lbExplain]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(lbExplain)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[lbExplain]-[btnPartner]" options:NSLayoutFormatAlignAllLeft metrics:nil views:NSDictionaryOfVariableBindings(lbExplain, btnPartner)]];
4

4 に答える 4

39

次の行を追加します。

lbExplain.preferredMaxLayoutWidth = 280;

IB で設定するとラベルが適切に展開されるため、これは IB で自動的に行われる必要があります。渡す数値は、垂直方向に拡張する方法に問題があるように見えますが、幅に設定した制約をオーバーライドしません。

編集後:

その行を updateViewConstraints に追加し、その数をビューの境界に関連付けると、うまく機能します。これにより、回転時に適切に調整されます。

-(void)updateViewConstraints {
    [super updateViewConstraints];
    lbExplain.preferredMaxLayoutWidth = self.view.bounds.size.width - 40;
}
于 2013-02-25T01:00:03.850 に答える
1

ここでの問題は、preferredMaxLayoutWidth設定されていないことです。その結果、テキストは幅によって制限されないため、次の行に折り返されません。

UILabelAutolayout で複数行を使用する最も簡単な方法は、サブクラスを作成することです。

@interface MyMultilineLabel : UILabel

@end


@implementation MyMultilineLabel

- (void)setBounds:(CGRect)bounds {
    [super setBounds:bounds];
    CGFloat width = CGRectGetWidth(bounds);
    if (self.preferredMaxLayoutWidth != width) {
        self.preferredMaxLayoutWidth = width;
    }
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.lineBreakMode = NSLineBreakByWordWrapping;
        self.numberOfLines = 0;
    }
    return self;
}

@end
于 2013-08-28T01:25:37.653 に答える
0

AutoLayoutで配置されたUITableViewCellの複数行のラベルが展開されないという同様の問題がありました。

UITableViewAutomaticDimensionEstimatedHeightForRowAtIndexPathメソッドを使用してサイズを「自動的に」処理する UITableView 内にありました。(多分それが問題の原因だと思います)

私はこの問題を次のように呼び出して理解しました:

[cell layoutIfNeeded]

cellForRowAtIndexPathメソッドで、セルを返す直前に。

そして、それは魅力のように機能しました!

于 2015-12-28T16:01:58.803 に答える
0

あいまいなレイアウトがありませんか?

次のようなコードでテストを行うことができます

if ([self.view hasAmbiguousLayout]) {
    NSLog(@"ambiguous");
}

または、シミュレーターまたはテストデバイスで一時停止して、コンソールに次のように入力します。

po [[UIWindow keyWindow] _autolayoutTrace]

もしそうなら、あなたはあなたの制約をもう少し明示的にしようとするかもしれません(一見すると、高さがあいまいです):

@"V:|-[lbExplain]-[btnPartner]-|"

また

@"V:|-[lbExplain(==300)]-[btnPartner(==200)]"

ビジュアルフォーマット言語のドキュメントは次のとおりです。

http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html

于 2013-02-25T00:34:04.970 に答える