如何实现点击图片之后放大,或缩放功能。
2016-01-02 00:00
706 查看
实现"查看大图"功能。
** 点击"图片"按钮, 显示大图
问:&1.点击图片之后就放大图片的功能的步骤是什么?
1>创建一个和屏幕一样大小的半透明UIView, 用来遮盖整个界面
2>需要把“图片按钮”, 放置在coverView的前面
3>将图片按钮放大
4>将这些操作放在block动画当中。
问:&2.黑色半透明的背景图片是一个什么控件?点击灰色背景后需要做哪些操作?
解析:是一个按钮,因为需要监听点击事件做事情。
1. 让"图片按钮"通过动画的方式回到原来的位置
2. 让"半透明背景"通过动画的方式透明度变成0, 然后从父容器中移除
* 实现思路(步骤):
1> 添加一个"阴影"按钮, 因为该"阴影"要实现点击, 所以用"按钮”。
设置半透明 来作为蒙版
//0.点击之后马上就记录中间按钮的原始frame -—> 这里是为了后面蒙版被点击之后,能返回中间图片原有的值,所以这里先记录一下
self.iconFrame = self.minidleIamgeViewButton.frame;
// >1.先创建蒙版
UIButton *tempMengBanView = [[UIButton alloc] init]; //注意这里的蒙版是按钮,因为后面还需要点击它
//>2.再设置蒙版的属性
tempMengBanView.backgroundColor = [UIColor blackColor]; //背景为黑色
tempMengBanView.alpha = 0.0; //先将透明度设为0.然后再放到图片的动画之后,让它成为0.5
tempMengBanView.frame = self.view.bounds; //定义尺寸为全屏尺寸
[self.view addSubview:tempMengBanView]; //添加到根视图
self.tempMengBanView = tempMengBanView; //把临时创建的蒙版赋值给tempMengBanView这个属性
2> 然后再把"头像按钮"显示在"阴影”上面。 这个属性可以让这张图片任何时候都是显示在最上面:
//2.把中间图片按钮放置在所有图层的最上面
[self.view bringSubviewToFront:self.minidleIamgeViewButton];
3> 通过动画的方式改变"头像按钮"的frame(位置和尺寸)变成大图效果。
//3.设置中间按钮的frame尺寸和位置
CGFloat tempMD_W = self.view.bounds.size.width;
CGFloat tempMD_H = tempMD_W;
CGFloat tempMD_X = 0;
CGFloat tempMD_Y = (self.view.frame.size.height - tempMD_H) * 0.5;
//给这个放大的过程添加一个动画
[UIView animateWithDuration:1.0 animations:^{
tempMengBanView.alpha = 0.5; //让蒙版透明度变成0.5
self.minidleIamgeViewButton.frame = CGRectMake(tempMD_X, tempMD_Y, tempMD_W, tempMD_H);
}];
** 注意: 如果图片没有变大, 检查是否没有取消"自动布局(Auto Layout)"
选中图片—>点击文件属性—>Interface Buider Document—>去到"Use Auto Layout”的勾
**再来实现 点击"遮罩阴影", 回到小图的功能
# -—>这里是因为后面也要给蒙版创建点击事件,然而蒙版是临时创建的,外部方法还不能直接访问,所以这里可以先在外部定义一个全局属性,然后在蒙版创建后赋值给这个属性,这样就可以在方法中操作调用了
//定义临时蒙版的属性,最后把创建的临时蒙版赋值给这个属性
@property(nonatomic,weak)UIButton *tempMengBanView;
###
注意:这里使用的是weak弱引用, 这样用的原因是,在下面把这个按钮添加到了根视图,已经间接的强引用了(addSubview就表示强引用),所以这里不需要再用强引用,
[self.view addSubview:tempMengBanView]; //添加到根视图
self.tempMengBanView = tempMengBanView; //把临时创建的蒙版赋值给tempMengBanView这个属性
//3.再给这个临时创建的蒙版添加一个单击事件, 通过动画让图片回到原来的位置,结束再移除这个蒙版
// 注意,因为这里需要给这个蒙版添加事件,就需要调用属性,但是我们之前是用UIView来创建的这个蒙版,UIview是没有办法创建点击事件的,所以,我们这里需要把上面创建这个蒙版时候的UIView改为UIButton,这样就可以了
[tempMengBanView addTarget:self action:@selector(clickMengBanButton:) forControlEvents:UIControlEventTouchUpInside];
-(void)clickMengBanButton:(UIButton *)sender{
需求分析:
蒙版的点击事件之后,我们需要做什么:
1> 通过动画慢慢将"遮罩阴影"的透明度变为0
2> 通过动画慢慢将"头像图片"的frame修改为原来的位置
3> 在动画执行完毕后, 移除"遮罩阴影”
//1.让"中间头像按钮"通过动画的方式回到原来的值
//>1. 这里有个问题,那就是我们还不知道图片的原有尺寸和位置在什么,所以,我们需要做的是就是在点击了大图按钮之后,能同时指导中间头像按钮的frame,
//2.让"蒙版"通过动画的方式变成透明,然后移除
//>2. 这里同样有一个困扰,那就是因为蒙版是我们临时创建的,在这里根本没法访问到这个临时蒙版,所以,我们可以通过再创建一个属性的当时来定义这个蒙版, 也就是我们需要在点击大图按钮之后,把临时蒙版创建出来,赋值给这个属性,这样我们就可以访问了,
[UIView animateWithDuration:0.5 animations:^{
self.minidleIamgeViewButton.frame = self.iconFrame;
self.tempMengBanView.alpha = 0.0;
}completion:^(BOOL finished){
[self.tempMengBanView removeFromSuperview];
}];
}
//注册中间图片按钮的单击事件 ---拖线创建
- (IBAction)clickMinidleImageButton:(UIButton *)sender
{
//这里要做一次判断,那就是要弄清楚临时创建的蒙版是不是已经创建了,如果创建了,就调用缩小方法,如果没有实现就调用放大方法
//也是放大图片,就相当于调用了一次大图按钮,所做的事情
if (self.tempMengBanView == nil) {
//放大
[self clickBigViewButton:nil];
}else {
//缩小
[self clickMengBanButton:self.tempMengBanView];
}
}
附代码
这样整个过程就完成了,
** 点击"图片"按钮, 显示大图
问:&1.点击图片之后就放大图片的功能的步骤是什么?
1>创建一个和屏幕一样大小的半透明UIView, 用来遮盖整个界面
2>需要把“图片按钮”, 放置在coverView的前面
3>将图片按钮放大
4>将这些操作放在block动画当中。
问:&2.黑色半透明的背景图片是一个什么控件?点击灰色背景后需要做哪些操作?
解析:是一个按钮,因为需要监听点击事件做事情。
1. 让"图片按钮"通过动画的方式回到原来的位置
2. 让"半透明背景"通过动画的方式透明度变成0, 然后从父容器中移除
* 实现思路(步骤):
1> 添加一个"阴影"按钮, 因为该"阴影"要实现点击, 所以用"按钮”。
设置半透明 来作为蒙版
//0.点击之后马上就记录中间按钮的原始frame -—> 这里是为了后面蒙版被点击之后,能返回中间图片原有的值,所以这里先记录一下
self.iconFrame = self.minidleIamgeViewButton.frame;
// >1.先创建蒙版
UIButton *tempMengBanView = [[UIButton alloc] init]; //注意这里的蒙版是按钮,因为后面还需要点击它
//>2.再设置蒙版的属性
tempMengBanView.backgroundColor = [UIColor blackColor]; //背景为黑色
tempMengBanView.alpha = 0.0; //先将透明度设为0.然后再放到图片的动画之后,让它成为0.5
tempMengBanView.frame = self.view.bounds; //定义尺寸为全屏尺寸
[self.view addSubview:tempMengBanView]; //添加到根视图
self.tempMengBanView = tempMengBanView; //把临时创建的蒙版赋值给tempMengBanView这个属性
2> 然后再把"头像按钮"显示在"阴影”上面。 这个属性可以让这张图片任何时候都是显示在最上面:
//2.把中间图片按钮放置在所有图层的最上面
[self.view bringSubviewToFront:self.minidleIamgeViewButton];
3> 通过动画的方式改变"头像按钮"的frame(位置和尺寸)变成大图效果。
//3.设置中间按钮的frame尺寸和位置
CGFloat tempMD_W = self.view.bounds.size.width;
CGFloat tempMD_H = tempMD_W;
CGFloat tempMD_X = 0;
CGFloat tempMD_Y = (self.view.frame.size.height - tempMD_H) * 0.5;
//给这个放大的过程添加一个动画
[UIView animateWithDuration:1.0 animations:^{
tempMengBanView.alpha = 0.5; //让蒙版透明度变成0.5
self.minidleIamgeViewButton.frame = CGRectMake(tempMD_X, tempMD_Y, tempMD_W, tempMD_H);
}];
** 注意: 如果图片没有变大, 检查是否没有取消"自动布局(Auto Layout)"
选中图片—>点击文件属性—>Interface Buider Document—>去到"Use Auto Layout”的勾
**再来实现 点击"遮罩阴影", 回到小图的功能
# -—>这里是因为后面也要给蒙版创建点击事件,然而蒙版是临时创建的,外部方法还不能直接访问,所以这里可以先在外部定义一个全局属性,然后在蒙版创建后赋值给这个属性,这样就可以在方法中操作调用了
//定义临时蒙版的属性,最后把创建的临时蒙版赋值给这个属性
@property(nonatomic,weak)UIButton *tempMengBanView;
###
注意:这里使用的是weak弱引用, 这样用的原因是,在下面把这个按钮添加到了根视图,已经间接的强引用了(addSubview就表示强引用),所以这里不需要再用强引用,
[self.view addSubview:tempMengBanView]; //添加到根视图
self.tempMengBanView = tempMengBanView; //把临时创建的蒙版赋值给tempMengBanView这个属性
//3.再给这个临时创建的蒙版添加一个单击事件, 通过动画让图片回到原来的位置,结束再移除这个蒙版
// 注意,因为这里需要给这个蒙版添加事件,就需要调用属性,但是我们之前是用UIView来创建的这个蒙版,UIview是没有办法创建点击事件的,所以,我们这里需要把上面创建这个蒙版时候的UIView改为UIButton,这样就可以了
[tempMengBanView addTarget:self action:@selector(clickMengBanButton:) forControlEvents:UIControlEventTouchUpInside];
-(void)clickMengBanButton:(UIButton *)sender{
需求分析:
蒙版的点击事件之后,我们需要做什么:
1> 通过动画慢慢将"遮罩阴影"的透明度变为0
2> 通过动画慢慢将"头像图片"的frame修改为原来的位置
3> 在动画执行完毕后, 移除"遮罩阴影”
//1.让"中间头像按钮"通过动画的方式回到原来的值
//>1. 这里有个问题,那就是我们还不知道图片的原有尺寸和位置在什么,所以,我们需要做的是就是在点击了大图按钮之后,能同时指导中间头像按钮的frame,
//2.让"蒙版"通过动画的方式变成透明,然后移除
//>2. 这里同样有一个困扰,那就是因为蒙版是我们临时创建的,在这里根本没法访问到这个临时蒙版,所以,我们可以通过再创建一个属性的当时来定义这个蒙版, 也就是我们需要在点击大图按钮之后,把临时蒙版创建出来,赋值给这个属性,这样我们就可以访问了,
[UIView animateWithDuration:0.5 animations:^{
self.minidleIamgeViewButton.frame = self.iconFrame;
self.tempMengBanView.alpha = 0.0;
}completion:^(BOOL finished){
[self.tempMengBanView removeFromSuperview];
}];
}
//注册中间图片按钮的单击事件 ---拖线创建
- (IBAction)clickMinidleImageButton:(UIButton *)sender
{
//这里要做一次判断,那就是要弄清楚临时创建的蒙版是不是已经创建了,如果创建了,就调用缩小方法,如果没有实现就调用放大方法
//也是放大图片,就相当于调用了一次大图按钮,所做的事情
if (self.tempMengBanView == nil) {
//放大
[self clickBigViewButton:nil];
}else {
//缩小
[self clickMengBanButton:self.tempMengBanView];
}
}
附代码
// ViewController.m // 01_猜图游戏 #import "ViewController.h" #import "DXQuestion.h" @interface ViewController () @property (nonatomic, strong) NSArray *questions; // 记录icon button的原始的frame @property (nonatomic, assign) CGRect iconFrame; @property (nonatomic, weak) UIButton *coverView; @end@implementation ViewController // 点击了大图按钮- (IBAction)didClickShowBigImageButton:(UIButton *)sender { // 0. 记录 btnIcon 的frame self.iconFrame = self.btnIcon.frame; // 1. 创建一个和屏幕一样大小的半透明UIView, 用来遮盖整个界面 UIButton *coverView = [[UIButton alloc] init]; coverView.backgroundColor = [UIColor blackColor]; coverView.alpha = 0.0; coverView.frame = self.view.bounds; // 为半透明背景添加一个单击事件 [coverView addTarget:self action:@selector(didClickCoverView:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:coverView]; self.coverView = coverView; // 需要把"图片按钮", 放置在coverView的前面 [self.view bringSubviewToFront:self.btnIcon]; // 2. 讲头像按钮(图片按钮)放大 CGFloat iconW = self.view.bounds.size.width; CGFloat iconH =iconW; CGFloat iconX = 0; CGFloat iconY = (self.view.bounds.size.height - iconH) * 0.5; [UIView animateWithDuration:0.5 animations:^{ coverView.alpha = 0.6; self.btnIcon.frame = CGRectMake(iconX, iconY, iconW, iconH); }]; }// 点击了"半透明背景"按钮- (void)didClickCoverView:(UIButton *)sender { // 1. 让"头像按钮"通过动画的方式回到原来的位置 [UIView animateWithDuration:0.5 animations:^{ self.btnIcon.frame = self.iconFrame; // 2. 让"半透明背景"通过动画的方式透明度变成0, 然后从父容器中移除 self.coverView.alpha = 0.0; } completion:^(BOOL finished) { [self.coverView removeFromSuperview]; }]; } // 点击了下一题按钮- (IBAction)didClickNextQuestionButton:(UIButton *)sender { // 1. 切换题目的显示 [self nextQuestion]; } // 点击了中间的图片按钮 - (IBAction)didClickIconButton:(UIButton *)sender { // 根据是否已经创建了coverView, 来决定是应该放大还是缩小 if (self.coverView == nil) { // 放大 [self didClickShowBigImageButton:nil]; } else { // 缩小 [self didClickCoverView:self.coverView]; } }
这样整个过程就完成了,
相关文章推荐
- UIScrollView 介绍
- UIScrollView无法滚动可能的原因及解决办法分析
- 代理设计模式在 UIScrollView 中的应用
- UI中如何用纯代码的方式来实现一个图片轮播器
- 浅谈C之精华---指针
- 浅谈C之精华---指针
- 浅谈C之精华---指针
- Spring中的BeanPostProcessor接口
- 设计模式中的6大设计原则
- 【嘉兴东臣php】HTML5和CSS3学习周总结
- jquery 基础总结
- UISteeper 步进器方法的简单整理
- xp添加外置无线网卡
- 静态内部类,匿名内部类
- 内部类
- (二)多个生产者多个消费者,给包子编号 ,用lock
- (三)多个生产者多个消费者,给包子编号 ,用lock
- 死锁
- 同步代码块的锁为任意锁,而同步方法的锁为this,如何证明同步方法的锁为this.
- 静态同步方法-同步锁为:类名.class