0

自動レイアウトと制約をプログラムで使用し始めましたが、次の警告が表示される理由がわかりません

Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7fbbd142ead0 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fbbd162ec70(44)]>",
    "<NSLayoutConstraint:0x7fbbd1431740 V:|-(20)-[UILabel:0x7fbbd174e520'Liked']   (Names: '|':UITableViewCellContentView:0x7fbbd162ec70 )>",
    "<NSLayoutConstraint:0x7fbbd1431790 V:[UILabel:0x7fbbd174e520'Liked']-(NSSpace(8))-[UILabel:0x7fbbd174e7e0's']>",
    "<NSLayoutConstraint:0x7fbbd14317e0 V:[UILabel:0x7fbbd174e7e0's']-(20)-|   (Names: '|':UITableViewCellContentView:0x7fbbd162ec70 )>"
)

エラーの原因となっているコード行は次のとおりです。

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[nameLbl]-[notificationLbl]-[textLabel]-20-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];

しかし、制約が満たされない理由がわかりません。これはばかげた質問かもしれませんが、私はオートレイアウトに不慣れで、ドキュメントが不完全なため、トピックが混乱しています。さまざまなバリエーションと解決策を試しましたが、正しいものを見つけることができませんでした。私は何が欠けていますか?より詳細な検査のために、カスタム テーブル ビュー セルのコードも貼り付けています。

