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- 一般控件的使用的更多相关文章

  1. Android开发学习笔记-自定义组合控件的过程

    自定义组合控件的过程 1.自定义一个View 一般来说,继承相对布局,或者线性布局 ViewGroup:2.实现父类的构造方法.一般来说,需要在构造方法里初始化自定义的布局文件:3.根据一些需要或者需 ...

  2. Android开发学习笔记-自定义组合控件

    为了能让代码能够更多的复用,故使用组合控件.下面是我正在写的项目中用到的方法. 1.先写要组合的一些需要的控件,将其封装到一个布局xml布局文件中. <?xml version="1. ...

  3. iOS开发UI篇—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  4. iOS开发UI基础—手写控件,frame,center和bounds属性

    iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...

  5. iOS开发基础篇-手写控件

    一.手写控件的步骤 1)使用相应的控件类创建控件对象: 2)设置该控件的各种属性: 3)添加空间到视图中: 4)如果是 UIButton 等控件,还需考虑控件的单击事件等: 二.添加 UIButton ...

  6. WPF-学习笔记 动态修改控件Margin的值

    原文:WPF-学习笔记 动态修改控件Margin的值 举例说明:动态添加一个TextBox到Grid中,并设置它的Margin: TextBox text = new TextBox(); t_gri ...

  7. IOS开发学习笔记019-动态创建控件

    动态创建控件 一.按钮 二.文本输入框 三.lable标签 注意: 只是简单的拖拽控件会毁了你,所以最好还是手动通过代码创建控件. 如果要通过代码生成按钮的话,可以在系统自带的函数viewDidLoa ...

  8. iOS开发学习笔记:基础篇

    iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境 ...

  9. iOS开发学习笔记

    1 常用的第三方工具 1.1 iPhone Simulator 测试程序需要模拟器iPhone Simulator 1.2 设计界面需要Interface Builder,Interface Buil ...

随机推荐

  1. Mybatis-Spring整合Spring

    因为 MyBatis 用 SqlSessionFactory 来创建 SqlSession ,SqlSessionFactoryBuilder 创建 SqlSessionFactory ,而在 Myb ...

  2. 关于HTML中时间格式以及查询数据库的问题

    1.默认时间格式,加入属性dateFormate="yyyy-MM-dd" 2.设置默认值,value="2017-6-22" 3.在JavaScript中将获 ...

  3. 捷宇高拍仪XY530 网页集成总结

    应甲方要求,需要把高拍仪集成到B/S系统中来,在集成过程中遇到的几点问题做为总结,以备查找. 1.甲方送来的高拍仪是淘宝上买来的,型号是XY530,功能非常简单,成像效果也很一般.如果没有其它要求,可 ...

  4. windows环境下Nginx部署及Https设置

    一.Nginx安装部署及常用命令. 1.1.其实Nginx是免安装的.直接在官网下载zip包,解压即可,下载地址:http://nginx.org/en/download.html,因为我这边的开发服 ...

  5. linux 命令——42 kill (转)

    Linux 中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以 使用Ctrl+C键,但是,对于一个后台进程 ...

  6. POJ 2385 Apple Catching(01背包)

    01背包的基础上增加一个维度表示当前在的树的哪一边. #include<cstdio> #include<iostream> #include<string> #i ...

  7. 【BZOJ3123】[SDOI2013] 森林(启发式合并主席树)

    点此看题面 大致题意: 给你一片森林,有两种操作:询问两点之间的第\(k\)小点权和在两棵树之间连一条边. 前置技能:树上主席树 做这道题目,我们首先要会树上主席树. 关于树上主席树,这有一道很好的例 ...

  8. vue组件 $children,$refs,$parent的使用

    如果项目很大,组件很多,怎么样才能准确的.快速的寻找到我们想要的组件了?? 1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"&g ...

  9. 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值. 难 ...

  10. Win8如何默认以管理员运行程序

    在Win7的时候,关闭UAC,使用自己的用户名,所有程序都是默认以管理员身份运行的. 但是在Win8,关闭UAC,程序不是默认以管理员身份运行的. 在论坛看到的解决方法是:1.用Administrat ...