2015-07-05
1、Tabbar的高度为 49
2015-07-07
2、当系统自带的 tabber 不能满足的适合,得自己重新定义一个 tabber 的 view,替换系统的。
3、比如想取消按钮按下时的灰色状态,则需要自己定义一个按钮继承系统的按钮,然后重写
// 重写这个方法是为了去掉系统原来自带的效果(例如:按下的状态图片变灰)
- (void)setHighlighted:(BOOL)highlighted { // 这个方法此时不需要调用,因为不需要系统自带的效果 // [super setHighlighted:highlighted];
}
这样即可。原因是重新定义的 highlighted 替换了系统里面复杂的操作,使灰色状态不能正常显示。
4、一般要扩展系统自带的方法,重写某个方法的时候,一定要调用 super 方法,不然原来系统自带的效果就会丢失
- (void)setHighlighted:(BOOL)highlighted { // 这个方法此时不需要调用,因为不需要系统自带的效果 [super setHighlighted:highlighted]; }
5、init 方法内部会自动调用 initWithFrame: 方法,一般来说,想在一个控件初始化的时候做一些事情,并不是重写 init 方法,而是重写 initWithFrame: 方法
UI 控件:建议重写 initWithFrame:来初始化
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame];
if (self) {
// add your code
}
return self;
}
initWithFrame: 是当使用代码创建控件的时候就会调用
initWithCoder: 是使用storyboard 、 文件 、xib 创建控件的时候就会调用
所以当要自定义一个控件的时候,最严谨的做法是同时重写这两个方法。
6、一个控件显示不出来有可能以下原因:
1.宽度高度是否为0;
2.hiden 属性是否为 YES;
3.
7、初始化方法( initWithFrame:)只用来添加子控件,等我们自己的 frame 确定了之后再设置 控件的 frame ,解决方法:重写 layoutSubviews 方法。
- (void)layoutSubviews { [super layoutSubviews]; // 一定要先调用 super 方法 // 在这里设置的 frame 才是正确的
for (int i=0; i<5; i++) { // CJButton *button = [[CJButton alloc] init]; // 傻逼,这样写相当于创建了新的按钮了,这里要在原来的添加的里面取出来才是对的
CJButton *button = self.subviews[i]; // 设置按钮的 frame
CGFloat buttonY = 0; CGFloat buttonW = self.frame.size.width*0.2; CGFloat buttonH = self.frame.size.height; CGFloat buttonX = buttonW*i; button.frame = CGRectMake(buttonX,buttonY, buttonW, buttonH); } }
2015年7月12日
8、block 的一些基本知识
定义一个block:
int (^myBlock)(int , int ) = ^(int a,int b){
return a+b;
};
定义一个block,输入两个值,输出两个值的和。
给上面定义的block取一个别名,则定义如下:
typedef int (^MyBlock)(int , int ); // block取别名是直接把整个block拿过来,然后把名字改成自定义的即可。然后调用方式如下:
MyBlock sumBlock = ^(int a,int b){
return a+b;
};
在Xcode中定义一个block以及使用方法:
1.首先定义一个block模型:
typedef void (^CJSettingItenOption)() ;
2.定义一个copy类型的变量
@property(nonatomic,copy) CJSettingItenOption option;
3.在程序中的调用方法
在需要检测的函数里面先写好block实现方法,例如:
update.option = ^{
NSLog(@"检查更新");
UIAlertView *allert = [[UIAlertView alloc] initWithTitle:@"检查新版本" message:@"是否需要检查新版本?" delegate:self cancelButtonTitle:@"检查更新" otherButtonTitles:@"取消", nil];
[allert show];
};
4.在检测函数里面进行判断是否有满足条件的block,有则直接执行:
if (item.option) {
item.option();
}
2015年07月14日
9、tableView 取消选中的那一行
[tableView deselectRowAtIndexPath:indexPath animated:YES]; // 先取消选中(简介去掉选中的颜色)
10、自定义NSLog
一,固定写法:
#define MYLog(...) NSLog(__VA_ARGS__)
二,注意:
1,MYLog括号中的...是固定写法,表示可以接受任意多个参数.
2,NSLog括号中的__VA_ARGS__ 也是固定写法,前后用了两个下划线
三,使用方式:
项目中Supporting files文件夹下有个 "工程名-Prefix.pch"文件,你可以在该文件下声明
#define MYLog(...) NSLog(__VA_ARGS__)
这样之后工程中的任何一个文件中都可以使用改自定的打印函数(也就是说可以在该.pch中放一些全局的东西)
四,好处:
这样使用的好处就是,项目调试期间,我们可能会用到好多MYLog()函数打印.
如果不需要时,只需将.pch中该宏修改为:(这样就相当于MYLog()代表的是注释了)
#define MYLog(...) //NSLog(__VA_ARGS__)
五,修改:(这样做还不够智能,每次调试的时候需要用到打印,发布的时候不需要打印还要手动修改一下)
其实系统提供了一个宏 DEBUG 表示在调试状态下
因为上述代码可以优化为: (下述代码是公司常用代码)
#ifdef DEBUG //调试阶段 #define MYLog(...) NSLog(__VA_ARGS__) #else //发布阶段 #define MYLog(...) #endif
11、设置圆角的图标
方法一.使用Quartz2D 产生一张新的图片
方法二.使用图层
self.iconView.layer.cornerRadius = 8; // 圆角的半径
self.iconView.clipsToBounds = YES; // 确认切割
12、NSArray 数组,是有序的
NSSet 跟数组差不多, 里面的数据是无序的
13、触摸事件 touch
取得当前点的坐标:
CGPoint current = [touch locationInView:self];
取得上一次触摸点的坐标
CGPoint previous = [touch previousLocationInView:self];
14、
// 在这里重新定义一个新的view,就会把控制器的view变成新的view - (void)loadView { self.view = [[UIWebView alloc] init]; } // 在这里添加的view只是在原来view的基础上覆盖一个新的view而已,此时有两个view存在 - (void)viewDidLoad { [super viewDidLoad]; // self.view = [[UIWebView alloc] init]; }
15、任务栏的简单处理
/** * 控制状态栏的状态 * * @return 返回白色 */ - (UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
6、简单动画的实现
[UIView animateWithDuration:1.0 animations:^{ }];
17、简单数据存储
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:self.switchView.isOn forKey:self.item.title];
[defaults synchronize];
NSKeyedArchiver
18、block 内存泄漏问题
block对于其变量都会形成strong reference,对于self也会形成strong reference ,而如果self本身对block也是 strong reference 的话,就会形成 strong reference 循环,造成内存泄露,为了防止这种情况发生,在block外部应该创建一个week(__block) reference。
所以在block内如果有self的话,一般都会在block外面加一句__weak typeof(self)bself = self;
__weak typeof(self) bself = self;
[self methodThatTakesABlock:^ {
[bself doSomething];
}