博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习过程笔记 7月上
阅读量:4604 次
发布时间:2019-06-09

本文共 4483 字,大约阅读时间需要 14 分钟。

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

转载于:https://www.cnblogs.com/cjt5132/p/4625746.html

你可能感兴趣的文章
linux的kernel是怎样工作的(TI_DM36X_ARM系统)(1)
查看>>
[luogu4310] 绝世好题 (递推)
查看>>
[luogu3203 HNOI2010] 弹飞绵羊 (分块)
查看>>
-Dmaven.multiModuleProjectDirectory system propery is not set.
查看>>
Python2 unichr() 函数
查看>>
Python 字典 copy()方法
查看>>
Minimum Path Sum
查看>>
Remove Duplicates from Sorted Array II
查看>>
常量指针和指针常量巧妙记忆方法[转]
查看>>
python-haproxy作业讲解视频总结
查看>>
mui搜索框 搜索点击事件
查看>>
select2 下拉搜索控件
查看>>
WebAPI常见的鉴权方法,及其适用范围
查看>>
08. 删除重复&海量数据
查看>>
重新想象 Windows 8 Store Apps (71) - 其它: C# 调用 C++
查看>>
发布mvc遇到的HTTP错误 403.14-Forbidden解决办法
查看>>
记录一些好用的工具
查看>>
超链接样式设置(去下划线)(转)
查看>>
2016012003+陈琦+散列函数的应用及其安全性
查看>>
Android 状态栏通知Notification、NotificationManager详解
查看>>