猫分享。必须精品

看看效果

主要实现相似看新闻的一个界面,不用拖拽,纯代码手工写。

首先分析app能够非常easy知道他这里有两个UILabel一个UIImageView还有两个UIButton

定义UIView中的东西

@property (nonatomic, strong) UILabel *noLabel;//数字标签
@property (nonatomic, strong) UIImageView *iconImage;//图片控件
@property (nonatomic, strong) UILabel *descLabel;//描写叙述信息
@property (nonatomic, strong) UIButton *leftButton;//左边button
@property (nonatomic, strong) UIButton *rightButton;//右边button

接下来就是实例化每个控件要做的了,開始的时候我是直接在- (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。 左边的button
_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);
//设置默认情况button显示状况
[_leftButton setBackgroundImage:[UIImage imageNamed:@"left_normal" ] forState:UIControlStateNormal];
//设置高亮 当按下button时候显示的样子
[_leftButton setBackgroundImage:[UIImage imageNamed:@"left_highlighted" ] forState:UIControlStateHighlighted];
_leftButton.tag = -1;//设置button的tag [self.view addSubview:_leftButton]; }
return _leftButton;
} -(UIButton *)rightButton
{
if (_rightButton == nil) { //5。右边的button
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);
//设置默认情况下button
[_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;//设置button的tag
}

这里设置了左右button,開始那些都不说了。看到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);//当索引到第一张图片的时候。让左边button编程不能按的状态
self.rightButton.enabled = (self.index != self.imageList.count-1);//当索引到最后图片的时候。让右边边button编程不能按的状态
} - (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];
}
//点击button事件
- (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];

}

这两个方法建立监听。恩 这样就能点击调用代码了。

好了 到这里位置就算完毕了。没用用前段拖拽吧。

猫学习IOS(三)UI纯代码UI——图片浏览器的更多相关文章

  1. 猫学习IOS(十五)UI以前的热的打砖块游戏

    猫分享.必须精品 材料代号地址:http://blog.csdn.net/u013357243/article/details/44814523 原文地址:viewmode=contents" ...

  2. 拖图UI和纯代码UI

    1拖图UI, 优点:适合快速实验各种天马行空的想法 缺点:太多的storyBoard不好管理,不适合较大的项目,如果一个项目有价值,或成熟了,为了维护拓展,就最好改为纯代码 2纯代码UI 优点:1好维 ...

  3. 【好程序员笔记分享】——iOS开发之纯代码键盘退出

    -iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS开发之纯代码键盘退出(非常简单)     iOS开发之纯代码键盘退出 前面说到了好几次关于键盘退出的,但 ...

  4. iOS UITableViewCell UITableVIewController 纯代码开发

    iOS UITableViewCell UITableVIewController 纯代码开发 <原创> .纯代码 自定义UITableViewCell 直接上代码 ////// #imp ...

  5. .net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能

    原文:.net reactor 学习系列(三)---.net reactor代码自动操作相关保护功能         接上篇,上篇已经学习了界面的各种功能以及各种配置,这篇准备学习下代码控制许可证. ...

  6. 猫学习IOS(四)UI半小时就搞定Tom猫

    阿土 首先对影响 下载项目的源材料: Tom猫游戏代码iOS 素材http://blog.csdn.net/u013357243/article/details/44457357 效果图 以前风靡一时 ...

  7. iOS Dev (50)用代码实现图片加圆角

    用代码实现图片加圆角:       iconView.layer.masksToBounds = YES;       iconView.;

  8. iOS开发系列--无限循环的图片浏览器

    --UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件 ...

  9. 猫学习IOS(五岁以下儿童)UI之360其他下载管理器广场UI

    猫分享.必须精品 下载材料:http://blog.csdn.net/u013357243/article/details/44486651 先看效果 主要是完毕了九宫格UI的搭建 代码 - (voi ...

随机推荐

  1. 黑客白皮书:如何成为一名黑客(附FAQ)

    内容一览 为什么会有这份文档? 什么是黑客? 黑客应有的态度 黑客的基本技能 黑客文化中的地位 黑客和书呆子(Nerd)的联系 风格的意义 其它资源 FAQ(常问问题解答)   作为Jargon Fi ...

  2. [Android学习笔记]Context简单理解

    一.Context是什么?上下文对象,可以理解为一个程序的运行的环境,从中可以获取当前程序的资源:getResources,getAssets 二.常见的Context有哪些?Application ...

  3. [每日一题] 11gOCP 1z0-052 :2013-09-5 runInstaller oracle of no swap

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/11186995 正确答案:A 我们先来看下面这张截图,这是我在安装Oracle 11.2.0 ...

  4. iPhone开发【一】从HelloWorld開始

    转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/8013553 作者:张燕广 从经典的HelloWorld開始踏入iPhon ...

  5. Android应用中Back键的监听及处理

    MainActivity如下: package cn.testnbackpressed; import android.os.Bundle; import android.view.KeyEvent; ...

  6. groovy : 正則表達式

    groovy 正則表達式 企图模仿Perl 的语法,结果是我试用后.发现没法提取匹配的字符串. 还是直接引用 java.util.regex  负责对字符序列进行正則表達式匹配 先转载水木清华上的样例 ...

  7. android怎样查看当前project哪些profile是打开的

    代码project里面有三仅仅文件都是涉及到各个profile的宏的,各自是:featureoption.java.common/ProjectConfig.mk.product/ProjectCon ...

  8. hdu4185+poj3020(最大匹配+最小边覆盖)

    传送门:hdu4185 Oil Skimming 题意:n*n的方格里有字符*和#,只能在字符#上放1*2的板子且不能相交,求最多能放多少个. 分析:直接给#字符编号,然后相邻的可以匹配,建边后无向图 ...

  9. 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...

  10. CC++刚開始学习的人编程教程(9) Windows8.1安装VS2013并捆绑QT与编程助手

    我们在Windows8.1安装VS2013并捆绑QT与编程助手须要下列文件. 2. 在虚拟机中开启Windows8.1 3.然后选择VS2013的安装镜像. 4.将镜像拷贝到虚拟机. 5.我们装载这个 ...