让结构体类型frame的某个属性可以直接修改
转载:http://www.cnblogs.com/dsxniubility/p/4264677.html
ios开发中,UI控件的frame属性是大家最熟悉不过, 例如UIView中定义的 @property(nonatomic) CGRect frame;
可以看出CGRect类型的frame作为OC对象UIView的属性,因为OC语法规定不能单独对OC对象的结构体属性的单个成员进行修改,所以UI控件的frame属性修改起来比较麻烦,只能通过对view.frame整体进行赋值。像下面这样先取出,改一下再重新赋值回去,也就是大家常说的三部曲:(在方法中单独定义的结构体类型的临时变量CGRect btnFrame,虽然btnFrame也是结构体,但并没有作为任何类/对象的属性,所以是可以对它的成员直接进行修改的。)
如果结构体类型的东西也可以直接修改 那会有多爽?就像下面这样。
其实只要自己给UIView写个分类就好了 用这个分类来替代frame。
大概思想就是给用分类给UIView多增加几个属性x,y,height,width。这几个属性都分别实现get方法和set方法。这样以后frame就可以离开他了
分类UIView+Frame 声明
1 //
2 // UIView+Frame.h
3 // SXDownLoader
4 //
5 // Created by 董尚先 on 15/1/2.
6 // Copyright (c) 2015年 shangxianDante. All rights reserved.
7 //
8
9 #import <UIKit/UIKit.h>
10
11 @interface UIView (Frame)
12
13 // 自己模仿frame写出他的四个属性
14 @property (nonatomic, assign) CGFloat x;
15 @property (nonatomic, assign) CGFloat y;
16 @property (nonatomic, assign) CGFloat width;
17 @property (nonatomic, assign) CGFloat height;
18
19
20 @end
分类UIView+Frame 实现
#import "UIView+Frame.h"
@implementation UIView (Frame)
- (void)setX:(CGFloat)x
{
CGRect frame = self.frame;
frame.origin.x = x;
self.frame = frame;
}
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setY:(CGFloat)y
{
CGRect frame = self.frame;
frame.origin.y = y;
self.frame = frame;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (void)setWidth:(CGFloat)width
{
CGRect frame = self.frame;
frame.size.width = width;
self.frame = frame;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (void)setHeight:(CGFloat)height
{
CGRect frame = self.frame;
frame.size.height = height;
self.frame = frame;
}
- (CGFloat)height
{
return self.frame.size.height;
}
@end
之后在需要的地方Import一下
就可以把那些UI控件什么的frame轻松的单个修改了
分类: 工具推荐,其他杂文