@implementation NotificationCell
@synthesize nameLbl,notificationLbl,textLabel,timeLbl,profileImgView,notificationImgView,clockImgView,didSetupConstraints;
-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {


        nameLbl = [[UILabel alloc]init];
        [nameLbl setTextColor:[UIColor blueColor]];
        nameLbl.translatesAutoresizingMaskIntoConstraints = NO;
        [nameLbl setTextAlignment:NSTextAlignmentLeft];
        [nameLbl setNumberOfLines:1];

        [nameLbl setBackgroundColor:[UIColor redColor]];
        [self.contentView addSubview:nameLbl];

        notificationLbl = [[UILabel alloc]init];
        [notificationLbl setTextColor:[UIColor lightGrayColor]];
        notificationLbl.translatesAutoresizingMaskIntoConstraints = NO;
        [notificationLbl setTextAlignment:NSTextAlignmentLeft];
        [notificationLbl setNumberOfLines:1];
        [self.contentView addSubview:notificationLbl];

        textLabel = [[UILabel alloc]init];
        [textLabel setTextColor:[UIColor blueColor]];
        textLabel.translatesAutoresizingMaskIntoConstraints = NO;
        [textLabel setTextAlignment:NSTextAlignmentLeft];
        [textLabel setNumberOfLines:0];
        [textLabel setBackgroundColor:[UIColor grayColor]];
        [self.contentView addSubview:textLabel];

        timeLbl = [[UILabel alloc]init];
        [timeLbl setTextColor:[UIColor grayColor]];
        timeLbl.translatesAutoresizingMaskIntoConstraints = NO;
        [timeLbl setTextAlignment:NSTextAlignmentLeft];
        [timeLbl setNumberOfLines:1];

        [self.contentView addSubview:timeLbl];

        profileImgView = [[UIImageView alloc]init];
        [profileImgView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [profileImgView setBackgroundColor:[UIColor redColor]];
        [profileImgView.layer setCornerRadius:20];
        [profileImgView.layer setMasksToBounds:YES];
        [self.contentView addSubview:profileImgView];

        clockImgView = [[UIImageView alloc]init];
        [clockImgView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [clockImgView setBackgroundColor:[UIColor blueColor]];
        [clockImgView.layer setCornerRadius:10];
        [clockImgView.layer setMasksToBounds:YES];
        [self.contentView addSubview:clockImgView];

        notificationImgView = [[UIImageView alloc]init];
        [notificationImgView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [notificationImgView setBackgroundColor:[UIColor purpleColor]];
        [notificationImgView.layer setCornerRadius:10];
        [notificationImgView.layer setMasksToBounds:YES];
        [self.contentView addSubview:notificationImgView];

        /*[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_headerView(==80)]-0-[_tableView]-|"
                                                                          options:NSLayoutFormatDirectionLeadingToTrailing
                                                                          metrics:nil
                                                                            views:elementsDict]];*/



    }
    return self;
}
-(void)updateConstraints{
    if (self.didSetupConstraints == NO) {

        NSDictionary *views = NSDictionaryOfVariableBindings(nameLbl,notificationLbl,notificationImgView,textLabel,timeLbl,profileImgView,clockImgView);
        NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[profileImgView(40)]-10-[textLabel]-[clockImgView(20)]-[timeLbl(20)]-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[profileImgView]-10-[nameLbl]-[clockImgView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[profileImgView]-10-[notificationImgView(20)]-[notificationLbl]-[clockImgView]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[nameLbl]-[notificationLbl]-[textLabel]-20-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[notificationImgView(20)]-[textLabel]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[profileImgView(40)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[clockImgView(20)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-15-[timeLbl]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:views];
        [self.contentView addConstraints:constraints];
        self.didSetupConstraints = YES;
    }
    [super updateConstraints];
}
- (void)layoutSubviews
{
    [super layoutSubviews];

    [self.contentView setNeedsLayout];
    [self.contentView layoutIfNeeded];

    self.textLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.textLabel.frame);
}
4

4 に答える 4

1

いくつかの考え:

  1. rowHeightテーブル ビューでプロパティを明示的に設定したり、.xml ファイルに実装tableView:heightForRowAtIndexPath:したりしないようにしてくださいUITableViewDelegate。これらのいずれかが、制約ベースの高さ計算を実行するセルと競合する制約を確立します。

  2. 私はそれが必要だとは思いませんでしたが、「Luke は言いました」(WWDC 2014 ビデオWhat's New in Table and Collection Viewsで)制約によって生成された行の高さを使用する場合estimatedRowHeight、テーブル ビュー (例: ) に設定する必要があります。viewDidLoad

    self.tableView.estimatedRowHeight = 44;
    
  3. 私もそうする必要があるとは思いませんでしたが、同じ WWDC 2014 のビデオで、プレゼンターの Luke は、次の行をコードに追加するまで、あなたと同様の奇妙な制約エラーを受け取っていました:

    self.tableView.rowHeight = UITableViewAutomaticDimension;
    

    彼は、これは次のシードでは必要ないと言いましたが、彼のデモンストレーションでは必要でした.

  4. 満足できない制約エラーが頻繁に発生することに気付きました (上記を実行し、すべての制約に問題がない場合でも)。セルの垂直方向の制約の 1 つを変更して優先度を 1000 未満にすると、この問題が解決するように見えることがわかりました (セルは適切にフォーマットされているように見えます。

自動的に計算された行の高さのこの動作は、iOS 7 では異なることに注意してください。ただし、iOS 8 では、上記のようにする必要があります。それでも問題が解決しない場合は、問題を明らかにするテスト プロジェクトを作成し、それを私たちが確認できる場所にアップロードしてください。

于 2015-03-08T04:59:39.120 に答える
0

動的なセルの高さに関する私の経験からのいくつかの提案:

updateConstraintsまず、 のメソッドをオーバーライドしないでくださいNotificationCell。代わりに、initすべてのサブビューを に追加した後、メソッドに制約を追加しますcontentView

次に、実装を変更しますheightForRow

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *) indexPath {
        NotificationCell *cell = [[NotificationCell alloc] init];

        // Do all your configuration here 
        cell.nameLabel.text = [_names objectAtIndex:indexPath.row];
        // Add all the rest too ... 

        CGFloat cellHeight = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingSizeCompressedSize].height;
        // Add a breakpoint here to see if your constraints are right and if the height is calculated correctly

        return height + 1;
}

ラベルが複数行でない場合、テキストを設定しなくても、高さは正しく計算されます。ただし、複数行にまたがる可能性がある場合は、heightForRowメソッドでテキストの値を設定する必要があります。

これで問題が解決することを願っています。

于 2015-03-17T18:08:41.237 に答える