transframe属性详解

1. transform属性

在OC中,通过transform属性可以修改对象的平移、缩放比例和旋转角度

常用的创建transform结构体方法分两大类

(1) 创建“基于控件初始位置”的形变

CGAffineTransformMakeTranslation(平移)

CGAffineTransformMakeScale(缩放)

CGAffineTransformMakeRotation(旋转)

(2) 创建“基于transform参数”的形变

CGAffineTransformTranslate

CGAffineTransformScale

CGAffineTransformRotate

补充:

在OC中,所有跟角度相关的数值,都是弧度值,180° = M_PI

正数表示顺时针旋转

负数表示逆时针旋转

/**

*  2D缩放

*/

  1. //起始位置:仅一次
  2. self.imageView2D.transform = CGAffineTransformMakeScale(, );
  3. //当前位置:多次
  4. self.imageView2D.transform = CGAffineTransformScale(self.imageView3D.transform, , );

/**

*  2D旋转

*/

  1. //起始位置:仅一次
  2. self.imageView2D.transform = CGAffineTransformMakeRotation(M_PI_4);
  3. //当前位置:多次;
  4. self.imageView2D.transform = CGAffineTransformRotate(self.imageView3D.transform, M_PI_4);

/**

*  2D平移

*/

  1. //起始位置:仅一次
  2. self.imageView2D.transform = CGAffineTransformMakeTranslation(, );
  3. //当前位置:多次
  4. self.imageView2D.transform = CGAffineTransformTranslate(self.imageView3D.transform, , );

/**

*  2D还原

*/

self.imageView2D.transform = CGAffineTransformIdentity;

其他:

  1. /**
  2.  
  3. /* Invert `t' and return the result. If `t' has zero determinant, then `t'
  4. is returned unchanged. */
  5.  
  6. CG_EXTERN CGAffineTransform CGAffineTransformInvert(CGAffineTransform t)
  7. CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  8.  
  9. /* Concatenate `t2' to `t1' and return the result:
  10. t' = t1 * t2 */
  11.  
  12. CG_EXTERN CGAffineTransform CGAffineTransformConcat(CGAffineTransform t1,
  13. CGAffineTransform t2) CG_AVAILABLE_STARTING(__MAC_10_0, __IPHONE_2_0);
  14. */

提示:由于transform属性可以基于控件的上一次的状态进行叠加形变,例如,先旋转再平移。因此在实际动画开发中,当涉及位置、尺寸形变效果时,大多修改控件的transform属性,而不是frame、bounds、center 。

