猫猫学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

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

使用Java填充Word模板的操作指南

《使用Java填充Word模板的操作指南》本文介绍了Java填充Word模板的实现方法,包括文本、列表和复选框的填充,首先通过Word域功能设置模板变量,然后使用poi-tl、aspose-words... 目录前言一、设置word模板普通字段列表字段复选框二、代码1. 引入POM2. 模板放入项目3.代码

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

Java Docx4j类库简介及使用示例详解

《JavaDocx4j类库简介及使用示例详解》Docx4j是一个强大而灵活的Java库,非常适合需要自动化生成、处理、转换MicrosoftOffice文档的服务器端或后端应用,本文给大家介绍Jav... 目录1.简介2.安装与依赖3.基础用法示例3.1 创建一个新 DOCX 并添加内容3.2 读取一个已存

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放