常用开发技巧系列(三)

热更新衍生出来的问题:

  前两天都在说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,   // 把要拉伸的区域进行渐变拉伸
     }; 
 */

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏计算机编程

Android 7.0+ popwindow的适配

说明:网络上大多数都是用的global的方法导致很多情况下全面屏显示不好,底部虚拟按键位置空出,所以正确的方法应该用WindowVisibalDisplay。

23130
来自专栏Linux技术资源分享

Android车轮之图片加载框架Android-Universal-Image-Loader

16750
来自专栏分享达人秀

拖动条SeekBar和星级评分条RatingBar

前面两期都在学习ProgressBar的使用,关于自定义ProgressBar的内容后期会继续学习的,本期先来学习ProgressBar的2个子组件Se...

29090
来自专栏Linux技术资源分享

简单快捷的退出APP应用

20070
来自专栏Android机动车

Retrofit实现带进度下载

Retrofit是目前最主流的网络框架了,它对网络请求几近完美的封装,大大降低了我们开发者的研发难度,缩短了研发周期。最近项目中遇到了下载视频和图片文件的需求(...

15820
来自专栏向治洪

android 网络通信框架volly

1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection...

21350
来自专栏向治洪

Universal Image Loader for Android 使用实例

<span style="white-space:pre">      </span>// 1.获取ImageLoader实例         ImageLo...

269100
来自专栏Android干货园

Android谈谈封装那些事--BaseActivity和BaseFragment(二)

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53...

53210
来自专栏KK的小酒馆

Service的跨进程开发Android开发高级进阶

Service的跨进程通信主要由两种Android提供的方法进行,一个是AIDL,通过创建一个AIDL文件来完成,另一个是利用Messenger,发送Messa...

15220
来自专栏Android研究院

一款强大的文件选择器-PrimPicker

PrimPicker is a load local image and video selector for Android。

16030

扫码关注云+社区

领取腾讯云代金券