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——图片查看器的更多相关文章

  1. AJ学IOS(44)之网易彩票自定义图片在右边的Button_弹出view_ios6,7简单适配

    AJ分享,必须精品 效果: 注意图里面了吗,其实那个效果做起来真的很简单,在iOS中苹果给我们封装的很好,关键是那个按钮 系统的按钮的图片是在左边的,这里我们需要把他调整到右边,然后呢需要我们自己做一 ...

  2. AJ学IOS 之小知识之xcode6自动提示图片插件 KSImageNamed的安装

    AJ分享,必须精品 一:首先看效果 KSImageNamed是让XCode能预览项目中图片的插件 很牛逼,据说写这个插件的牛人在日本~ 主要针对imageNamed:方法 效果如图: 安装: 首先需要 ...

  3. AJ学IOS(04)UI之半小时搞定Tom猫

    AJ分享 必须精品  效果图 曾经风靡一时的tom猫其实制作起来那是叫一个相当的easy啊 功能全部实现,(关键是素材,没有素材的可以加我微信) 新手也可以很快的完成tom这个很拉轰的ios应用哦 然 ...

  4. 李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView

    李洪强iOS开发之后使用纯代码实现横向滚动的UIScrollView (VTmagic是一个实现左右滚动的控制器的框架,也可以实现此功能) 实现的效果:  01 - 创建四个控制器 02 - 定义需要 ...

  5. Objective-C ,ios,iphone开发基础:快速实现一个简单的图片查看器

    新建一个single view 工程: 关闭ARC , 在.xib视图文件上拖放一个UIImageView  两个UIButton ,一个UISlider ,布局如图. 并为他们连线, UIImage ...

  6. AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI

    AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...

  7. AJ学IOS(41)UI之核心动画 两行代码搞定3D转场

    AJ分享,必须精品 效果: 代码: 其实代码很少,苹果都给封装好了 // 1.创建核心动画 CATransition *ca = [CATransition animation]; // 1.1动画过 ...

  8. AJ学IOS(42)UI之核心动画CAAnimationGroup以及其他

    AJ分享,必须精品 效果: 代码: 很简单,不多说,就是把一堆动画放一起,看代码. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent * ...

  9. AJ学IOS(13)UI之UITableView学习(下)汽车名牌带右侧索引

    AJ分享,必须精品 先看效果图 代码 ViewController #import "NYViewController.h" #import "NYCarGroup.h& ...

随机推荐

  1. Bisecting GlcNAc is a general suppressor of terminal modification of N-glycan (解读人:王茹凯)

    文献名:Bisecting GlcNAc is a general suppressor of terminal modification of N-glycan(平分GlcNAc是N-聚糖末端修饰的 ...

  2. 【转】不怕难之BlockingQueue及其实现

    1. 前言 BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所 ...

  3. 基于WxPython的GUI框架toolkit-frame介绍

    源码下载地址:https://download.csdn.net/download/zy0412326/12154342 源码下载地址:https://pan.baidu.com/s/1-s2WaQm ...

  4. C语言结构体实现类似C++的构造函数

    其主要依靠函数指针来实现,具体看代码吧~ #include <stdio.h> #include <stdlib.h> #include <string.h> ty ...

  5. 题解 P4325 【[COCI2006-2007#1] Modulo】

    第\(1\)种方法 也是最暴力的一种 我们熟知,\(c++\)中的\(set\)可以既去重,有排序,这题,我们可以用set来搞,虽然我们不需要排序的功能,但毕竟方便,一共是\(10\)个数,所以暴力一 ...

  6. mysql两表合并,对一列数据进行处理

    加班一时爽,一直加班~一直爽~  欢迎收看http://www.996.icu/ 今天弄了下MySQL中两表合并的并且要处理一列数据,这列数据原来都是小写字母,处理时将这列数据改成驼峰命名的~~ 基本 ...

  7. 四、用户交互(输入input,格式化输出)与运算符

    1.接收用户的输入 在Python3:input会将用户输入的所有内容都存成字符串类型 列: username = input("请输入您的账号:") # "egon&q ...

  8. 什么是CPU load

    最近经常收到告警,CPU load大于阈值告警.查看系统的CPU是12核,告警阈值设置的是8.对于CPU load一直有个模糊的概念,具体是什么意思还真搞不明白,趁这个机会好好搞搞究竟. 1.查看CP ...

  9. css网页重置样式表(多版本)

    Eric reset.css html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, ...

  10. 生日Party 玄学多维DP

    题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的 ...