博文

目前显示的是 2015的博文

CAGradientLayer的使用方法

需要说明几点, 1、frame的零点的计算方式是绝对frame不是相对frame。 2、frame的位置要放倒index:0。 3、frame的color数组的颜色是平均分布的。 CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = CGRectMake(.....); gradient.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0].CGColor,(id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0.2].CGColor, (id)[UIColor colorWithRed:0 green:0 blue:0 alpha:0.5].CGColor, nil]; [_imgview.layer insertSublayer:gradient atIndex:0];

Storyboard的segue的登录跳转逻辑处理

图片
在纯代码中进行页面切换大部分情况下只需要 push modal 这种切换方式即可完成需求。 但是在Storyboard中,切换页面变成了segue,如果单纯的从按钮按住control然后连线到别的ViewController中,会导致按钮点下去就会跳转页面,无法处理登陆逻辑。 解决方法: 从源ViewController中,选择上面的这个,按住control,拖动连线到新的ViewController中,即可建立ViewController之间的segue跳转。然后设置这个segue的segue Identifier, 然后在需要跳转的按钮事件中,加入:[self performSegueWithIdentifier:@"segueXXX" sender:self]; 即可。

Storyboard把鼠标箭头放到圆点上不显示对应控件的解决方法

其实我也不知道具体是怎么解决的。。用CleanMyMac把XCode重置一下就好了。。缺点是账号啥的都要重新登录。。

隐藏NavigationBar下面的线(也许是阴影?)

首先 我们定义个属性 @property (nonatomic, strong)UIImageView *contentLineImageView; 然后写一个方法: - (UIImageView *)findHairlineImageViewUnder:(UIView *)view { if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) { return (UIImageView *)view; } for (UIView *subview in view.subviews) { UIImageView *imageView = [self findHairlineImageViewUnder:subview]; if (imageView) { return imageView; } } return nil; } //然后在viewdidload中调用这个方法 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. _contentLineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar]; self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:37/255.0 green:195/255.0 blue:149/255.0alpha:1.0f]; //这句话 要写上。 默认是YES可能你得到的颜色与实际的不匹配。 默认为YES 说明是有透明度的。 self.navigationController.navigationBar.translucent = NO; } //我们还需要在viewwillappear 和view...

有关layer的CATransform3DMakeScale与frame的关系

如果先设置了父view的frame,又设置了Scale,再想用autolayout来通过frame.height约束view,需要做的是offset = frame.height/scale 这个转换,否则和预想的会出现差异(scale在捣鬼)

成员变量和属性的差别(转)

本质上来讲,属性也会帮你定义一个成员变量,并根据属性的声明自动生成getter/setter 方法,其中setter 方法根据属性(property)的属性(attribute)来提供不同的内存管理策略。 简单翻译一个SO的答案: Why would you use an ivar? ,展开说一下成员变量的好处。 封装 如果成员变量是private,程序中的其它对象很难直接访问该成员变量。如果是属性,相对更容易用父类方法读写属性。 性能 成员变量地址可以根据实例的内存地址偏移寻址。而属性的读写都需要函数调用,相对更慢。 非基础类型 对于复杂的C++类型,往往设为成员变量更合适,也许这种类型不支持copy,或者完全复制很麻烦。 多线程 多线程环境下,为保证数据一致性,在需要同步执行的代码段更应该使用成员变量。如果对需要同步更新的数据用getter/setter 方法,数据更新效率低,会带来更多的获取锁请求失败。 程序正确性 成员变量可以做直观的内存管理。属性可以一层层继承,还可以复写。容易出错。 二进制文件的体积 默认用属性,会生成不必要的getter/setter 方法,程序体积会变大。

在某ViewController强制转屏或者禁止转屏或者强制屏幕旋转方向。

这些方法都不能在subViewController中执行。 禁止/允许转屏: - (BOOL)shouldAutorotate { return YES; } 屏幕旋转方向: - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskAll); }

UIPageViewController的翻页手势冲突问题。

