AJ学IOS(03)UI之纯代码实现UI——图片查看器
AJ分享,必须精品
先看效果
主要实现类似看新闻的一个界面,不用拖拽,纯代码手工写。
首先分析app可以很容易知道他这里有两个UILabel一个UIImageView还有两个UIButton
定义UIView中的东西
@property (nonatomic, strong) UILabel *noLabel;//数字标签
@property (nonatomic, strong) UIImageView *iconImage;//图片控件
@property (nonatomic, strong) UILabel *descLabel;//描述信息
@property (nonatomic, strong) UIButton *leftButton;//左边按钮
@property (nonatomic, strong) UIButton *rightButton;//右边按钮
接下来就是实例化每一个控件要做的了,开始的时候我是直接在- (void)viewDidLoad方法中写的,后来因为学习了懒加载
设计模式(感觉跟java设计模式中的懒汉差不多)优化了代码,这里就直接给出优化后的了。
懒加载
懒加载设计主要就是把UI控件放到定义好的控件的get方法中实例化,这样呢可以减少代码在viewDidLoad中的上下关系,可以有效的解耦。
UILabel: noLabel
-(UILabel *)noLabel
{
if (_noLabel == nil) {
//1,序号.
_noLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, self.view.bounds.size.width, 40)];
_noLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_noLabel];
}
return _noLabel;
}
[self.view addSubview:_noLabel];这个是将控件挂到view上面,画好了一定要挂上,要不没人看到。
注意:*重点,在get方法里面不能写self.noLabel;千万不要用“点”语法,这样会造成get方法死循环,因为“点”语法就是调用的get方法,所以要用下划线属性名的方法得到对象(在内存这其实是一个指针)。
UIImageView: iconImage
-(UIImageView *)iconImage
{
if(_iconImage == nil){
//2,图像
CGFloat imageW = 200;//图像控件的宽
CGFloat imageH = 200;//图像控件的高
CGFloat imageX = (self.view.bounds.size.width - imageW)*0.5;//图像控件的x坐标位置
CGFloat imageY = CGRectGetMaxY(self.noLabel.frame) + 20;//图像控件的y坐标位置
_iconImage = [[UIImageView alloc] initWithFrame:CGRectMake(imageX, imageY, imageW, imageH)];
[self.view addSubview:_iconImage];
}
return _iconImage;
}
跟上一个差不多,我在注释里面都添加了
-(UILabel *)descLabel
{
if(_descLabel == nil){
//3,说明
CGFloat descY = CGRectGetMaxY(self.iconImage.frame);
_descLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, descY, self.view.bounds.size.width, 100)];
//自动换行
_descLabel.numberOfLines = 0;
//调整文本居中显示
_descLabel.textAlignment = NSTextAlignmentCenter;
[self.view addSubview:_descLabel];
}
return _descLabel;
}
这个是描述的,多了一个自动换行方法 _descLabel.numberOfLines = 0;
UIButton leftButton
-(UIButton *)leftButton
{
if (_leftButton == nil) {
//4。左边的按钮
_leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
CGFloat centY = self.iconImage.center.y;
CGFloat centX = self.iconImage.frame.origin.x * 0.5;
_leftButton.center = CGPointMake(centX, centY);
//设置默认情况按钮显示状况
[_leftButton setBackgroundImage:[UIImage imageNamed:@"left_normal" ] forState:UIControlStateNormal];
//设置高亮 当按下按钮时候显示的样子
[_leftButton setBackgroundImage:[UIImage imageNamed:@"left_highlighted" ] forState:UIControlStateHighlighted];
_leftButton.tag = -1;//设置按钮的tag
[self.view addSubview:_leftButton];
}
return _leftButton;
}
-(UIButton *)rightButton
{
if (_rightButton == nil) {
//5。右边的按钮
CGFloat centX = self.iconImage.frame.origin.x * 0.5;
CGFloat centY = self.iconImage.center.y;
_rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
_rightButton.center = CGPointMake(self.view.bounds.size.width - centX,centY);
//设置默认情况下按钮
[_rightButton setBackgroundImage:[UIImage imageNamed:@"right_normal" ] forState:UIControlStateNormal];
//设置高亮
[_rightButton setBackgroundImage:[UIImage imageNamed:@"right_highlighted" ] forState:UIControlStateHighlighted];
_rightButton.tag = 1;
[self.view addSubview:_rightButton];
}
return _rightButton;//设置按钮的tag
}
这里设置了左右按钮,开始那些都不说了,看到CGFloat我们就应该能瞬间想到布局位置什么那些关键字相应的
CGRect CGSize CGPoint 以及另外三个frame bounds center
这里有个很精妙的设计,那就是tag 把tag设置成了1和-1在后面会有妙用。
图片集合
//当前显示的照片索引
@property (nonatomic, assign) int index;
//图片的集合
@property (nonatomic, strong) NSArray *imageList;
//显示图片信息
- (void) showPhotoInfo
{
//给序号添加内容 从imageList数组中拿到
self.noLabel.text = [NSString stringWithFormat:@"%d/%d",self.index+1,self.imageList.count];
// 给图片添加内容从imageList数组中拿到
self.iconImage.image = [UIImage imageNamed:self.imageList[self.index][@"name"]];
// 给描述添加内容从imageList数组中拿到
self.descLabel.text = self.imageList[self.index][@"desc"];
self.leftButton.enabled = (self.index != 0);//当索引到第一张图片的时候,让左边按钮编程不能按的状态
self.rightButton.enabled = (self.index != self.imageList.count-1);//当索引到最后图片的时候,让右边边按钮编程不能按的状态
}
- (NSArray *)imageList
{
if (_imageList == nil) {
//设置存放内容(plist)的路径
//在oc中contentsOfFile,通常需要完整的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"imageList" ofType:@"plist"];
_imageList = [NSArray arrayWithContentsOfFile:path];
NSLog(@"%@",_imageList);
}
return _imageList;
}
这里用到了_imageList = [NSArray arrayWithContentsOfFile:path];
来从我们设置好的imageList.plist文件中得到要用的东东
点击事件以及调用
- (void)viewDidLoad
{
[super viewDidLoad];
//显示信息
[self showPhotoInfo];
//button点击事件调用
[_leftButton addTarget:self action:@selector(chickButton:) forControlEvents:UIControlEventTouchUpInside];
[_rightButton addTarget:self action:@selector(chickButton:) forControlEvents:UIControlEventTouchUpInside];
}
//点击按钮事件
- (void) chickButton:(UIButton *)button
{
self.index += button.tag;
[self showPhotoInfo];
}
这里我们用到了一个很精妙的地方,还记得前面的tag属性吧
这里我们直接 self.index += button.tag; 然后实现了button按左边index自增右边自减从而优化代码。
[_leftButton addTarget:self action:@selector(chickButton:) forControlEvents:UIControlEventTouchUpInside];
[_rightButton addTarget:self action:@selector(chickButton:) forControlEvents:UIControlEventTouchUpInside];
}
这两个方法建立监听,恩 这样就能点击调用代码了。
好了 到这里位置就算完成了。没用用前段拖拽吧。
AJ学IOS(03)UI之纯代码实现UI——图片查看器的更多相关文章
- AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配
AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...
- AJ学IOS 之小知识之xcode6自动提示图片插件 KSImageNamed的安装
AJ分享,必须精品 一:首先看效果 KSImageNamed是让XCode能预览项目中图片的插件 很牛逼,据说写这个插件的牛人在日本~ 主要针对imageNamed:方法 效果如图: 安装: 首先需要 ...
- AJ学IOS(04)UI之半小时搞定Tom猫
AJ分享 必须精品 效果图 曾经风靡一时的tom猫其实制作起来那是叫一个相当的easy啊 功能全部实现,(关键是素材,没有素材的可以加我微信) 新手也可以很快的完成tom这个很拉轰的ios应用哦 然 ...
- 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView
李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果: 01 - 创建四个控制器 02 - 定义需要 ...
- Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器
新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView 两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...
- AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI
AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...
- AJ学IOS(41)UI之核心动画 两行代码搞定3D转场
AJ分享,必须精品 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过 ...
- AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他
AJ分享,必须精品 效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent * ...
- AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引
AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...
随机推荐
- Vue + element从零打造一个H5页面可视化编辑器——pl-drag-template
pl-drag-template Github地址:https://github.com/livelyPeng/pl-drag-template 前言 想必你一定使用过易企秀或百度H5等微场景生成工具 ...
- [Docker03] Deploy LNMP on Docker
Deploy MYSQL docker pull mysql 挂载卷保存数据文件 mkdir -p /mysql/data chmod -p 777 /mysql/data MySQL使用过程中的环境 ...
- [Linux系统] CentOS7(RHEL7)重置root用户密码
1.系统启动时,按"e"进入编辑界面 2.编辑内容 将rhgb quiet修改为 init=/bin/sh : 然后按 ctrl+x . 3.修改root密码 mount -o r ...
- wr720n v4 折腾笔记(五):终篇-编译安装openwrt附带njit
前言: 由于没有多余的U盘,所以想直接压缩生成一个带njit-client的openwrt固件.其中按照网上的教程走,遇到了一些问题,这里前面的步骤来源于网络.后面给出处理问题的方法. 一.准备工作 ...
- 图的深度优先搜索dfs
图的深度优先搜索: 1.将最初访问的顶点压入栈: 2.只要栈中仍有顶点,就循环进行下述操作: (1)访问栈顶部的顶点u: (2)从当前访问的顶点u 移动至顶点v 时,将v 压入栈.如果当前顶点u 不存 ...
- 数据库(sqlserver 2005)优化排查之路
查找问题过程是痛苦的,解决完问题是快乐! 兄弟帮助一个公司开发了一个旅游网站(asp.net+sqlsever2005),一直还算稳定,但是最近网站却慢的可以,让人头疼.登录服务器,进入任务管理器,发 ...
- Polya 定理相关题目
参考知识链接 关于枚举旋转置换: 前两题都是枚举了 n 种旋转, 但这个可以优化到\(O(\sqrt{n})\) (这个其实是基本操作). 考虑到每个循环节的长度都是 n 的因数, 所以可以枚 ...
- 老技术新谈,Java应用监控利器JMX(2)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面. J ...
- Base64编码与解码原理
Base64编码是使用64个可打印ASCII字符(A-Z.a-z.0-9.+./)将任意字节序列数据编码成ASCII字符串,另有“=”符号用作后缀用途. base64索引表 base64编码与解码的基 ...
- 记录一次简单的springboot发送邮件功能
场景:经常在我们系统中有通过邮件功能找回密码,或者发送生日祝福等功能,今天记录下springboot发送邮件的简单功能 1.引入maven <!-- 邮件开发--><dependen ...