1.在自己定义的导航栏中或者设计稿中经常需要去除导航栏的1px横线,主要是颜色太不协调了![去除之前的图片]
要去除这1px的横线,首先应该知道它是什么,在Xcode的界面调试中可以看到,它其实是UIImageView来的其实这是navigationBar的shadowImage,所以只要设置它为空即可,但是设置它为空之前应该先设置它的背景也为空,全部代码如下:
[self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];[self.navigationController.navigationBar setShadowImage:[UIImage new]];
完成效果如下(是不是一干二净?):既然导航栏的那一横线能去除,那tabbar那一横线也是能去除的了(其实也是shadowImage来的)···方法一:自定义UITabBarController
方法二:
[self.tabBarController.tabBar setBackgroundImage:[UIImage new]];[self.tabBarController.tabBar setShadowImage:[UIImage new]];
反之,如果我们想自定义那一横线的颜色也是可以的,只要设置它的shadowImage即可。
2.以前的项目中,有隐藏导航栏的需求,然后问题来了!以后在push到其他的控制的时候,不管是什么视图会发现向下偏移64或者向上偏移64,当时瞬间懵逼了,我也尝试了各种方法解决,因为项目进度问题只是临死解决了,越往后面做这种情况越多,我就被这个问题整的崩溃了。后来我查阅了很多文档,我就意识到可能是导航栏的半透明效果导致的(我的视图控制器的上级控制器是盗号控制器),其实就是这个原因。最后我解决了,特此记录下来,废话不多说就几行代码拿到当前的导航栏把他的半透明属性关闭即可。
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automaticallyAdjustsScrollViewInsets = NO; } self.extendedLayoutIncludesOpaqueBars=YES;
//解决隐藏导航栏问题
但是是不是要每一个控制器都加上这段代码啊,我当时也是这么想过,这也太苦逼了,后来我想出来了两种解决方法:第一种:创建一个base控制器QPBaseViewController,然后在
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automaticallyAdjustsScrollViewInsets = NO; } self.extendedLayoutIncludesOpaqueBars=YES; //解决隐藏导航栏问题 }
然后每一个控制器都集成这个base控制器,然后在创建视图的时候,都要偏移64即可。但是如果你是旧项目,是不是感觉这样也是很苦逼啊?不要着急还有第二种方法:```
- (void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //获取这个类的viewDidLoad方法,它的类型是一个objc_method结构体的指针 Method viewDidLoad = class_getInstanceMethod(self, @selector(viewDidLoad)); Method viewDidLoaded = class_getInstanceMethod(self, @selector(viewDidLoaded)); method_exchangeImplementations(viewDidLoaded, viewDidLoad); });} - (void)viewDidLoaded{ //调用自己原有的方法 [self viewDidLoaded]; if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) { self.automaticallyAdjustsScrollViewInsets = NO; } self.extendedLayoutIncludesOpaqueBars=YES;
//解决隐藏导航栏问题 }
给UIViewController写一个category即可。
3.SDWebImage大家肯定都恨熟悉了,国内外太多的App使用其进行图片加载。
但是最近在使用过程中发现,我用SDWebImage加载多个图片,类似微博动态那种,在加载的过程中。我发现当图片分辨率比较大的时候(不是图片大),加载几张图片就崩溃了。后来发现这里
UIImage *image = [UIImage sd_imageWithData:data];
图片取出来的时候就已经巨大无比,占用了很大的内存,导致内存来不及释放就崩溃。抽丝剥茧我们进入,发现这里面对图片的处理是直接按照原大小进行的,如果几千是分辨率这里导致占用了大量内存。![图片描述](http://upload-images.jianshu.io/upload_images/2361189-d7b7838838995273.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)所以我们需要在这里对图片做一次等比的压缩。
我们在使用第一种方法
UIImage+Compression这个类里面添加如下压缩方法,
+(UIImage *)compressImageWith:(UIImage *)image { float imageWidth = image.size.width; float imageHeight = image.size.height; float width = 640; float height = image.size.height/(image.size.width/width); float widthScale = imageWidth /width; float heightScale = imageHeight /height; // 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContext(CGSizeMake(width, height)); if (widthScale > heightScale) { [image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)]; } else { [image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)]; } // 从当前context中创建一个改变大小后的图片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); return newImage; }
第二种方法:[http://p0.meituan.net/460.280/deal/__38049103__5184398.jpg@460w_280h_1e_1c](http://p0.meituan.net/460.280/deal/__38049103__5184398.jpg@460w_280h_1e_1c)可以用过设置请求的图片大小来解决
4.截屏某一个视图保存
UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.width, self.view.height), YES, 0); //设置截屏大小 [[self.view layer] renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGImageRef imageRef = viewImage.CGImage; CGRect rect = CGRectMake(AdaptationW(18), AdaptationH(18)+64, _BgImagView.width, _BgImagView.height);//这里可以设置想要截图的区域 CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect); UIImage *sendImage = [[UIImage alloc] initWithCGImage:imageRefRect]; return image;
这种截取出来的图片会有一写模糊,后来经过查阅资料发现了一下的另外一种方法:
// // 1. 开启图像上下文[必须先开开启上下文再执行第二步,顺序不可改变] // UIGraphicsBeginImageContextWithOptions(CGSizeMake(_BgImagView.width, _BgImagView.height), YES, 0); // // 2. 获取上下文 CGContextRef context = UIGraphicsGetCurrentContext(); // 3. 将当前视图图层渲染到当前上下文 [_BgImagView.layer renderInContext:context]; // 4. 从当前上下文获取图像 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // 5. 关闭图像上下文 UIGraphicsEndImageContext();
5.UITextField如何设置占位文字的颜色, 如果不先设置占位文字, 占位文字的颜色是不管用的:
//先设置占位文字textField.placeholder = @"设置了占位文字内容以后, 才能设置占位文字的颜色";//占位文字颜色[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];
6.UITextView添加占位文字的正确方法![图片描述](http://upload-images.jianshu.io/upload_images/2361189-a6741f25cfa8552e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
[封装的UITextView的地址](https://github.com/dongpeng66/DPTextView.git)
7.从TabBarController可以push到某个页面
UINavigationController *currentNavi = self.viewControllers[(int)self.selectedIndex];
UIViewController *currentViewController = currentNavi.viewControllers.lastObject;
QuestionAnswerViewController *qvc = [[QuestionAnswerViewController alloc] init];
[currentViewController.navigationController pushViewController:qvc animated:YES];