如果用了自定义转场 或者其他的手势,并且还想用到PageViewController的手势翻页特效的话,那么手势冲突就不可避免了,目前用到的具体处理方法是重写UIPageViewController的手势接收方法。 首先,定义UIPageViewController为UIGestureRecognizerDelegate。 然后,在UIPageViewController中的ViewDidLoad里面遍历它的所有gestureRecgnizer: for (UIGestureRecognizer *gesture in self.view.gestureRecognizers) { gesture.delegate = self; } 最后,重写手势判断方法: 由于这里面有两个手势判断器,所以可以根据需要来做判断 即:  if ([gestureRecognizer isKindOfClass:[UIGestureRecognizer class]]) { 不过一般来讲,不用判断的话: -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { CGPoint touchPoint = [touch locationInView:self.view]; if (touchPoint.x < self.view.frame.size.width * 0.75 && touchPoint.x > self.view.frame.size.width * 0.25 && touchPoint.y > self.view.frame.size.height * 0.2) { return NO; } else { return YES; } 这样做就够了。

dispatch_group_enter和dispatch_group_leave的使用

dispatch_group_enter和dispatch_group_leave的使用,这两个方法用于把一个异步任务加入group里。 首先,这两个一定要成对使用,不然会crash。 一般我们要把一个任务加入一个group里是这样: dispatch_group_async(group, queue, ^{ block(); }); 这个写法等价于 dispatch_async(queue, ^{ dispatch_group_enter(group); block() dispatch_group_leave(group); }); 如果要把一个异步任务加入group,这样就行不通了: dispatch_group_async(group, queue, ^{ [self performBlock:^(){ block(); }]; //未执行到block() group任务就已经完成了 }); 这时需要这样写: dispatch_group_enter(group); [self performBlock:^(){ block(); dispatch_group_leave(group); }]; 异步任务回调后才算这个group任务完成。 其实这跟retain/release差不多,都是计数,dispatch_group_enter时任务数+1,dispatch_group_leave时任务数-1,任务数为0时执行dispatch_group_notify的内容。

TableView实现Switch的方法

直接修改accessoryView即可。 CellForRow方法里写: cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; UISwitch *switch=[[UISwitch alloc]init];  [switch addTarget:self action:@selector(switchValueChange:) forControlEvents:UIControlEventValueChanged];  cell.accessoryView=switch;

TableView横用导致的屏幕旋转的页码错乱问题。

今天偶然遇到了这个问题,因为这个tableview是横用作Scrollview的图片轮播器使用的,但是当屏幕旋转的时候会出现显示错乱问题(就是说旋转屏幕后会出现显示出别的cell)。 期初是想在屏幕旋转后,根据currentOffset计算以后的offset,但是可能是由于有navigation bar的问题,所以导致计算出问题,用windows的frame来计算也会出现错误,故抛弃。 经过研究后发现了暂时的解决方案: 先定义一个IndexPath*类型的全局变量然后先把当前的IndexPath存起来,在cellForRow里面对这个IndexPath进行赋值(因为一屏幕只显示一个cell,所以IndexPath一定是当前屏幕的IndexPath)。然后在屏幕开始旋转前,禁止对IndexPath赋值,然后旋转后,将IndexPath取出,然后用 [_tableview scrollToRowAtIndexPath:_index atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; 然后 在开始旋转的时候把tableview的alpha=0;旋转后再=1就可以啦~

忘记设置userInteractionEnabled导致的各种弱智问题。

比如 什么 UIButton 里加了view 忘了设置为NO 比如 什么。。。各种下层需要触摸时间然后被上层view截获了的问题。。 一定要想着关掉 = =b

偶尔写写

其实也没啥好些的,意思意思吧。。 嗯,就是这个意思。

UICollectionView的重用问题

1、在Cell类型不同的时候,需要事先注册不同的identifier才能在 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 中使用。 2、Cell类型相同的时候,在Cell里一定要调用 prepareForReuse方法来保持重用的cell的清洁。 具体方法就是把需要赋值的对象=nil即可。但是注意在方法内调用[super prepareForReuse]; 还有一点。很急,很关键。 偶然发现了prepareForReuse方法只要cell滑出Collection的显示范围就会执行这个方法,那就为了解决重用问题,可以小小的trick一下。 在注册cell类的时候, for (int i = 0; i<_dataArray.count; i++) { [_mainCollectionView registerClass:[MainViewCollectionViewCell class]forCellWithReuseIdentifier:[NSString stringWithFormat:@"main%d",i]]; } 在给cell赋值的方法中,使用: NSString *identifier = [NSString stringWithFormat:[NSString stringWithFormat:@"main%d",indexPath.row]]; MainViewCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; 轻松&愉快的完成了“准”重用过程~

UIScrollView在pagingEnabled=YES,然后旋转屏幕后的错误显示问题

屏幕旋转后会停在页面中间的位置。 今天偶然遇到了这个问题, 首先用了之前解决自定义Transition的屏幕旋转bounds的设置问题的解决方法,开线程! 等待系统屏幕旋转后再进行bounds的设置,旋转前设置相当于没设置,所以开一个零点几秒的延迟来做这个。 在以下这两个方法中开线程: 1:ViewController的方法: -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 2:监视系统通知: [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; - (void)orientationChanged:(NSNotification *)notification; 方法中添加的线程代码: dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{    UIWindow *window = [UIApplication sharedApplication].keyWindow; CGFloat x = _pageControl.current...

在UICollectionViewCell中使用UIImageView遇到的一个坑

在imageview中 最好要用Auto Layout,千万不要根据Cell的frame来计算大小!会引起意想不到的bug

iOS性能优化(集合&转载)

图片
http://www.jianshu.com/p/9e1f0b44935c http://blog.cocoabit.com/2014-02-09-uitableview-gun-dong-liu-cheng-xing-you-hua/ http://tutuge.me/2015/02/19/提升UITableView性能-复杂页面的优化/ http://blog.jobbole.com/37984/ http://longxdragon.github.io/2015/05/26/UITableView优化技巧/ /*********以下是上面的页面内容********/ iOS性能优化 字数3576   阅读9220   评论14   喜欢130 最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧.小结如下. Instruments使用技巧 关于Instruments官方有一个很有用的 用户使用Guide ,当然如果不习惯官方英文可以在 这里 找到中文本翻译版本PDF参阅.Instruments 确实是一个很强大的工具,用它来收集关于一个或多个系统进程的性能和行为的数据极为方便,并能及时跟踪随着时间产生的数据.还可以广泛收集不同类型的数据.关于Instrument工具基本使用不在赘述.如下重点说明一些使用技巧. 1.概览 工具通过Xcode工具栏中Product->Profile可以启动,启动后界面如下: Instrument概览[via by chenkai] 当点击Time Profiler应用程序开始运行后.就能获取到整个应用程序运行消耗时间分布和百分比.为了保证数据分析在统一使用场景真实行有如下点需要注意: 在开始进行应用程序性能分析的时候,一定要使用真机,模拟器运行在Mac上,然而Mac上的CPU往往比iOS设备要快。相反,Mac上的GPU和iOS设备的完全不一样,模拟器不得已要在软件层面(CPU)模拟设备的GPU,这意味着GPU相关的操作在模拟器上运行的更慢,尤其是使用CAEAGLLayer来写一些OpenGL的代码时候. 这就导致模拟器性能数据和用户真机使用性能数据相去甚运....