1. 程式人生 > >實現一個隨著內容多少而拉伸的view

實現一個隨著內容多少而拉伸的view

其中 實現圖 uiimage nts alignment radi mar ott 根據

問題:如何實現圖中的view,要求能根據文本的長度自適應。(消息有多少條不一定,所以寬度肯定不固定)

技術分享圖片

首先來分解一下:

A:View —— 外層容器,紅色背景、圓角
B:ImageView —— 圓角ImageView,用於顯示頭像
C:Label —— 白色字體
D:ImageView —— 右側箭頭

技術分享圖片

其中大小固定的是B和D,C會根據具體消息有多少條,發生寬度的改變,A會隨著BCD總寬度的改變而改變。

解決辦法:

使用AutoLayout,這裏用了Masonry,上代碼,重要的都在代碼中註釋了,核心思想是:不要設定A的寬度,並讓C來將A撐起來(因為UILabel有這個特性)。

UIView *contentView = [UIView new];
contentView.backgroundColor = [HMStyle themeMainColor];
contentView.layer.cornerRadius = 20.0f;
[self addSubview:contentView];
[contentView mas_makeConstraints:^(MASConstraintMaker *make) { // 不設置寬度,讓內容將他撐起來
    make.height.equalTo(@(contentHeight));
    make.centerX.equalTo(self);
    make.bottom.equalTo(self);
}];

self.m_MessageImageView = [UIImageView new];
self.m_MessageImageView.image = [UIImage imageNamed:@"user_normal_avatar"];
self.m_MessageImageView.layer.cornerRadius = 15.0f;
self.m_MessageImageView.layer.masksToBounds = YES;
self.m_MessageImageView.layer.borderColor = [UIColor whiteColor].CGColor;
self.m_MessageImageView.layer.borderWidth = 2.0f;
[contentView addSubview:self.m_MessageImageView];
[self.m_MessageImageView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.width.height.equalTo(@30);
    make.left.equalTo(contentView.mas_left).offset(5);
    make.centerY.equalTo(contentView);
}];

// 用label左右延伸將父組件撐起來
self.m_MessageLabel = [UILabel new];
self.m_MessageLabel.textAlignment = NSTextAlignmentLeft;
self.m_MessageLabel.textColor = [UIColor whiteColor];
self.m_MessageLabel.font = [UIFont systemFontOfSize:14.0f];
self.m_MessageLabel.text = @"小家有--條新消息";
[contentView addSubview:self.m_MessageLabel];
[self.m_MessageLabel mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(contentView.mas_left).offset(40); // 加上頭像和margin的大小
    make.top.bottom.equalTo(contentView);
    make.right.equalTo(contentView.mas_right).offset(-20); // 加上箭頭和margin的大小
}];

UIImageView *imageView = [UIImageView new];
imageView.image = [UIImage imageNamed:@"7x13_arrow"];
[contentView addSubview:imageView];
[imageView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.right.equalTo(contentView.mas_right).offset(-10);
    make.width.equalTo(@7);
    make.height.equalTo(@13);
    make.centerY.equalTo(contentView.mas_centerY);
}];

實現一個隨著內容多少而拉伸的view