猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介

本文主要是介绍猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

猫猫分享,必须精品

原创文章,欢迎转载。转载请注明:翟乃玉的博客
地址:http://blog.csdn.net/u013357243

:一效果

如果直接设置会有拉伸等等的状况,这里主要介绍图片显示的一些细节

这里写图片描述

二:代码

代码实现其实很简单,微博当中用了一个photos来存放九宫格这些图片,然后用了一个photo类来做每个photo,并且在上面显示gif等的样式,很多很多小技巧,直接上代码

九宫格根据行列设置等算法,不难

#import "HWStatusPhotosView.h"
#import "HWPhoto.h"
#import "HWStatusPhotoView.h"#define HWStatusPhotoWH 70
#define HWStatusPhotoMargin 10
#define HWStatusPhotoMaxCol(count) ((count==4)?2:3)@implementation HWStatusPhotosView // 9- (id)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {}return self;
}- (void)setPhotos:(NSArray *)photos
{_photos = photos;int photosCount = photos.count;// 创建足够数量的图片控件// 这里的self.subviews.count不要单独赋值给其他变量while (self.subviews.count < photosCount) {HWStatusPhotoView *photoView = [[HWStatusPhotoView alloc] init];[self addSubview:photoView];}// 遍历所有的图片控件,设置图片for (int i = 0; i<self.subviews.count; i++) {HWStatusPhotoView *photoView = self.subviews[i];if (i < photosCount) { // 显示photoView.photo = photos[i];photoView.hidden = NO;} else { // 隐藏photoView.hidden = YES;}}
}- (void)layoutSubviews
{[super layoutSubviews];// 设置图片的尺寸和位置int photosCount = self.photos.count;int maxCol = HWStatusPhotoMaxCol(photosCount);for (int i = 0; i<photosCount; i++) {HWStatusPhotoView *photoView = self.subviews[i];int col = i % maxCol;photoView.x = col * (HWStatusPhotoWH + HWStatusPhotoMargin);int row = i / maxCol;photoView.y = row * (HWStatusPhotoWH + HWStatusPhotoMargin);photoView.width = HWStatusPhotoWH;photoView.height = HWStatusPhotoWH;}
}+ (CGSize)sizeWithCount:(int)count
{// 最大列数(一行最多有多少列)int maxCols = HWStatusPhotoMaxCol(count);int cols = (count >= maxCols)? maxCols : count;CGFloat photosW = cols * HWStatusPhotoWH + (cols - 1) * HWStatusPhotoMargin;// 行数int rows = (count + maxCols - 1) / maxCols;CGFloat photosH = rows * HWStatusPhotoWH + (rows - 1) * HWStatusPhotoMargin;return CGSizeMake(photosW, photosH);
}
@end

photo的代码

#import "HWStatusPhotoView.h"
#import "HWPhoto.h"
#import "UIImageView+WebCache.h"@interface HWStatusPhotoView()
@property (nonatomic, weak) UIImageView *gifView;
@end@implementation HWStatusPhotoView- (UIImageView *)gifView
{if (!_gifView) {UIImage *image = [UIImage imageNamed:@"timeline_image_gif"];UIImageView *gifView = [[UIImageView alloc] initWithImage:image];[self addSubview:gifView];self.gifView = gifView;}return _gifView;
}- (id)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {// 内容模式self.contentMode = UIViewContentModeScaleAspectFill;// 超出边框的内容都剪掉self.clipsToBounds = YES;}return self;
}- (void)setPhoto:(HWPhoto *)photo
{_photo = photo;// 设置图片[self sd_setImageWithURL:[NSURL URLWithString:photo.thumbnail_pic] placeholderImage:[UIImage imageNamed:@"timeline_image_placeholder"]];// 显示\隐藏gif控件// 判断是够以gif或者GIF结尾self.gifView.hidden = ![photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"];
}- (void)layoutSubviews
{[super layoutSubviews];self.gifView.x = self.width - self.gifView.width;self.gifView.y = self.height - self.gifView.height;
}@end

三:注意地方

显示\隐藏gif控件

    // 判断是够以gif或者GIF结尾self.gifView.hidden = ![photo.thumbnail_pic.lowercaseString hasSuffix:@"gif"];

字符串分类根据字符串字体和最大宽度来得到所占据的高度宽度

/***  根据字符串字体和最大宽度来得到所占据的高度宽度**  @param font 字体*  @param maxW 最大宽度**  @return 长宽size*/
- (CGSize)sizeWithFont:(UIFont *)font maxW:(CGFloat)maxW
{NSMutableDictionary *attrs = [NSMutableDictionary dictionary];attrs[NSFontAttributeName] = font;CGSize maxSize = CGSizeMake(maxW, MAXFLOAT);return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size;
}
/***  在宽度为最大值时候根据字体得到宽高**  @param font 字体**  @return 长宽size*/
- (CGSize)sizeWithFont:(UIFont *)font
{return [self sizeWithFont:font maxW:MAXFLOAT];
}

UIImageView图片设置

/**UIViewContentModeScaleToFill : 图片拉伸至填充整个UIImageView(图片可能会变形)UIViewContentModeScaleAspectFit : 图片拉伸至完全显示在UIImageView里面为止(图片不会变形)UIViewContentModeScaleAspectFill : 图片拉伸至 图片的宽度等于UIImageView的宽度 或者 图片的高度等于UIImageView的高度 为止UIViewContentModeRedraw : 调用了setNeedsDisplay方法时,就会将图片重新渲染UIViewContentModeCenter : 居中显示UIViewContentModeTop,UIViewContentModeBottom,UIViewContentModeLeft,UIViewContentModeRight,UIViewContentModeTopLeft,UIViewContentModeTopRight,UIViewContentModeBottomLeft,UIViewContentModeBottomRight,经验规律:1.凡是带有Scale单词的,图片都会拉伸2.凡是带有Aspect单词的,图片都会保持原来的宽高比,图片不会变形*/// 内容模式self(imageView对象)self.contentMode = UIViewContentModeScaleAspectFill;// 超出边框的内容都剪掉self.clipsToBounds = YES;

这篇关于猫猫学iOS 之微博项目实战(10)微博cell中图片的显示以及各种填充模式简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138323

相关文章

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Android Mainline基础简介

《AndroidMainline基础简介》AndroidMainline是通过模块化更新Android核心组件的框架,可能提高安全性,本文给大家介绍AndroidMainline基础简介,感兴趣的朋... 目录关键要点什么是 android Mainline?Android Mainline 的工作原理关键

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt