1.

UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"MainTitle"]]; //initWithImage方法的好处是创建的imageView和图片的尺寸一样

2.

//看UI层级,tabBar上的按钮的确是UITabBarButton类型,但是这个类是私有的不让用,故不能调[view isKindOfClass:[UITabBarButton class]

if (![view isKindOfClass:NSClassFromString(@"UITabBarButton")]) {

continue;//如果不是这个类,直接跳过后面的代码,继续判断下一个

}

3.

实例方法: [obj class]          类方法: [Class class];

WZLog(@"实例方法:%@,类方法:%@",[self class],[UITabBarItem class]);

4.

//使用代码设置图片的渲染模式

UIImage *image = [UIImage imageNamed:@"tabBar_essence_click_icon"];

UIImage *renderImage = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];//原始照片不渲染

vc01.tabBarItem.selectedImage = renderImage;

  //[UIImage imageNamed:name]; 参数name不能为nil

self.imageView.image = [UIImage imageNamed:name]; //如果name为空nil,会报错CUICatalog:Invalid asset name supplied:(null)

5.

//更换TabBar底部条 @property(nonatomic,readonly) UITabBar *tabBar

WZTabBar *tabBar = [[WZTabBar alloc]init];

//self.tabBar = tabBar; 报错,readonly不能赋值,采用KVC赋值

[self setValue:tabBar forKey:@"tabBar"];

6.

+ (void)initialize { //涉及appearance的设置要写在initialize中,此方法只在该类第一次被使用时才调用。

  UITabBarItem *item = [UITabBarItem appearance];

[item setTitleTextAttributes:attr forState:UIControlStateNormal];

[item setTitleTextAttributes:selectAttr forState:UIControlStateSelected];//注意此处为UIControlStateSelected,不能写成Highlighted了

}

//原理是:setTitleTextAttributes:forState: 函数后面有备注UI_APPEARANCE_SELECTOR,可以通过 [Class appearance] setTitleTextAttributes: forState: ]; 来同一设置字体颜色。

7.

UIButton *btnLeft = [UIButton buttonWithType:UIButtonTypeCustom];

[btnLeft setBackgroundImage:[UIImage imageNamed:@"MainTagSubIcon"] forState:UIControlStateNormal];

[btnLeft setBackgroundImage:[UIImage imageNamed:@"MainTagSubIconClick"] forState:UIControlStateHighlighted];

//注意必须设置btnLeft的frame或者size

btnLeft.size = btnLeft.currentBackgroundImage.size;

//自定义导航按钮时,事件应传给btnLeft;如果使用initWithTitle:target:action:方法初始化,可以把事件传给BarButtonItem

[btnLeft addTarget:self action:@selector(tagSubClick) forControlEvents:UIControlEventTouchUpInside];

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:btnLeft];

8.

//设置发布按钮的frame

CGFloat btnW = btnPublish.currentBackgroundImage.size.width;

CGFloat btnH = btnPublish.currentBackgroundImage.size.height; //currentBackgroundImage属于UIImage:NSObject,不属于UIView,重写UIView(Frame)对UIImage不管用,UIImage自己就有.size属性。不能换成btnPublish.currentBackgroundImage.height;

9.

//从xib或sb加载的控件时,会调用此方法,纯代码定义继承UIView类初始化时不会调

- (instancetype)initWithCoder:(NSCoder *)aDecoder{

NSLog(@"%s",__FUNCTION__);

if (self = [super initWithCoder:aDecoder]) {

}

return self;

}

//纯代码定义UI控件类的实际初始化方法

- (instancetype)initWithFrame:(CGRect)frame{

if (self = [super initWithFrame:frame]) {

}

return self;

}

10.

//initWithFrame中设定frame,会被如下方法重新布局

- (void)layoutSubviews{

[super layoutSubviews];

}

//viewDidLoad完了调viewWillAppear,然后在viewDidLayout,最后viewDidAppear

- (void)viewDidLayoutSubviews{

[super viewDidLayoutSubviews];

}

11.

