IOS工作笔记(七)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧!

1.在定义UITableViewCell时,组件可以直接加,也可以添加到contentView中

[self addSubViews:myBtn];
[self.contentView addSubViews:myBtn];

但最好添加在contentView中,因为contentView可以定义很多东西。

2.关于下拉刷新和上拉加载,可以用是第三方框架MJRefresh,地址在

https://github.com/CoderMJLee/MJRefresh

选取部分代码说明。

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     //上拉加载
 4     [self refreshBottomData];
 5 }
 6
 7 //下拉刷新
 8 -(void)refreshBottomData{
 9     [self.tableView addFooterWithTarget:self action:@selector(footerRereshing)];
10     self.tableView.footerPullToRefreshText = @"上拉加载";
11     self.tableView.footerReleaseToRefreshText = @"松开加载";
12     self.tableView.footerRefreshingText = @"加载中……";
13 }
14
15 -(void)footerRereshing{
16     //添加刷新时所增加的假数据
17     for (int i = 0; i<5; i++) {
18         [self.dataArray insertObject:self.insertDataArray[i] atIndex:0];
19     }
20
21     //1秒后刷新
22     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
23         // 刷新表格
24         [self.tableView reloadData];
25
26         // (最好在刷新表格后调用)调用endRefreshing可以结束刷新状态
27         [self.tableView headerEndRefreshing];
28      });
29 }

在实际开发中,刷新时添加数据时可以利用分页,在后台很好实现。然后根据pageNo来加载更多数据。

3.关于UIView的分层,如若想将组件A移至最顶层,有两种思路:①将A直接移至最顶层;②将其它组件移至底层。

如在一个UIView中,有3个组件,viewA,viewB,viewC。现在想把viewA移至最顶层。
对于①,可以用bringSubviewToFront,即是移至最顶层

[self bringSubviewToFront:viewA];

对于②,可以用sendSubviewToBack,即是移至对底层

[self sendSubviewToBack:viewB];
[self sendSubviewToBack:viewC];

但方法①和②有缺陷,当viewA、viewB、viewC由懒加载初始化而来,那么就会不显示视图。即viewA、viewB、viewC根本就不显示。

此时就需要用到

- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index;
//index越小表示视图越在下边。

所以就可以这样解决,在添加viewB和viewC时,

[self insertSubview:self.viewB atIndex:0];
[self insertSubview:self.viewC atIndex:0];

该方法根本无需管组件是否懒加载而来,效果同sendSubviewToBack是一样的。

4.一个很好用的调试技巧,平时的调试需要自己打断点,一步步走,看到哪儿会崩溃。下面的方法会直接跳到崩溃的那一行,很好用。

点击debug界面左下角的加号,——>Add Exception Breakpoint

效果如下:

即可。

5.UITabBarController和UINavigationController的区别

1 //设置子控制器
2 UIViewController *first = [[UIViewController alloc]init];
3 first.title = @"first";
4 UIViewController *second = [[UIViewController alloc]init];
5 second.title = @"second";
6 UIViewController *third = [[UIViewController alloc]init];
7 third.title = @"third";

然后在添加子控制器时可以看出区别

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:first];
[self addChildViewController:navController];

直接添加是这样

//麻烦点的方法
[self addChildViewController:first];
[self addChildViewController:second];
[self addChildViewController:third];
//或者可以用简单的方法
self.viewControllers = @[first,second,third];

若想使导航栏有左右的baritem,可以这样设置

1 UIBarButtonItem *leftBarItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:nil];
2 UIBarButtonItem *rightBarItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:nil];
3 first.navigationItem.leftBarButtonItem = leftBarItem;
4 first.navigationItem.rightBarButtonItem = rightBarItem;
5 UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:first];
6 [self addChildViewController:navController];

6.触摸事件,下面的是当触摸屏幕时触发事件。只要点击屏幕就会触发该事件。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    //要执行的方法
    [self toDrawSth];
}

7.valueForKeyPath可以求数组中的一些值,如

1 NSArray *testArray = [NSArray arrayWithObjects:@"2.0", @"2.3", @"3.0", @"4.0", nil];
2 //求数组的和
3 NSNumber *sum = [testArray valueForKeyPath:@"@sum.floatValue"];
4 //求数组中所有数据的平均值
5 NSNumber *avg = [testArray valueForKeyPath:@"@avg.floatValue"];
6 //求数组中的最大值
7 NSNumber *max = [testArray valueForKeyPath:@"@max.floatValue"];
8 //求数组中的最小值
9 NSNumber *min = [testArray valueForKeyPath:@"@min.floatValue"];

8.CADisplayLink可以周期性的调用它里面@selector的方法,如:

