今天把别人源代码的看了一遍,发现学到了不少,收获良多。今天一整天就是为了调整结构代码。去了storyboard,完全手工代码书写界面。好现在开始记录了。
UIView 里面有一个frame 属性,里面记录了size 和 origin 的值。这两个属性值讲白一点,其实就是记录宽度(width)和高度(height),以及坐标点(x,y)。
之前一直写的时候 包括每次引用 宽度 和高度的时候,老是觉得为什么ios 不封装width 和height 和x,y 提供 我们用即可? 这样子就省下了很多工序。初学的时候,老是会写这些代码
self.menu.frame=(CGRect){0,0,self.view.frame.size.width,self.view.frame.size.height};
看看这一串的引用也够长了。今天看到一个作者的做法就干脆扩展这个UIView 的类别 以实现 width, height, x,y的属性。这样一来我们就不用使用这样多的引用过程。这一招也挺实用。
self.menu.frame=(CGRect){0,0,self.view.width,self.view.height};
self.menu.frame=(CGRect){self.view.x,self.view.y,self.view.width,self.view.height};
扩展后,写起来就不用那么多 繁琐了。((- -!)xcode 第一次写居然不知道类别在哪里,后来找了文章 就记下来好了)
下面创建一个类别名为 UIView+DisPlayObject.h 和 UIView+DisPlayObject.m 点击Ios – 选择Objective-C File
选择文件类别为CateGory(类别)点击next,完成后就生成了对于的文件。
然后在相应的文件添加想要的属性值。有了这个方法后,写起来就不用那么蛋碎写frame.size.width 之类的写法。个人认为这种设计还是很有必要的。从业务而言,经常很频繁使用。这样的设计很方便也符合前端的设计思维。
#import <UIKit/UIKit.h>
@interface UIView (DisplayObject)
@property (nonatomic) CGFloat width,height,x,y;
@end
-(void) setWidth:(CGFloat)width
{
CGRect rect = self.frame;
rect.size.width = width;
self.frame = rect;
}
-(CGFloat) width
{
return self.frame.size.width;
}
-(void) setHeight:(CGFloat)height
{
CGRect rect = self.frame;
rect.size.height = height;
self.frame = rect;
}
-(CGFloat) height
{
return self.frame.size.height;
}
-(void) setX:(CGFloat)x
{
CGRect rect = self.frame;
rect.origin.x = x;
self.frame = rect;
}
-(CGFloat) x
{
return self.frame.origin.x;
}
-(void) setY:(CGFloat)y
{
CGRect rect = self.frame;
rect.origin.y =y;
self.frame = rect;
}
-(CGFloat) y
{
return self.frame.origin.y;
}
为了兼容mac , 我发现利用ifdef的做法可以兼容两者的使用。鉴于目前水平有限 只能先设计这种方式先。
除了扩展UIView外,在游戏开发过程当中,包括面板类,经常继承类似Panel 或者叫BasePanel 或者叫BaseView 这样的设计。利用好这个设计,在整个框架里面就可以自己封装业务。