学习过程笔记 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];  
}

时间: 2025-01-31 14:48:11

学习过程笔记 7月上的相关文章

学习笔记 8月上

1.核心动画保留执行动画之后的效果 // 让图层保持动画执行完毕之后的状态 anim.removedOnCompletion = NO; anim.fillMode = kCAFillModeForwards; 2.核心动画的缺点:所看到的都是假象,实际的本质是没变的 在动画执行的过程中,图层的position等任何属性一直都是没变的. 所以开发中,图层用的比较多的动画是转场动画 3.UI动画的实现和监听 [UIView beginAnimations:nil context:nil]; sel

学习笔记:Caffe上LeNet模型理解

学习笔记:Caffe上LeNet模型理解 Caffe中用的模型结构是著名的手写体识别模型LeNet-5(http://yann.lecun.com/exdb/lenet/a35.html).当年美国大多数银行就是用它来识别支票上面的手写数字的.能够达到这种商用的地步,它的准确性可想而知,唯一的区别是把其中的sigmoid激活函数换成了ReLU. 为什么换成ReLU,上一篇blog中找到了一些相关讨论,可以参考. CNN的发展,关键就在于,通过卷积(convolution http://deepl

《百科知识》2017年8月上-PDF

下载链接: 百科知识+2017年8月上.pdf

关于做好成都2014年12月上全国专业技术人员计算机应用能力考试的安排

关于做好2014年12月上全国专业技术人员计算机应用能力 考试考务工作有关问题的通知 各区(市)县人力资源与社会保障局.市级各部门,中央驻蓉单位.各大院(校)人事处(科): 现将成都市2014年12月(上)专业技术人员计算机应用能力考试考务工作有关事项通知如下: 一.报名日期 报名日期:2014年11月15日至2014年12月5日. 缴费截止日期:2014年12月5日. 网上准考证打印日期:2014年12月10日至12月12日(逾期未打印者,视为自动放弃). 考试开始日期:2014年12月13日

[Nginx笔记]关于线上环境CLOSE_WAIT和TIME_WAIT过高

运维的同学和Team里面的一个同学分别遇到过Nginx在线上环境使用中会遇到TIME_WAIT过高或者CLOSE_WAIT过高的状态 先从原因分析一下为什么,问题就迎刃而解了. 首先是TIME_WAIT: 理解一下TIME_WAIT状态产生的原因,这个问题已经被很多很多的书说烂了,但是为什么很多人还是不能解决,究其原因还是因为 大多数都是学术派,并没有真正的遇到过这样的问题,因为TIME_WAIT大量产生很多都发生在实际应用环境中. TIME_WAIT产生的原因还是因为在通讯过程中服务端主动关闭

学习笔记_springmvc文件上传和拦截器

文件上传 用到这两个包 配置视图解析器:springmvc配置文件配置 <!-- id必须要是"multipartResolver" --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- maxUploadSize文件上传的最大值,单位是byte

老男孩视频第一部前面的部分学习笔记(在51cto上听的)

如何才能学好Linux运维 学习运维需要计算机基础,版本的选择我选择:centos 学习Linux运维四项基本原则 需要刻苦勤奋,持之以恒  入门比较难 Linux运维需要很多的知识,不但学习Linux操作本身还得学好周边的知识. 学好Linux运维四要素: 1.设定目标,是学好Linux运维的关键所在 2.寻找方法 通过书藉学习--阅读,实践,总结,和网友讨论:然后再阅读,再实践,再总结                 如何请教别人帮助自己--寻找帮忙                 3.勤奋

学习笔记:Caffe上配置和运行MNIST

学习笔记:Caffe上配置和运行MNIST MNIST,一个经典的手写数字库,包含60000个训练样本和10000个测试样本,图片大小28*28,在Caffe上配置的第一个案例 1首先,获取minist的数据包. 这个版本是四个数据包cd $CAFFE_ROOT./data/mnist/get_mnist.sh [html] view plaincopy #!/usr/bin/env sh # This scripts downloads the mnist data and unzips it

NHibernate学习过程笔记

NHbernate自动生成数据库的方法: using NHibernate; using NHibernate.Tool.hbm2ddl; namespace Test { public class NHDataProvier { private readonly ISessionFactory _sessionFactory; public NHDataProvier() { var configuration = new NHibernate.Cfg.Configuration(); con