1 self.link = [CADisplayLink displayLinkWithTarget:self selector:@selector(toDoDrawLine)];
2 //frameInterval改变每秒运行帧数,等于2表示每隔一帧运行一次
3 self.link.frameInterval = 3;
4 [self.link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

然后不用时,需要销毁

[self.link invalidate];
self.link = nil;

当CADisplayLink对象add到runloop后,系统就会周期性的执行@select中的方法;执行invalidate操作后,CADisplayLink对象就会从rnuloop中删除,@selector的调用也会停止。

对于frameInterval
ios设备的默认刷新频率FPS是60Hz,因此CADisplayLink的@selector默认调用周期是每秒60次。这个周期可以用frameInterval设置,CADisplayLink的@selector每秒调用次数=60/frameInterval。比如当frameInterval设为2,每秒调用就变成30次。

9.如何提升app的流畅度?(这个转自叶孤城___)

可以用instrument找出所有不需要透明但是透明的view,layer等,弄成不透明的。

选中product——>Profile

选中Color Blended Layers,

以微博客户端为例,则会出现下面的情况

红色或者深红色的就是透明的层和view,这些就是拖慢app流畅度的原因,按情况修改。

时间: 2024-11-16 12:22:19

IOS工作笔记(七)的相关文章

iOS工作笔记之NSClassFromString

id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init]; 和 id myObj = [[MySpecialClass alloc] init]; 是一样的.但是,如果你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已. 因此,在某些情况下,可以使用NSClassFromString来进行你不确定的类的初始化. 比如在iPhone中,NSTask可能就会出现这种情

IOS工作笔记(二)

1.懒加载(即延迟加载)只有被调用时才初始化,防止资源浪费,需要重写对象 的get方法,且必须写成成员变量形式,如_imageData.可以这么写,如: 1 @property(nonatomic,strong) NSArray *imageData; 2 3 -(NSArray *)imageData{ //重写imageData的get方法 4 if(_imageData == nil){ 5 //初始化数据 6 NSMutableDictionary *image1 = [NSMutabl

IOS工作笔记(五)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.frame的打印,可以用 NSLog(@"%@",NSStringFromCGRect(self.view.frame)); 2.UIButton文字的对齐方式,以左对齐为例 myBtn.titleLabel.textAlignment = NSTextAlignmentLeft;//这种设置方式无效 myBtn.contentHorizontalAlignment = UIControlConte

IOS工作笔记(三)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.选定ipad支持的方向,如强制横屏等,需要在General——>Deployment Info ——>Device Orientation选择,含义如下: 所以要想强制横屏的话,可以点选 2.UIView中如何添加xib文件? 如新建一个UIView为DocDetailView,那么建的那个xib文件在custom class中class应写成跟UIView名字一样的,这里要写成DocDetailView,

IOS工作笔记(四)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.ios7中,对状态栏的调整是在控制器中进行的. 1 //设置状态栏为白色 2 -(UIStatusBarStyle)preferredStatusBarStyle{ 3 return UIStatusBarStyleLightContent; 4 } 5 //隐藏状态栏 6 -(BOOL)prefersStatusBarHidden{ 7 return YES; 8 } 2.给UIImageView或UILa

IOS工作笔记(九)

关于IOS与服务器交互json数据①从服务器接受json数据:这个可以用AFN,接受方式一般为get.如: 1 +(NSArray *)getContactsFromServer:(ZMMeetingAddViewController *)meetingAddController{ 2 NSMutableArray *contactsArr = [NSMutableArray array]; 3 4 NSString *urlGetContactsFromServer = [NSString s

IOS工作笔记(六)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当学习足迹吧! 1.NSArray中使用firstObject和lastObject的好处在于,当数组为空时,返回nil,而不会报错. 当数组为空,使用myArray[0]时,会报错. 2.UILabel和UIImageView都可以添加点击事件,以UIlabel为例. 1 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTa

IOS工作笔记(一)

说明:记录下学习IOS的一些琐碎,有些在现在看起来很简单幼稚,不过权当足迹吧! 1.xib开发ipad使用横屏,可以在xib的view设置orientation为landscape,portrait是竖屏. 2.在.m文件中声明UITextField后,若想获取.比如想获取pwd@property(nonatomic,weak) UITextField *pwd;那么可以用 self.pwd.text获取. _pwd.text;// 这也可以获取到. 因为self.view其实调用的是pwd的g

iOS工作笔记(十二)

1.从ControllerA跳往照相UIImagePickerController,只能用presentViewController形式,因为定义UIImagePickerController时, UIImagePickerController *pickerController = [[UIImagePickerController alloc]init]; pickerController.allowsEditing = NO; pickerController.delegate = sel