常用开发技巧系列(三)

热更新衍生出来的问题:

      前两天都在说iOS热更新的问题,结果今天就撞枪口上了,真的!审核被拒了,当然这并不是在我自己的项目使用了什么RN,或者JSPath等的问题,是个推!!在热更新出来的第一时间,高德就更新了自己的SDK,个推的今天才更新的,没错就是今天!下面是苹果审核被拒的一些内容,可以给个参考,只要是下面这类型的都是最新的热更新的问题。它所说的问题,因为项目是原生的能想到的只有第三方SDK会用,上网查了一下而又涉及到这个的SDK我自己用的也只有个推!

恩,你只能去更新个推的SDK,结果Cocopods就出现这个错误![!] Unable to satisfy the following requirements:

 

这个你在cd到项目文件,终端执行   pod update --verbose  就可以解决!(提示:这里时间会久一点,耐心等!)

警告继续

    在Xcode中,警告这个东西还是很烦人的!下面简单的说两个消除警告的技巧!

    第一:加入你使用SVN或者Git在管理代码,这当中你要是删除了一些你创建了又觉得没用的文件。就会有这样的一堆file missing警告!!!像下面这个同学的情况,要是你项目有一千多个警告,看着肯定觉得烦!

    升级xcode8后,提示一堆file missing警告

      

     其实,在这篇博客的最后面是有正解的:Xcode->Preferences->Source->Enable Source Control 勾勾去掉!

   解释一下这个Enable Source Control:启用/禁用XCode自带Source Control Manager(SCM)。

     第二种:这种警告就和SVN或者Git就没有什么关系了

   比如下面的注释时候的警告,反正我知道环信SDK的确是一堆中文注释完了之后再加一堆的英文注释,这个到可以理解,毕竟是要走向世界的!好了,消除警告先。

      

      这样操作:

     

     点击我们选中的 Reveal in Log ,你就会看到下面这样的文字:

      

      大家看到红线下面上面的 [-Wdeprecated-declrations],方法就在这里,你把-W换成 -Wno- 再去掉方括号,剩下的就是我们要用的,比如这里的就是: -Wno-deprecated-declrations

    然后在我们项目的Build Settings 中查找 Other Waring Flags,添加 -Wno-deprecated-declrations,这 deprecated-declrations类型的警告就不再会出现。

   (说明:上面的-Wno-deprecated-declrations并不是消除环信SDK警告要输入的,只是给大家说一下整个的操作步骤!)

图片的拉伸处理

    先说一个最常见的我们经常会见到的聊天的时候消息显示框:

    在我们经常用到拉伸中,你经常看到的imageView.image属性,这里面的image是根据imageView的大小拉伸的。这样子的缺陷大家也都知道,会变形!

    下面三个是我们经常用到的拉伸图片的方法:

 /*
    - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight __TVOS_PROHIBITED

    - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); // create a resizable version of this image. the interior is tiled when drawn.

    - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode NS_AVAILABLE_IOS(6_0); // the interior is resized according to the resizingMode

*/

我们一个一个说说,第一个方法我们经常用到在聊天消息框的拉伸,下面是代码和效果图的对比:

    解释一下下面方法可拉伸的范围都是距离leftCapWidth后的1竖排像素,和距离topCapHeight后的1横排像素。比如下面代码的意思是将图片从左起第2列,上起第2行,坐标为(2,2)的像素点进行复制。

    UIImage * image1 = [UIImage imageNamed:@"image"];
    UIImageView * imageView1 = [[UIImageView alloc]initWithImage:image1];
    imageView1.frame = CGRectMake(50, 100, 300, 60);
    [self.view addSubview:imageView1];
    
    
    UIImage * image2 = [UIImage imageNamed:@"image"];
    image2 = [image2 stretchableImageWithLeftCapWidth:1 topCapHeight:1];
    UIImageView * imageView = [[UIImageView alloc]initWithImage:image2];
    imageView.frame = CGRectMake(50, 200, 300, 60);
    [self.view addSubview:imageView];

 

再说说第二个方法:

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets NS_AVAILABLE_IOS(5_0); // create a resizable version of this image. the interior is tiled when drawn

下面是具体的使用:

UIImage * image1 = [UIImage imageNamed:@"image"];
UIImageView * imageView1 = [[UIImageView alloc]initWithImage:image1];
imageView1.frame = CGRectMake(50, 100, 300, 60);
[self.view addSubview:imageView1];
    
UIImage * image2 = [UIImage imageNamed:@"image"];
image2 = [image2 resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
UIImageView * imageView = [[UIImageView alloc]initWithImage:image2];
imageView.frame = CGRectMake(50, 200, 300, 60);
[self.view addSubview:imageView];

看完下面的效果图我们说注意点:(左边是原图,右边是拉伸过的)

                                                                    

注意点:上面的方法有一点需要注意,这个方法默认使用的拉伸模式是区域复制的,它的意思是把要赋值的区域进行赋值,直到满足显示区域!

最后一个方法需要注意的就是后面的枚举,你可以把上面的方法用这个代替了,看看效果,体会一下这个复制和渐变的区别!

/* 
     UIImage will implement the resizing mode the fastest way possible while
     retaining the desired visual appearance.
     Note that if an image's resizable area is one point then UIImageResizingModeTile
     is visually indistinguishable from UIImageResizingModeStretch.
     
     typedef NS_ENUM(NSInteger, UIImageResizingMode) {
     
        UIImageResizingModeTile,      // 把要拉伸的区域进行复制
        UIImageResizingModeStretch,   // 把要拉伸的区域进行渐变拉伸
     }; 
 */
posted @ 2017-03-13 16:56  MrRisingSun  阅读(1315)  评论(3编辑  收藏  举报