2.代码示例

  1. //
  2. // YYViewController.m
  3. // 01-练习使用按钮的frame和center属性
  4. //
  5. // Created by apple on 14-5-21.
  6. // Copyright (c) 2014年 itcase. All rights reserved.
  7. //
  8.  
  9. #import "YYViewController.h"
  10.  
  11. //私有扩展
  12. @interface YYViewController ()
  13.  
  14. @property(nonatomic,weak)IBOutlet UIButton *headImageView;
  15. @end
  16.  
  17. @implementation YYViewController
  18.  
  19. //枚举类型,从1开始
  20. //枚举类型有一个很大的作用,就是用来代替程序中的魔法数字
  21. typedef enum
  22. {
  23. ktopbtntag=,
  24. kdownbtntag,
  25. krightbtntag,
  26. kleftbtntag
  27. }btntag;
  28.  
  29. //viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作
  30. - (void)viewDidLoad
  31. {
  32.  
  33. //在viewDidLoad方法中,不要忘记调用父类的方法实现
  34. [super viewDidLoad];
  35.  
  36. //手写控件代码
  37. //一、写一个按钮控件,上面有一张图片
  38.  
  39. //1.使用类创建一个按钮对象
  40. // UIButton *headbtn=[[UIButton alloc] initWithFrame:CGRectMake(100 ,100, 100, 100)];
  41. //设置按钮对象为自定义型
  42. UIButton *headbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  43.  
  44. //2.设置对象的各项属性
  45.  
  46. //(1)位置等通用属性设置
  47. headbtn.frame=CGRectMake(, , , );
  48.  
  49. //(2)设置普通状态下按钮的属性
  50. [headbtn setBackgroundImage:[UIImage imageNamed:@"i"] forState:UIControlStateNormal];
  51. [headbtn setTitle:@"点我!" forState:UIControlStateNormal];
  52. [headbtn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
  53.  
  54. //(3)设置高亮状态下按钮的属性
  55. [headbtn setBackgroundImage:[UIImage imageNamed:@"a"] forState:UIControlStateHighlighted];
  56. [headbtn setTitle:@"还行吧~" forState:UIControlStateHighlighted];
  57. [headbtn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted];
  58.  
  59. //3.把对象添加到视图中展现出来
  60. [self.view addSubview:headbtn];
  61. //注意点!
  62. self.headImageView=headbtn;
  63.  
  64. //二、写四个控制图片左右上下移动方向的按钮控件
  65.  
  66. /**================向上的按钮=====================*/
  67. //1.创建按钮对象
  68. UIButton *topbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  69.  
  70. //2.设置对象的属性
  71. topbtn.frame=CGRectMake(, , , );
  72. [topbtn setBackgroundImage:[UIImage imageNamed:@"top_normal"] forState:UIControlStateNormal];
  73. [topbtn setBackgroundImage:[UIImage imageNamed:@"top_highlighted"] forState:UIControlStateHighlighted];
  74. [topbtn setTag:];
  75. //3.把控件添加到视图中
  76. [self.view addSubview:topbtn];
  77.  
  78. //4.按钮的单击控制事件
  79. [topbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
  80.  
  81. /**================向下的按钮=====================*/
  82. //1.创建按钮对象
  83. UIButton *downbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  84. //2.设置对象的属性
  85. downbtn.frame=CGRectMake(, , , );
  86. [downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_normal"] forState:UIControlStateNormal];
  87. [downbtn setBackgroundImage:[UIImage imageNamed:@"bottom_highlighted"] forState:UIControlStateHighlighted];
  88. [downbtn setTag:];
  89. //3.把控件添加到视图中
  90. [self.view addSubview:downbtn];
  91.  
  92. //4.按钮的单击控制事件
  93. [downbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
  94.  
  95. /**================向左的按钮=====================*/
  96. //1.创建按钮对象
  97. UIButton *leftbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  98. //2.设置对象的属性
  99. leftbtn.frame=CGRectMake(, , , );
  100. [leftbtn setBackgroundImage:[UIImage imageNamed:@"left_normal"] forState:UIControlStateNormal];
  101. [leftbtn setBackgroundImage:[UIImage imageNamed:@"left_highlighted"] forState:UIControlStateHighlighted];
  102. [leftbtn setTag:];
  103. //3.把控件添加到视图中
  104. [self.view addSubview:leftbtn];
  105.  
  106. //4.按钮的单击控制事件
  107. [leftbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
  108.  
  109. /**================向右的按钮=====================*/
  110. //1.创建按钮对象
  111. UIButton *rightbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  112. //2.设置对象的属性
  113. rightbtn.frame=CGRectMake(, , , );
  114. [rightbtn setBackgroundImage:[UIImage imageNamed:@"right_normal"] forState:UIControlStateNormal];
  115. [rightbtn setBackgroundImage:[UIImage imageNamed:@"right_highlighted"] forState:UIControlStateHighlighted];
  116. [rightbtn setTag:];
  117. //3.把控件添加到视图中
  118. [self.view addSubview:rightbtn];
  119.  
  120. //4.按钮的单击控制事件
  121. [rightbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
  122.  
  123. //三、写两个缩放按钮
  124. /**================放大的按钮=====================*/
  125. //1.创建对象
  126. UIButton *plusbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  127. //2.设置属性
  128. plusbtn.frame=CGRectMake(, , , );
  129. [plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_normal"] forState:UIControlStateNormal];
  130. [plusbtn setBackgroundImage:[UIImage imageNamed:@"plus_highlighted"] forState:UIControlStateHighlighted];
  131. [plusbtn setTag:];
  132. //3.添加到视图
  133. [self.view addSubview:plusbtn];
  134. //4.单击事件
  135. [plusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];
  136.  
  137. /**================缩小的按钮=====================*/
  138. UIButton *minusbtn=[UIButton buttonWithType:UIButtonTypeCustom];
  139. minusbtn.frame=CGRectMake(, , , );
  140. [minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_normal"] forState:UIControlStateNormal];
  141. [minusbtn setBackgroundImage:[UIImage imageNamed:@"minus_highlighted"] forState:UIControlStateHighlighted];
  142. [minusbtn setTag:];
  143. [self.view addSubview:minusbtn];
  144. [minusbtn addTarget:self action:@selector(Zoom:) forControlEvents:UIControlEventTouchUpInside];
  145.  
  146. /**================向左旋转按钮=====================*/
  147. UIButton *leftrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];
  148. [leftrotatebtn setFrame:CGRectMake(, , , )];
  149. [leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_normal"] forState:UIControlStateNormal];
  150. [leftrotatebtn setBackgroundImage:[UIImage imageNamed:@"left_rotate_highlighted"] forState:UIControlStateHighlighted];
  151. [leftrotatebtn setTag:];
  152. [self.view addSubview:leftrotatebtn];
  153. [leftrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];
  154.  
  155. /**================向右旋转按钮=====================*/
  156. UIButton *rightrotatebtn=[UIButton buttonWithType:UIButtonTypeCustom];
  157. [rightrotatebtn setFrame:CGRectMake(, , , )];
  158. [rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_normal"] forState:UIControlStateNormal];
  159. [rightrotatebtn setBackgroundImage:[UIImage imageNamed:@"right_rotate_highlighted"] forState:UIControlStateHighlighted];
  160. [rightbtn setTag:];
  161. [self.view addSubview:rightrotatebtn];
  162. [rightrotatebtn addTarget:self action:@selector(Rotate:) forControlEvents:UIControlEventTouchUpInside];
  163. }
  164.  
  165. //控制方向的多个按钮调用同一个方法
  166. -(void)Click:(UIButton *)button
  167. {
  168.  
  169. //练习使用frame属性
  170. //CGRect frame=self.headImageView.frame;
  171.  
  172. /**注意,这里如果控制位置的两个属性frame和center同时使用的话,会出现很好玩的效果,注意分析*/
  173. //练习使用center属性
  174. CGPoint center=self.headImageView.center;
  175. switch (button.tag) {
  176. case ktopbtntag:
  177. center.y-=;
  178. break;
  179. case kdownbtntag:
  180. center.y+=;
  181. break;
  182. case kleftbtntag:
  183. //发现一个bug,之前的问题是因为少写了break,造成了它们的顺序执行,sorry
  184. //center.x=center.x-30;
  185. center.x-=;
  186. break;
  187. case krightbtntag:
  188. center.x+=;
  189. break;
  190. }
  191.  
  192. // self.headImageView.frame=frame;
  193.  
  194. //首尾式设置动画效果
  195. [UIView beginAnimations:nil context:nil];
  196. self.headImageView.center=center;
  197. //设置时间
  198. [UIView setAnimationDuration:2.0];
  199. [UIView commitAnimations];
  200. NSLog(@"移动!");
  201.  
  202. }
  203. -(void)Zoom:(UIButton *)btn
  204. {
  205. //使用bounds,以中心点位原点进行缩放
  206. CGRect bounds = self.headImageView.bounds;
  207. if (btn.tag) {
  208. bounds.size.height+=;
  209. bounds.size.width+=;
  210. }
  211. else
  212. {
  213. bounds.size.height-=;
  214. bounds.size.width-=;
  215. }
  216.  
  217. //设置首尾动画
  218. [UIView beginAnimations:nil context:nil];
  219. self.headImageView.bounds=bounds;
  220. [UIView setAnimationDuration:2.0];
  221. [UIView commitAnimations];
  222. }
  223.  
  224. -(void)Rotate:(UIButton *)rotate
  225. {
  226. //位移(不累加)
  227. //self.headImageView.transform=CGAffineTransformMakeTranslation(50, 200);
  228. //缩放
  229. //self.headImageView.transform=CGAffineTransformMakeScale(1.2, 10);
  230. //在原有的基础上位移(是累加的)
  231. //self.headImageView.transform=CGAffineTransformTranslate(self.headImageView.transform, 50, 50);
  232. //在原有的基础上进行缩放
  233. //self.headImageView.transform=CGAffineTransformScale(self.headImageView.transform, 1.5, 1.6);
  234.  
  235. //在原有的基础上进行旋转
  236. if (rotate.tag) {
  237. //旋转角度为1/pi,逆时针
  238. self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, -M_1_PI);
  239. }
  240. else
  241. {
  242. //旋转的角度为pi/2,顺时针
  243. self.headImageView.transform=CGAffineTransformRotate(self.headImageView.transform, M_PI_2);
  244. }
  245.  
  246. }
  247. @end

3.viewDidLoad

viewDidLoad是视图加载完成后调用的方法,通常在此方法中执行视图控制器的初始化工作

在viewDidLoad方法中,一定不要忘记调用父类的方法实现

[super viewDidLoad];

  1. CATransform3D

/**

*  3D缩放

*/

  1. //起始位置:仅一次
  2.  
  3. self.imageView3D.layer.transform = CATransform3DMakeScale(1.0, 0.8, 0.9);
  4.  
  5. //当前位置:多次
  6.  
  7. self.imageView3D.layer.transform = CATransform3DScale(self.imageView3D.layer.transform, 1.0, 0.8, 0.9);

/**

*  3D旋转

*/

  1. //起始位置:仅一次
  2.  
  3. self.imageView3D.layer.transform = CATransform3DMakeRotation(M_PI/, 0.5, 0.8, 0.3);
  4.  
  5. //当前位置:多次
  6.  
  7. self.imageView3D.layer.transform = CATransform3DRotate(self.imageView3D.layer.transform, M_PI_2, , );

/**

*  3D平移

*/

  1. //起始位置:仅一次
  2.  
  3. self.imageView3D.layer.transform = CATransform3DMakeTranslation(, , );
  4.  
  5. //当前位置:多次
  6.  
  7. self.imageView3D.layer.transform = CATransform3DTranslate(self.imageView3D.layer.transform, , , );

/**

*  3D

*/

  1. //起始位置:仅一次
  2.  
  3. // self.imageView3D.layer.transform = CATransform3DMakeAffineTransform(<#CGAffineTransform m#>);
  4.  
  5. // //当前位置:多次
  6.  
  7. // self.imageView3D.layer.transform = CATransform3DIsAffine(<#CATransform3D t#>)
  1. CATransform3D结构成员的意义。
  2.  
  3. struct CATransform3D
  4. {
  5. CGFloat m11x缩放), m12y切变), m13(旋转), m14();
  6. CGFloat m21x切变), m22y缩放), m23(), m24();
  7. CGFloat m31(旋转), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义);
  8. CGFloat m41x平移), m42y平移), m43z平移), m44();
  9. };
  10. ps:整体比例变换时,也就是m11==m22时,若m33>,图形整体缩小,若0<m33<,图形整体放大,若s<,发生关于原点的对称等比变换。
  11. ()空的地方以后补充。
  12. . CATransform3DMakeTranslation
  13. CATransform3DMakeTranslation(, , ) 创建了一个4*4的单位矩阵。
  14. . CATransform3DMakeRotation And CATransform3DRotate
  15. CATransform3DMakeRotation()
  16. _transformedLayer = [CALayer layer];
  17. _transformedLayer.frame = self.bounds;
  18. _transformedLayer.anchorPoint = CGPointMake(0.5f, 0.5f);
  19. CATransform3D sublayerTransform = CATransform3DIdentity;
  20. // Set perspective
  21. sublayerTransform.m34 = kPerspective;
  22. [_transformedLayer setSublayerTransform:sublayerTransform];
  23.  
  24. [self.layer addSublayer:_transformedLayer];
  25. //init Sublayers
  26. CATransform3D t = CATransform3DMakeTranslation(, , );
  27. // take snapshot of the current view
  28. [_transformedLayer addSublayer:[self snapshot:t
  29. withView:_contentView
  30. isMasked:YES]];
  31. // 暂时先支持一个方向翻转
  32. RotateDirection direction = RotateFromBottom;
  33. if (YES || direction == RotateFromBottom)
  34. {
  35. CGFloat height = self.bounds.size.height;
  36. //CGFloat cubeSize = 100.0f;
  37. t = CATransform3DRotate(t, D2R(, , );【】
  38. t = CATransform3DTranslate(t, , height, );
  39. CALayer *subLayer = [self snapshot:t withView:view isMasked:YES];
  40. [_transformedLayer addSublayer:subLayer];
  41. }
  42. else
  43. {
  44. }
  45.  
  46. _newContentView = view;
  47.  
  48. [self animationCubeRotate:direction withDuration:duration];
  49.   
  50. . 翻转的动画
  51. - (void)animationCubeRotate:(RotateDirection)direction
  52. withDuration:(float)duration
  53. {
  54. [CATransaction flush];
  55. CGFloat height = self.bounds.size.height;
  56. CABasicAnimation *rotation;
  57. // CABasicAnimation *translationX; // 如果沿X轴翻转,则用不到这个变量.
  58. CABasicAnimation *translationY; // 如果沿Y轴翻转,则用不到这个变量.
  59. CABasicAnimation *translationZ;
  60. CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
  61. animationGroup.delegate = self;
  62. animationGroup.duration = duration;
  63.  
  64. if ( direction == RotateFromBottom )
  65. {
  66. // 创建(某方向)关键帧动画.
  67. translationY = [CABasicAnimation animationWithKeyPath:
  68. @"sublayerTransform.translation.y"];
  69. translationY.toValue = [NSNumber numberWithFloat:-(height / )];【】
  70. rotation = [CABasicAnimation animationWithKeyPath:
  71. @"sublayerTransform.rotation.x"];
  72. rotation.toValue = [NSNumber numberWithFloat:D2R(-90.0f)];
  73. }
  74. else if ( direction == RotateFromTop )
  75. {
  76. }
  77.  
  78. // 处理Z轴
  79. translationZ = [CABasicAnimation animationWithKeyPath:
  80. @"sublayerTransform.translation.z"];
  81. translationZ.toValue = [NSNumber numberWithFloat:height / ];【】
  82. animationGroup.animations =
  83. [NSArray arrayWithObjects: rotation, translationY, translationZ, nil];
  84. animationGroup.fillMode = kCAFillModeForwards;
  85. animationGroup.removedOnCompletion = NO;
  86. [_transformedLayer addAnimation:animationGroup forKey:kAnimationKey];
  87. }

高级使用:

透射投影:(矩阵相乘)

首先封装我们想要的功能

  1.  
  2. CATransform3D CATransform3DMakePerspective(CGPoint center, float disZ)
  3.  
  4. {
  5.  
  6. CATransform3D transToCenter = CATransform3DMakeTranslation(-center.x, -center.y, );
  7.  
  8. CATransform3D transBack = CATransform3DMakeTranslation(center.x, center.y, );
  9.  
  10. CATransform3D scale = CATransform3DIdentity;
  11.  
  12. scale.m34 = -1.0f/disZ;
  13.  
  14. return CATransform3DConcat(CATransform3DConcat(transToCenter, scale), transBack);
  15.  
  16. }
  17.  
  18. CATransform3D CATransform3DPerspect(CATransform3D t, CGPoint center, float disZ)
  19.  
  20. {
  21.  
  22. return CATransform3DConcat(t, CATransform3DMakePerspective(center, disZ));
  23.  
  24. }

那么使用起来就非常简单了:

  1. CATransform3D rotate = CATransform3DMakeRotation(M_PI/, , , );
  2.  
  3. self.imageView3D.layer.transform = CATransform3DPerspect(rotate, CGPointMake(, ), );
  4.  
  5. // CATransform3D rotate = CATransform3DMakeRotation(M_PI/6, 0, 0, 1);
  6.  
  7. // self.imageView3D.layer.transform = CATransform3DPerspect(rotate, CGPointMake(0, 0), 200);

四张同样大小的图片围成一个框,让这个框动画旋转。

  1.  
  2. CATransform3D move = CATransform3DMakeTranslation(, , );
  3.  
  4. CATransform3D back = CATransform3DMakeTranslation(, , -);
  5.  
  6. CATransform3D rotate0 = CATransform3DMakeRotation(-angle, , , );
  7.  
  8. CATransform3D rotate1 = CATransform3DMakeRotation(M_PI_2-angle, , , );
  9.  
  10. CATransform3D rotate2 = CATransform3DMakeRotation(M_PI_2*-angle, , , );
  11.  
  12. CATransform3D rotate3 = CATransform3DMakeRotation(M_PI_2*-angle, , , );
  13.  
  14. CATransform3D mat0 = CATransform3DConcat(CATransform3DConcat(move, rotate0), back);
  15.  
  16. CATransform3D mat1 = CATransform3DConcat(CATransform3DConcat(move, rotate1), back);
  17.  
  18. CATransform3D mat2 = CATransform3DConcat(CATransform3DConcat(move, rotate2), back);
  19.  
  20. CATransform3D mat3 = CATransform3DConcat(CATransform3DConcat(move, rotate3), back);
  21.  
  22. image0.layer.transform = CATransform3DPerspect(mat0, CGPointZero, );
  23.  
  24. image1.layer.transform = CATransform3DPerspect(mat1, CGPointZero, );
  25.  
  26. image2.layer.transform = CATransform3DPerspect(mat2, CGPointZero, );
  27.  
  28. image3.layer.transform = CATransform3DPerspect(mat3, CGPointZero, );

普通界面的立体翻转效果

  1. * 1.732f;
  2.  
  3. CATransform3D move = CATransform3DMakeTranslation(, , dis);
  4.  
  5. CATransform3D back = CATransform3DMakeTranslation(, , -dis);
  6.  
  7. CATransform3D rotate0 = CATransform3DMakeRotation(-angle, , , );
  8.  
  9. CATransform3D rotate1 = CATransform3DMakeRotation(-angle + M_PI/, , );
  10.  
  11. CATransform3D mat0 = CATransform3DConcat(CATransform3DConcat(move, rotate0), back);
  12.  
  13. CATransform3D mat1 = CATransform3DConcat(CATransform3DConcat(move, rotate1), back);
  14.  
  15. view0.layer.transform = CATransform3DPerspect(mat0, CGPointZero, );
  16.  
  17. view1.layer.transform = CATransform3DPerspect(mat1, CGPointZero, );

本文需要一定的数学基础,特别是想要实现非常炫酷的效果,当然如果你只是想要实现简单的动画效果那么久没那么多要求了!

iOS开发——UI篇OC&transform详解的更多相关文章

  1. iOS开发——UI篇OC篇&UIDynamic详解

    iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...

  2. iOS开发——UI篇OC篇&SpriteKit详解

    SpriteKit详解 SpriteKit,iOS/Mac游戏制作的新纪元 这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或 ...

  3. iOS开发——UI篇OC篇&UIStackView详解

    UIStackView详解 一.继承关系.遵守协议.隶属框架及可用平台 UIStackView 类提供了一个高效的接口用于平铺一行或一列的视图组合.Stack视图使你依靠自动布局的能力,创建用户接口使 ...

  4. iOS开发——UI篇OC篇&UICollectionView详解+实例

    UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2. ...

  5. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  6. iOS开发——UI篇OC篇&TextField作为搜索框的使用

    TextField作为搜索框的使用 在iOS开发中我们经常会使用到搜索框,但是有的时候系统自带的搜索框不足以满足我吗想要的功能,这个时候我们就可以使用自定义的搜索框实现想要的功能. 今天就简单的介绍一 ...

  7. 【转】IOS开发网络篇之──ASIHTTPRequest详解

    ASIHTTPRequest 详解, http 请求终结者 版权归旺财勇士所有〜转载需声名〜 原贴地地址:http://wiki.magiche.net/pages/viewpage.action?p ...

  8. iOS开发——UI篇OC篇&UIView/UIWindow/UIScreen/CALayer

    UIView/UIWindow/UIScreen/CALayer 1.UIScreen可以获取设备屏幕的大小. 1 2 3 4 5 6 7 // 整个屏幕的大小 {{0, 0}, {320, 480} ...

  9. iOS开发——UI篇OC篇&不规则排列的图片布局

    不规则排列的图片布局 一直在500px上看照片,发照片.以前看它的首页图片展示就只是觉得好看,洋气,也没想过自己在iOS上实现一下.昨天不知怎么的就开始想其中的算法了,现在我把思考的过程在这里贴出来分 ...

随机推荐

  1. 使用BusyBox制作嵌入式Linux根文件系统

    STEP 1:构建目录结构  创建根文件系统目录,主要包括以下目录/dev  /etc /lib  /usr  /var /proc /tmp /home /root /mnt /bin  /sbin ...

  2. ajax取json数据——简单的

    json数据:json4.json <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  3. 使用SQL Server 2005作业设置定时任务

    公司有一个老项目由于直接把终端拍摄的图片以二进制的形式保存到数据库中,数据库比较大所以需要经常删除这些冗余数据,手动删除费时费力,项目组长让我把这些操作变成自动的,每天执行一次,只保留最近两个月的图片 ...

  4. [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.5

    Suppose it is known that $\scrM$ is an invariant subspace for $A$. What invariant subspaces for $A\o ...

  5. 【Jenkins】linux下Jenkins集成ant进行编译并发送结果

    三个文章吧: 1 如何使用ant编译执行jmeter测试用例,并生成html报告 2 如何在Linux下搭建jenkins环境. 3 如何在Linux下搭建的jenkins中执行ant构建运行,并发送 ...

  6. 如何查看.Net FrameWork,VC++ 等安装包的启动参数

    最近做了一个客户端的程序,客户端程序运行环境要求是.Net FrameWork 4.0 和VC++ 2012 ,在做安装包的时候需要先检测系统环境是否存在这些环境,不存在则安装对应环境. 使用工具来制 ...

  7. Android UI -- 的基础知识。

    在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...

  8. oracle修改process和session数

    第一步:连接服务器,输入sqlplus 第二步:以sysdba身份登陆 第三步:查看和修改processes和sessions参数 1. 查看processes和sessions参数 select * ...

  9. uva 11995 I Can Guess the Data Structure stack,queue,priority_queue

    题意:给你n个操做,判断是那种数据结构. #include<iostream> #include<cstdio> #include<cstdlib> #includ ...

  10. HIbernate学习笔记(二) hibernate对象的三种状态与核心开发接口

    1.在hibernate中持久化对象有三个状态,这个面试时可能会问到: (1)transient瞬时态:在数据库中没有与之匹配的数据,一般就是只new出了这个对象,并且在session缓存中也没有即此 ...