/**
初始化父子控件(在里面添加子控件,并且设置父控件和子控件的属性,不能设置子控件的尺寸和位置)
*/
-(instancetype)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if (self == nil) {
self = [[[NSBundle mainBundle]loadNibNamed:@"ZXSWheelView" owner:nil options:nil] lastObject];
}
return self;
}
/**
唤醒xib控件(可以在里面设置xib控件的属性,且添加子控件和设置其属性,用于一次性的操作)
*/
-(void)awakeFromNib{
[super awakeFromNib];
self.contentV.userInteractionEnabled = YES;
}
/*
取消按钮高亮状态下做的事(自定义button控件,重写该方法会使button控件没有高亮状态)
*/
-(void)setHighlighted:(BOOL)highlighted {
}
/*
返回当前按钮当中ImageView的位置尺寸(自定义button控件,重写该方法)
*/
//contentRect:当前按钮的位置尺寸
-(CGRect)imageRectForContentRect:(CGRect)contentRect {
CGFloat w = 40;
CGFloat h= 48;
CGFloat x = (contentRect.size.width - w) * 0.5;
CGFloat y = 20;
return CGRectMake(x, y, w, h);
}
/*
返回当前按钮当中Label的位置尺寸(自定义button控件,重写该方法)
*/
-(CGRect)titleRectForContentRect:(CGRect)contentRect {
}
/*
CGImageCreateWithImageInRect方法是截取一段图片中的某一部分
*/
//CGImageCreateWithImageInRect,使用的坐标都是以像素点,
//在ios当中使用的都是点坐标.
CGImageRef clipImage = CGImageCreateWithImageInRect(oriImage.CGImage, CGRectMake(X, Y, clipW, clipH));
//设置按钮正常状态下显示的图片
[btn setImage:[UIImage imageWithCGImage:clipImage] forState:UIControlStateNormal];
/*
在实例-UI高级转盘
*/
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
CGRect rect = CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height * 0.5);
if (CGRectContainsPoint(rect, point)) {
//在指定的范围内
return [super hitTest:point withEvent:event];
}else {
return nil;
}
}
/*
返回当前UIView内容layer类型(需要自定义View,并且重写该方法,用于设置View内容layer为复制层<图层>)
*/
+(Class)layerClass {
return [CAReplicatorLayer class];
}
/*
当核心动画结束时调用-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag方法(实例-UI高级转盘)
*/
//让转盘快速的旋转几圈,
CABasicAnimation *anim = [CABasicAnimation animation];
anim.keyPath = @"transform.rotation";
anim.toValue = @(M_PI * 4);
anim.duration = 0.5;
anim.delegate = self;
[self.contentV.layer addAnimation:anim forKey:nil];
//动画结束时当前选中的按钮指向最上方
//当动画结束时调用
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
//动画结束时当前选中的按钮指向最上方
//让当前选中的按钮的父控件倒着旋转回去.
//获取当前选中按钮旋转的角度
CGAffineTransform transform = self.selectBtn.transform;
//通过transform获取当前旋转的度数
CGFloat angle = atan2(transform.b, transform.a);
self.contentV.transform = CGAffineTransformMakeRotation(-angle);
}
//监听icon弹窗(实例-UI高级3DTouch)
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
if ([shortcutItem.type isEqualToString:@"tpye0"]) {
NSLog(@"%@",shortcutItem.userInfo[@"info"]);
} else {
NSLog(@"asdf");
}
}
/*
归档与解档
*/
//归档可以保存模型数据
//归档 archiveRootObject会调用encodeWithCoder:
[NSKeyedArchiver archiveRootObject:per toFile:filePath];
//在保存对象时告诉要保存当前对象哪些属性.遵守了NSCoding协议时才能写出下面方法
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInt:self.age forKey:@"age"];
[aCoder encodeObject:self.dog forKey:@"dog"];
}
//解档数据
//unarchiveObjectWithFile会调用initWithCoder
Person *per = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
//当解析一个文件的时候调用.(告诉当前要解析文件当中哪些属性.)遵守了NSCoding协议时才能写出下面方法
- (instancetype)initWithCoder:(NSCoder *)aDecoder{
//当只有其父类遵守了NSCoding协议时,才有[super initWithCoder] 否则 当只有其遵守了NSCoding协议时,才只能使用[super init]
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntForKey:@"age"];
self.dog = [aDecoder decodeObjectForKey:@"dog"];
}
return self;
}
/**
隐藏头部状态栏
*/
-(BOOL)prefersStatusBarHidden{
return YES;
}
/**
当控制器接受到内存警告的时候调用、系统调用、去除一些不必要的内存,去除耗时内存
*/
-(void)didReceiveMemoryWarning:{
}
/**
控制器的view已经显示完毕的时候调用
*/
-(void)viewDidAppear:(Bool)animated:{
NSLog(@"%@",self.view.superview)
//打印 **<UIWindow: 0x7fc8e2c0a670; frame = (0 0; 414 736); gestureRecognizers = <NSArray: 0x600000244e90>; layer = <UIWindowLayer: 0x60000003c7e0>>**,
//说明在view显示完毕的时候控制器的view并早就成为应用窗口的子控件
[self.view removeFromSuperview];
//可以将控制器的view从父控件窗口window下移除
}
/**
控制器的view将要显示的时候调用
*/
-(void)viewWillAppear:(Bool)animated:{
}
/**
布局子控件位置(这里可以拿到frame)
*/
-(void)layoutSubviews{
}
/*
// 什么时候调用 当程序一启动的时候就会调用,它先于main()函数先调用,ARC机制是在main函数调用后执行的,这样使用load方法就会出现内存需要自己管理,load方法至始至终只调用一次
// 作用: 将当前类加载进内存, 放在代码区
*/
+(void)load{
}
/**
loadView作用:
控制器加载view的时候调用(当调完这个方法后就会调用
什么时候调用:当第一次使用控制器View的时候调用.
什么时候重写loadView方法.当控制器的View一开始就是一个UIImageView,或者是一个UIWebView时候,可以直接让控制器一开始创建的时候就是它.这样做的好处少创建了一个UIView.自定义控制器的View时
只要界面一切换,就会调用该方法加载View
loadView默认作法:
1.先去判断当前控制器是否从StoryBoard当中加载,如果是从StoryBoard当中加载,那么就把storyBoard当中指定的控制器的View赋值给当前控制器控制器的View.
2.判断当前控制器的View是否从xib当中加载,如果是,那么就把xib当中的View赋值给当前控制器的View.
3.如果都不是话, 那么就创建一个空的View,给当前控制器的View赋值.
**/
-(void)loadView{
[super loadView];
XMGView *xmgV = [[XMGView alloc] init];
xmgV.backgroundColor = [UIColor blueColor];
self.view = xmgV;
}
/**
是在控制器的view加载完毕的时候调用(重写系统方法需要父类调用相应的方法)是由系统来调用的、一般用于控件的初始化,数据的初始化(数据的初始化一般最好在懒加载中进行,当然在-viewdidload方法里面也同样可以)
*/
-(void)viewDidLoad:{
NSLog(@"%@",self.view.superview);打印为null,说明在view加载完毕的时候控制器的view并没有成为应用窗口的子控件
}
/*
// 什么时候调用 当第一次初始这个类的时候调用,如果当这个类有子类会调用多次(当前类或者它的子类每一次使用的时候, 会调用这个方法)
// 作用 初始化这个类
项目实例-UI项目-彩票
*/
+ (void)initialize{
if (self == [ZXSNavigationController class]) {
//设置导航栏的背景,字体颜色,大小, 这些都是属性导航控制器的,所以这些应该放到导航控制器的内部.
//获取整个项目当中的UINavigationBar.
//用这个方法,获取整个项目当中的UINavigationBar.系统的也给获取了,也给设置了背景,我们不须要改系统的东西.
//所以在这里,不能直接获取整个系统当中的UINavigationBar..所以我们也不直接使用这个.
// UINavigationBar *bar = [UINavigationBar appearance];
//初始化本类时,设置导航控制栏的属性
//1.设置导航条背景和字体颜色属性
//获取导航条标识
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[[ZXSNavigationController class]]];
//设置背景图片
//想要设置导航栏背景图片.必须得要使用UIBarMetricsDefault
//设置为UIBarMetricsDefault的,控制器的View的Y值从64开始.其它类型的控制器的View的Y值从0开始.
[bar setBackgroundImage:[UIImage imageNamed:@"NavBar64"] forBarMetrics:UIBarMetricsDefault];
// 设置字体颜色大小
NSMutableDictionary *dictM = [NSMutableDictionary dictionary];
//字体大小
dictM[NSFontAttributeName] = [UIFont boldSystemFontOfSize:22];
// 字体颜色
dictM[NSForegroundColorAttributeName] = [UIColor whiteColor];
//设置富文本
[bar setTitleTextAttributes:dictM];
//设置导航条前景色
[bar setTintColor:[UIColor whiteColor]];
//2.设置简单返回按钮(统一设置返回按钮)
//获取导航条按钮标识
UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedIn:self, nil];
//设置返回按钮的标题文字位置
[item setBackButtonTitlePositionAdjustment:UIOffsetMake(0,-100) forBarMetrics:UIBarMetricsDefault];
}
}
网友评论