学习过程笔记 7月上

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];  
}

你可能感兴趣的:(学习过程笔记 7月上)