IOS开发学习笔记018- 一般控件的使用
1、移动
2、动画
3、缩放
3、旋转
4、简化代码
5、总结
UIButton 的两种状态
normal
highlighted
1、移动
OC语法规定:不允许直接修改某个对象中结构体属性的成员。
// 获取image控件的frame
CGRect rect = self.btnImage.frame;
//self.btnImage.frame.origin.y = 20; // 不能直接修改
// 更改Y的值,减小,如果减小到5则一直位5
rect.origin.y -= ;
if( >= rect.origin.y)
{
rect.origin.y = ;
}
// 重新赋值
self.btnImage.frame = rect;
2、动画
这样看起来按钮移动的比较生硬,所以这里给他的移动添加上动画。用到UIView的动画属性
// 0、动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 1、获取image控件的frame
CGRect rect = self.btnImage.frame;
//self.btnImage.frame.origin.y = 20; // 不能直接修改
// 2、更改Y的值,减小,如果减小到5则一直位5
rect.origin.y -= ;
if( >= rect.origin.y)
{
rect.origin.y = ;
}
// 3、重新赋值
self.btnImage.frame = rect;
// 4、动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
在设置过动画开始后再加上动画执行时间
// 设置动画的执行时间
[UIView setAnimationDuration:0.6];
可以看到按钮在平缓移动。
下面是关于动画的一些类方法
@interface UIView(UIViewAnimation) + (void)beginAnimations:(NSString *)animationID context:(void *)context; // additional context info passed to will start/did stop selectors. begin/commit can be nested
+ (void)commitAnimations; // starts up any animations when the top level animation is commited // no getters. if called outside animation block, these setters have no effect.
+ (void)setAnimationDelegate:(id)delegate; // default = nil
+ (void)setAnimationWillStartSelector:(SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context
+ (void)setAnimationDidStopSelector:(SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2
+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0
+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])
+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut
+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0. May be fractional
+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. used if repeat count is non-zero
+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. If YES, the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default). + (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // current limitation - only one per begin/commit block + (void)setAnimationsEnabled:(BOOL)enabled; // ignore any attribute changes while set.
+ (BOOL)areAnimationsEnabled;
+ (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation NS_AVAILABLE_IOS(7_0); @end
下面说一些常用的吧:
beginAnimations 开始动画
commitAnimations 执行动画
setAnimationDelegate 设置动画委托
setAnimationDuration 设置动画时间
setAnimationDelay 设置动画延迟时间
setAnimationStartDate 设置动画开始日期
setAnimationCurve 设置动画曲线
setAnimationRepeatCount 设置动画重复次数
setAnimationsEnabled 关闭动画
areAnimationsEnabled 动画是否开启
3、旋转 下面来看按钮的旋转方法 transform属性
旋转方式有两种:
一种改变弧度 π
一种改变角度 90
- (IBAction)RotateLeft
{
// 0、动画头部
[UIView beginAnimations:nil context:nil];
// 设置动画时间
[UIView setAnimationDuration:0.5];
// 1、获取当前的按钮的transform
//_btnImage.transform = CGAffineTransformMakeRotation(-M_PI_4); // 每次都是-45度,所以再次点击没有旋转 _btnImage.transform = CGAffineTransformRotate(_btnImage.transform, -M_PI_4); // 返回新的transform对象,可以连续旋转角度
// 7、动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
}
4、缩放 可以改变frame属性改变大小
// 0、动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6];
// 1、获取image控件的frame
CGRect rect = self.btnImage.frame;
// 2、获取btn控件的中心
CGPoint point = self.btnImage.center;
//self.btnImage.frame.origin.y = 20; // 不能直接修改
// 3、更改高度和宽度
rect.size.width *= 1.1;
rect.size.height *= 1.1;
// 4、计算新的原点,,保证放大后按钮的中心位置不变
point.x -= rect.size.width/;
point.y -= rect.size.height/;
// 5、将新的原点赋值,
rect.origin = point; // 6、重新赋值
self.btnImage.frame = rect;
//self.btnImage.center = point;
// 7、动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
也可以改变transform属性改变大小,可以想像CGAffineTransformScale内部实现就是方法1
// 方法2 直接修改transform属性
// 0、动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6];
//_btnImage.transform = CGAffineTransformMakeScale(1.2, 1.2); // 只会改变一次
_btnImage.transform = CGAffineTransformScale(_btnImage.transform, 1.1, 1.1); // 返回修改的transform属性,可连续修改
// 动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
5、简化代码
将上面代码整理后是这样
// id 类型的不能用点语法
- (IBAction)Run:(id)sender
{
// 0、动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6];
// 1、获取image控件的frame
CGRect rect = self.btnImage.frame;
//self.btnImage.frame.origin.y = 20; // 不能直接修改
switch ([sender tag] )
{
case :
// 2、更改Y的值
rect.origin.y -= DELTA;
break;
case :
// 2、更改Y的值
rect.origin.y += DELTA; break;
case :
// 2、更改x的值
rect.origin.x -= DELTA;
break;
case :
// 2、更改x的值
rect.origin.x += DELTA;
break;
default:
break;
}
// 3、重新赋值
self.btnImage.frame = rect;
// 4、动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
} - (IBAction)Scale:(id)sender
{
// 方法2 直接修改transform属性
// 0、动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6];
//_btnImage.transform = CGAffineTransformMakeScale(1.2, 1.2); // 只会改变一次
float scale = ([sender tag] == ) ? 1.1 : 0.9;
_btnImage.transform = CGAffineTransformScale(_btnImage.transform, scale, scale); // 返回修改的transform属性,可连续修改
// 动画(尾部-提交动画-执行动画)
[UIView commitAnimations]; } - (IBAction)Rotate:(id)sender
{
// 0、动画头部
[UIView beginAnimations:nil context:nil];
// 设置动画时间
[UIView setAnimationDuration:0.5];
// 1、获取当前的按钮的transform
//_btnImage.transform = CGAffineTransformMakeRotation(-M_PI_4); // 每次都是-45度,所以再次点击没有旋转
float rotate = ([sender tag] == ) ? -M_PI_4 : M_PI_4;
_btnImage.transform = CGAffineTransformRotate(_btnImage.transform, rotate);
// 7、动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
}
仔细观察代码可以发现这三个函数的头部好尾部好多重复代码,
如果代码中又很多函数的头部和尾部都有很多重复代码,可以使用block简化代码 先看一下怎么写得
- (void)btnClickWithBlock:(void(^)())myBlock
{
// 动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6]; myBlock(); // 动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
}
这样写后,后面直接调用这个方法就可以了
- (void)btnClickWithBlock:(void(^)())myBlock
{
// 动画 (头部-开始动画)
[UIView beginAnimations:nil context:nil];
// 设置动画的执行时间
[UIView setAnimationDuration:0.6]; myBlock(); // 动画(尾部-提交动画-执行动画)
[UIView commitAnimations];
} // id 类型的不能用点语法
- (IBAction)Run:(id)sender
{ [self btnClickWithBlock:^{
// 1、获取image控件的frame
CGRect rect = self.btnImage.frame;
//self.btnImage.frame.origin.y = 20; // 不能直接修改
switch ([sender tag] )
{
case :
// 2、更改Y的值
rect.origin.y -= DELTA;
break;
case :
// 2、更改Y的值
rect.origin.y += DELTA; break;
case :
// 2、更改x的值
rect.origin.x -= DELTA;
break;
case :
// 2、更改x的值
rect.origin.x += DELTA;
break;
default:
break;
}
// 3、重新赋值
self.btnImage.frame = rect; }]; } - (IBAction)Scale:(id)sender
{
[self btnClickWithBlock:^{
//_btnImage.transform = CGAffineTransformMakeScale(1.2, 1.2); // 只会改变一次
float scale = ([sender tag] == ) ? 1.1 : 0.9;
_btnImage.transform = CGAffineTransformScale(_btnImage.transform, scale, scale); // 返回修改的transform属性,可连续修改 }];
} - (IBAction)Rotate:(id)sender
{
[self btnClickWithBlock:^{ // 1、获取当前的按钮的transform
//_btnImage.transform = CGAffineTransformMakeRotation(-M_PI_4); // 每次都是-45度,所以再次点击没有旋转
float rotate = ([sender tag] == ) ? -M_PI_4 : M_PI_4;
_btnImage.transform = CGAffineTransformRotate(_btnImage.transform, rotate); }];
}
这样看来代码简洁了很多。 6、恢复形变属性为原状
CGAffineTransformIdentity 这个Const常量就可以直接恢复原状
- (IBAction)reset:(id)sender
{
// 恢复所有的形变属性,transform的改变全部恢复
[self btnClickWithBlock:^{
_btnImage.transform = CGAffineTransformIdentity;
}];
}
总结
以上这些属性全部继承自UIView,所以对其他控件也适用。
1、frame 表示控件的位置和尺寸,以父控件左上角位坐标原点
2、center 表示控件的中心,,以父控件左上角位坐标原点
3、bounds 表示控件的位置和尺寸,以自己左上角位坐标原点,永远是(0,0)
4、transform 表示控件形状属性,缩放,旋转等
5、tag 表示控件的标识,默认是0
2015-04-25 今日如此,明日依旧。
IOS开发学习笔记018- 一般控件的使用的更多相关文章
- Android开发学习笔记-自定义组合控件的过程
自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...
- Android开发学习笔记-自定义组合控件
为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...
- iOS开发UI篇—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- iOS开发UI基础—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- iOS开发基础篇-手写控件
一.手写控件的步骤 1)使用相应的控件类创建控件对象: 2)设置该控件的各种属性: 3)添加空间到视图中: 4)如果是 UIButton 等控件,还需考虑控件的单击事件等: 二.添加 UIButton ...
- WPF-学习笔记 动态修改控件Margin的值
原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...
- IOS开发学习笔记019-动态创建控件
动态创建控件 一.按钮 二.文本输入框 三.lable标签 注意: 只是简单的拖拽控件会毁了你,所以最好还是手动通过代码创建控件. 如果要通过代码生成按钮的话,可以在系统自带的函数viewDidLoa ...
- iOS开发学习笔记:基础篇
iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...
- iOS开发学习笔记
1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...
随机推荐
- Mybatis-Spring整合Spring
因为 MyBatis 用 SqlSessionFactory 来创建 SqlSession ,SqlSessionFactoryBuilder 创建 SqlSessionFactory ,而在 Myb ...
- 关于HTML中时间格式以及查询数据库的问题
1.默认时间格式,加入属性dateFormate="yyyy-MM-dd" 2.设置默认值,value="2017-6-22" 3.在JavaScript中将获 ...
- 捷宇高拍仪XY530 网页集成总结
应甲方要求,需要把高拍仪集成到B/S系统中来,在集成过程中遇到的几点问题做为总结,以备查找. 1.甲方送来的高拍仪是淘宝上买来的,型号是XY530,功能非常简单,成像效果也很一般.如果没有其它要求,可 ...
- windows环境下Nginx部署及Https设置
一.Nginx安装部署及常用命令. 1.1.其实Nginx是免安装的.直接在官网下载zip包,解压即可,下载地址:http://nginx.org/en/download.html,因为我这边的开发服 ...
- linux 命令——42 kill (转)
Linux 中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以 使用Ctrl+C键,但是,对于一个后台进程 ...
- POJ 2385 Apple Catching(01背包)
01背包的基础上增加一个维度表示当前在的树的哪一边. #include<cstdio> #include<iostream> #include<string> #i ...
- 【BZOJ3123】[SDOI2013] 森林(启发式合并主席树)
点此看题面 大致题意: 给你一片森林,有两种操作:询问两点之间的第\(k\)小点权和在两棵树之间连一条边. 前置技能:树上主席树 做这道题目,我们首先要会树上主席树. 关于树上主席树,这有一道很好的例 ...
- vue组件 $children,$refs,$parent的使用
如果项目很大,组件很多,怎么样才能准确的.快速的寻找到我们想要的组件了?? 1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"&g ...
- Optional int parameter 'fundID' is present but cannot be translated into a null value due to being declared as a primitive type
错误的意思是: "可选的int参数'fundID'存在但由于被声明为基本类型而无法转换为空值" 意思是fundID被申明为int的基本数据类型, 不能转换为字符串的null值. 难 ...
- Win8如何默认以管理员运行程序
在Win7的时候,关闭UAC,使用自己的用户名,所有程序都是默认以管理员身份运行的. 但是在Win8,关闭UAC,程序不是默认以管理员身份运行的. 在论坛看到的解决方法是:1.用Administrat ...