蘋果簡訊的聊天氣泡和的聊天氣泡一直很經典,很小的一個氣泡根據文字的多少適當變大變小。
其實實現很簡單,主要是控制項的自適應撐高,這裡用到的是cell。
核心代碼
- (UIView*)bubbleView:(NSString*)textimageName:(NSString*)name
{
UIView *returnView=[[UIViewalloc]initWithFrame:CGRectZero];
UIImage*bubble;
returnView.backgroundColor=[UIColorclearColor];//ImageBubble@2x~iphone
if([nameisEqualToString:@"1"]){//bubble-default-outgoing@2x
bubble=[[UIImageimageWithContentsOfFile:[[NSBundlemainBundle]pathForResource:@"bubble-default-incoming-green@2x"ofType:@"png"]]resizableImageWithCapInsets:UIEdgeInsetsMake(15.0f,25.0f,16.0f,23.0f)];
}else{
bubble=[[UIImageimageNamed:@"ImageBubble~iphone"]stretchableImageWithLeftCapWidth:15topCapHeight:14];
}
UIImageView *bubbleImageView=[[UIImageViewalloc]initWithImage:bubble];
UIFont *font=[UIFontsystemFontOfSize:13];
CGSize size=[textsizeWithFont:fontconstrainedToSize:CGSizeMake(220.0f,1000.0f)lineBreakMode: NSLineBreakByWordWrapping];
CGSize new1=[textsizeWithFont:fontconstrainedToSize:CGSizeMake(220.0f,size.height)lineBreakMode: NSLineBreakByWordWrapping];
UILabel*bubbleText;
if([nameisEqualToString:@"1"]){
bubbleText = [[UILabel alloc] initWithFrame:CGRectMake(12.0f,5.0f,new1.width+10,new1.height+10)];
}else{
bubbleText = [[UILabel alloc] initWithFrame:CGRectMake(5.0f,5.0f,new1.width+10,new1.height+10)];
}
bubbleText.backgroundColor=[UIColorclearColor];
bubbleText.font=font;
bubbleText.numberOfLines=0;
bubbleText.lineBreakMode=NSLineBreakByWordWrapping;
bubbleText.text=text;
bubbleImageView.frame=CGRectMake(0.0f,0.0f,new1.width+20, new1.height+20.0f);
if([nameisEqualToString:@"1"]){
returnView.frame=CGRectMake(40.0f,30.0f,new1.width+20, new1.height+20.0f);
}else{
returnView.frame=CGRectMake(260.0f-new1.width,40.0f,new1.width+20, new1.height+20.0f);
}
[returnView addSubview:bubbleImageView];
[returnView addSubview:bubbleText];
returnreturnView;
}
這段代碼可以直接使用,在tableview的代理方法裡還要實現cell自適應的高度
- (CGFloat)tableView:(UITableView*)tableViewheightForRowAtIndexPath:(NSIndexPath*)indexPath
最後著重提出一點,其實網上很多類似的demo都可以實現此類效果,但有的demo拿過來發現氣泡吹變形了,這可不是方法出了問題,是圖片的問題,多找些氣泡試試。lz就是被這個事情困擾了好久,換了好幾個版本的方法發現