(1. UIView(所有控件均继承它)有个contentMood属性,用来设置控件里面填充的文字/图片等的对齐方式(如:

默认UIViewContentModeScaleToFill,UIViewContentModeTop/Left/Right/TopLeft等),但一般只对UIImageView图片框有效,对Button等基本无效。

(2. 但是所有继承自UIControl的控件都有contentHorizontalAlignment和contentVerticalAlignment这2个属性,可以通过如下代码设置UIControl对象内容的水平和垂直对齐方式:

  btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;//默认center

btn.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;//默认center

12.

在Storyboard或XIB中设置UILabel,UITextField,UITextView等文字时,如果想换行,按Opt +Enter或者Ctrl+Enter都可以。如果是在代码中设置的话,在需要换行的位置加入\n即可。如:@“adjh\n55655”

13.

+ (UIColor *)blackColor;      // RGB:均为0.0,alpha=1.0;

+ (UIColor *)clearColor;      // RGB:均为0.0,alpha=0.0;

14.

发送网络请求GET:  parameters:  progress:  success:  failure: 在获取网络数据,解析成模型后,需要再次刷新表格数据,表格方能正常显示。

//该block是异步执行的,大约1-2s后才返回这些数据,在这段时间内程序已经给cell进行了赋值,但此时模型数组中什么数据都没有,所以在数据回来后,重新刷新表格

[self.tableView reloadData];

15.

用Xib自定义cell类时,可以在Xib的同名cell类.h文件中封装创建cell的初始化方法,通过【[NSBundle mainBundle]loadNib】方法加载Xib。

也可以直接在TableViewController中给self.tableView注册一个Nib,具体做法

[self.tableView  registerNib:[UINib nibWithNibName:@"WZRecommendCell" bundle:nil] forCellReuseIdentifier:@"MyCell"];

16.

//nib第一次被加载时(loadNib等)就会调用

- (void)awakeFromNib { //适合写一些颜色变化等,不能写尺寸变化的代码,尺寸会在layout中继续调整。}

//在viewWillAppear和viewDidAppear二者之间调用

- (void)layoutSubviews { //适合写一些调整子控件frame的代码。}

17.

//如果将xib中cell的selection选成none,用户选中cell时不会变颜色(即高亮状态),即cell.selection为none,cell是可以被选中,但是不能进入高亮状态,所有在高亮状态下做的设置无效。(如果将tableView的selection设为no selection,那么所有的cell将不能被选中)

//self.textLabel.highlightedTextColor = ColorWithRGB(220, 20, 25);

18.

自定义cell的如下方法,在新建继承自UITableViewCell的类时,苹果Xcode会默认自动帮我们生成(说明很常用)

//cell选中,selected=1; 取消选中,selected=0;

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

//可以在这里做一些cell被选中和取消选中,其内容变换的设置

}

19. 格式化字符

%f       float/double
 %lld     long long
 %zd     NSInterger/NSUInterger

20.

//UIViewController有个automaticallyAdjustsScrollViewInsetss属性,默认是YES,会自动设置ScrollViewInsets。如在同一个VC里面放了多个tableView,通常我们会关闭它,采用手动设置tableView的向下偏移量。

self.automaticallyAdjustsScrollViewInsets = NO;  (这里的self是UIViewController)

self.tableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);

21.

  可以创建一个UIWindow控件设置hidden=NO来显示在屏幕上,不论在didFinishLaunchingWithOptions还是在applicationDidBecomeActive都可以,但是必须给该window设置根视图控制器,否则程序一启动就crash掉。

  window_.rootViewController = [[UIViewController alloc]init]; //设置空的rootVC,否则程序一启动就crash

[WZStatusBarWindow show]; //点击状态栏,让当前页面scrollView滚动到最顶部。这种状态下,必须在info.plist中增加View controller-based status bar appearance = NO;这个键,将状态栏交给application管理,否则状态栏将会被新加的window覆盖掉。

22. 通过UIApplication控制statusBar状态

23. 使用Xib存在很多坑:

通过Xib自定义的UIView在屏幕旋转时,并不会自动调整其frame。但是xib加载起来的viewController是可以自行调整的。

通过Xib自定义的UIViewController在刚显示屏幕时,虽然self.view显示的和屏幕大小一样,但是打印self.view的frame和bounds,其宽高均为(600,600),针对此问题,目前尚未找到有效解决办法。从XIB加载的vc,直接使用[UIScreen mainScreen];

24.

调用loadNib或者Nib方法加载Xib, 过程中先依次调用Xib中每个控件的[[UI控件类 alloc] initWithCoder:coder];(storyboard也是调用该方法创建控件的) coder是由xib图形转化来的代码,然后等Xib中所有控件都加载完毕了,就会立刻调用-(void)awakeFromNib方法(storyboard创建完毕也会调用),在这里进行初始化操作最合适。如果在initWithCoder中,有些控件frame可能还没确定,别的控件无法参考它的frame进行设置。 如果纯代码自定义UIView,在initWithFrame方法中进行初始化最合适。注意不是init中哦!

25.

在代码或者Xib自定义UIView控件时,在该类外面的其他地方修改该view的frame,等本次runloop消息循环一结束,系统会立即让该view调用它的layoutSubviews方法调整其内部子控件的frame和size(因为子控件的frame和size均依赖于父控件的宽和高,设置父控件的frame,可能会改变宽高,所以必须先将内部子控件重新布局)。

补充:消息循环就像一支巡逻队,每隔xx秒就巡逻一次,在巡逻结束时将本次巡逻过程中收集到的关于UI界面的改变,一次性渲染出来(此时就需要调用各父控件的layoutSubviews方法)。在同一个方法中重复设置某控件frame 100次,在runloop结束后只会调一次layoutSubviews(参考最后一次设置的frame)。

消息循环结束的时机:1. 同一个方法中的代码肯定会在同一个消息循环中,不会分开在多个runloop中。 2.用户的一次触摸事件开始时会创建一个消息循环,触摸事件结束,该消息循环会立即结束,然后刷新UI界面。(如在touchBegin方法中设置控件的frame, 每当用户手指离开控制器view,就会立即调用一次该控件的layoutSubviews方法)。

26.

(1)控制器的view采用懒加载(创建控制器时view并没有创建,第一次使用时)调用loadView方法创建,view每次需要显示时都会添加到父视图, 每次不显示时,就会removeFromSuperview。

(2)控制器默认的view.backgroundColor默认是clearColor。clearColor是RGB都为0,opacity为0,view.alpha = 1;不可以透过clearColor的view去触摸后面的控件。 但是一个view无论RGBA是多少,只要设置alpha=0;就看不到该view,并且能够被穿透。

(3)在viewDidLoad中打印控制器view的frame是不准确的,在viewDidAppear中打印才是准确的。

(4)第一次调用控制器的view会懒加载,具体view的get方法代码如下:

- (UIView *)view {

if (_view == nil) {

     [self loadView]; }

}

(5)窗口的根控制器的view,系统会自动给view设置frame和屏幕window一样大。

27.

(1)IOS7以后,导航栏,tabBar, toolBar上面的按钮的背景图片,系统会默认将它渲染成蓝色。如果想取消的话,需使用代码设置图片的渲染模式。

[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];

(2)另外,注意navigationBar,tabBar, toolBar上面的按钮的按钮的frame中的x,y不允许开发者修改,只允许修改宽高size。 此时如果使用initWithCustomView:方法自定义BarButtonItem,传入的UIButton,如果设置了图片setImage,可以直接调用 【button sizeToFit】;方法让按钮的尺寸等于传入的图片的大小。

28.

viewController.view的生命周期方法都是以-()view开头,而且viewWillxxx和viewDidxxx方法一一对应。

29.

系统自带的system类型的UIButton,在使用代码给它设置图片(setImage:) 是不会显示的,系统自带的按钮只能设置背景图片(setBackgroundImage:)。

如果想要给按钮设置图片,请首先把它的类型改为Custom。

30.

ios属性名不能和系统关键字冲突,如@property(nonatomic,copy) NSString *newName; 会报错(提示应返回一个新对象),与[NSObject new]冲突

只有在init开头的构造方法中,才允许给self赋值。initWithFrame:合法,后面这些写法是错的,不会被当做是初始化方法:initwithColor:  initsWithName:等

[BS] 小知识点总结-01的更多相关文章

  1. [BS] 小知识点总结-05

    [BS] 小知识点总结-05 1. 不论UIWindow的rootViewController是navC.tabBarC还是VC,也不管modalVC和rootVC中间隔着多少个VC,但是modal出 ...

  2. [BS] 小知识点总结-04

    1. ios新知识学习思路: 在开发过程中如果遇到某种新需求以前从未做过,例如改变textField的Placeholder颜色,有如下思路和途径: 1.1 在Storyboard/Xib辅助编辑器A ...

  3. [BS] 小知识点总结-03

    1.Autolayout中“constrain to margins” Autolayout中的页面边距的问题ios8以后的UIView增加了layoutMargins属性,在Storyboard/I ...

  4. [BS] 小知识点总结-02

    1.  dispatch_GCD 可让某操作延迟x秒执行 //模拟网速慢,延迟3s返回数据(就会导致右侧数据和左侧标签不对应) dispatch_after(dispatch_time(DISPATC ...

  5. Java小知识点总结01

    1. 整数相乘或者相加,如果超过最大整数值,会变成负数 2. 字符串比较可以使用:s1.compareTo(s2) ,如果s1大于s2返回值大于1,等于返回值等于0,小于返回值小于1 3. char值 ...

  6. 【转】HTML5的小知识点小集合

    html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...

  7. html5的小知识点小集合

      html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...

  8. android 小知识点

    小知识点总结 1. android中MotionEvent.ACTION_CANCEL事件如何被触发? 对于这个问题,android文档的说明很简短,想看明白很难.国外一网页说的还比较详细,写在这里分 ...

  9. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

随机推荐

  1. 获取某个Group中所有对象的DisplayName

    $SANs = Get-ADGroupMember -Identity "CN=gAPCHN-HGZ-IE10-Users,OU=Groups,OU=Hangzhou - China,OU= ...

  2. maven编译项目理解

    如何运行这个Web项目? 右键项目名称,在弹出的选项中选择 Run As => Maven install,然后 Eclise 会下载并安装相关依赖包.在等待一段时间后,构建成功的结果如下:

  3. 【FFXV】中物理模拟的结构以及游戏业界的乐趣

    11月2日是在日本兵库县神户会议中心召开的[SIGGRAPH ASIA 2015]的第一天,在游戏开发专门的研究会[R&D in the Video Game Industry]上,展开了[F ...

  4. Unity3D之游戏架构脚本该如何来写(转)

    这篇文章主要想大家说明一下我在Unity3D游戏开发中是如何写游戏脚本的,对于Unity3D这套游戏引擎来说入门极快,可是要想做好却非常的难.这篇文章的目的是让哪些已经上手Unity3D游戏引擎的朋友 ...

  5. 【IOS笔记】About Events in iOS

    About Events in iOS Users manipulate their iOS devices in a number of ways, such as touching the scr ...

  6. 怎么样打印加密PDF文件

    自然是解密后再打印.解密的方法,在linux下执行: pdf2ps xxx.pdf ps2pdf xxx.ps 参考资料 http://www.cyberciti.biz/faq/removing-p ...

  7. LR中Vugen的多进程与多线程(脚本命令行)

    Controller使用驱动程序(如mdrv.exe或r3vuser.exe)来运行Vuser.用户可以在Controller的run-time setting中选择Vuser的运行方式:多进程/多线 ...

  8. PHP实例练习--投票和租房子

    一,调查问卷 效果图:

  9. mysql 存储过程 php版本

    <?php /** * PHP操作Mysql存储过程示例 * * @author flyer0126 * @date 2011-12-23 * */ //配置数据库连接信息 $hostname ...

  10. 【转】unity地形插件T4M使用帮助

    unity的地形系统在手机游戏中因为效率问题基本无法使用,只能通过T4M这个地形插件来进行优化制作.下面大概讲解一下使用流程及方法. 先中U3D里面用自带的地形系统刷出想要的地形和贴图.贴图可以大概刷 ...