IOS

iOS常见宏理解及使用方法

2019-08-08
FOUNDATION_EXPORT, UIKIT_EXTERN 该宏的作用类似于extern,使用方法也与extern类似,在.m文件中,定义如下 NSString *const kFoundationExportString = @"Hello World"; NSString *const kExternString = @"Hello World"; 然后在.h文件中加上以下声明, 就可以在导入该.h文件的类中访问该常量. FOUNDATION_EXPORT

iOS动态更换Icon的全过程记录

2019-08-06
iOS 动态更换Icon 动态切换 App 的 icon 这个需求,在上一家公司做一款定制 App 时遇到过一次,这次领导说可能需要做,就又做了一次.虽然不是什么很难的知识点,这里也就记录一下自己做的过程吧. info.plist 文件编辑 更换 Icon 静默切换 info.plist 文件 为了动态更换 icon,我们需要先配置一下我们项目的 info.plist 文件: 1.加入 Icon files(iOS5),其中会默认有两个 item: Newsstand Icon Primary

iOS 弹幕功能的实现思路图解

2019-07-24
先来看一张效果图(LICEcap录制的有点卡, 凑合看) 理一下大概流程: 接下来实现: 弹幕视图从底部弹上来, 依次动画向上滚动, 出屏幕就移除加入重用队列, 下次使用. 定义相关属性: 1. 根据弹幕区域, 确定总共需要的弹幕itemView个数(总区域高度/最小高度),并添加到弹幕控件底部 追加一条新数据(由于需要动画处理, 当前数据动画完成后才能处理下一条数据,这里需要定义两个区:正在处理区和等待处理区) 追加数据并弹出 从处理区取出itemView并初始化其将要展示的位置,计算宽高,

iOS常用算法之两个有序数组合并(要求时间复杂度为0(n))

2019-07-17
思路: 常规思路: 先将一个数组作为合并后的数组, 然后遍历第二个数组的每项元素, 一一对比, 直到找到合适的, 就插入进去; 简单思路: 设置数组C, 对比A和B数组的首项元素, 找到最小的, 就放入数组C,依次进行下去. 代码如下: - (NSArray *)mergeOrderArrayWithFirstArray: (NSMutableArray *)array1 secondArray: (NSMutableArray *)array2 { // 全为空不处理 if (!array1.

UILabel显示定时器文本跳动问题的解决方法

2019-07-16
先看一个有问题的展示效果: 上面的gif图会发现在显示验证码计数时出现跳动和闪烁的问题.目前大多数用来实现定时器显示的控件都是UILabel. 在iOS9以前系统默认的英文字体是Helvetica, 这种字体每个数字的宽度都是相等的.而在iOS9以后默认的英文字体变为San Fransico字体,这种字体每个数字的宽度是不相等的. 正是因为数字宽度的不相等就导致了用UILabel来显示定时器文本时出现文字跳动闪烁的问题. 因此解决的方案就是选用一种等宽数字字体显示即可.为此有两个解决方案: 用H

ios设备使用iframe宽度超出屏幕的解决方法

2019-07-13
场景 在做公司官网h5项目时遇到iframe在苹果X手机上右侧超出屏幕的问题,感觉像是被截断一样,但是在其他手机上显示正常. 分析 问题原因:页面a利用iframe嵌入了b,同时设置iframe的宽度为100% ,但是页面b的实际宽度要大于外层设置的100%. 正常情况下,页面b的显示宽度应该为外层赋予的100%,但是在ios上,当iframe内真实宽度大于外层给予的宽度的时候,显示的宽度则为真实宽度. 解决 1.给iframe的外层div添加样式:overflow: auto;-webkit-

iOS中如何获取某个视图的截图详析

2019-07-12
前言 最近在做SDK的截图,想触发类似系统的截屏功能,找了一圈,总结一下靠谱的几种方式. 我写了个UIView 的category,将这几种方式封装和简化了一下. 第一种情形截图 这种是最最普通的截图,针对一般的视图上添加视图的情况,基本都可以使用. 源码: /** 普通的截图 该API仅可以在未使用layer和OpenGL渲染的视图上使用 @return 截取的图片 */ - (UIImage *)nomalSnapshotImage { UIGraphicsBeginImageContext

iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi

2019-07-10
前言 5G 什么的,还得等苹果API更新啊,不过将来还是这个处理过程就是了. 关于判断当前的网络环境是2G/3G/4G,这个问题以前经常看到,最近在一工程里看到了如果判断的API.而在撸WebRTC音视频通话的时候,看到了Demo中将SCNetworkReachability与其结合,当网络环境改变时,判断当前连接的是什么网络环境,写法欠佳(因为将其与WebRTC的其他逻辑柔和在了一个类).其实只需要将官方的Reachability做一下改进即可. 如何判断当前的网络环境 我们可以利用#impo

iOS导航栏控制的一些总结

2019-07-10
前言 许久不写UI,对UI的很多东西都生疏了,最近使用导航栏的各种场景做一些总结. 1.导航栏的显示与隐藏 导航栏的显示与隐藏,分两种情况: 1.从不显示导航栏的页面push到显示导航栏的页面. 2.从显示导航栏的页面Push到不显示导航栏的页面. 注意: 1.如果导航栏不显示时,系统的侧滑返回功能无效. 2.虽然侧滑返回功能无效,但是导航栏的 .interactivePopGestureRecognizer.delegate还是存在的. 针对以上两种情况分别处理,整个Push过程都假设是从A页

如何利用FutureBuilder提高开发效率

2019-07-08
常见场景 展示请求按钮 用户点击按钮,显示loading 展示数据或者错误 抽象模式 展示请求按钮(初始状态) 用户点击按钮,显示loading(请求中状态) 展示数据或者错误 (结束状态(成功或失败)) 转换成程序语言 以上三种现实情况对应 AsyncSnapshot 三个状态 ConnectionState.none 初始态 ConnectionState.waiting 请求态 ConnectionState.done 完成态 snapshot.hasError 完成(异常) snapsh

iOS开发避免安全隐患的要点总结

2019-07-03
现在很多iOS的APP没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全. 一.网络方面 用抓包工具可以抓取手机通信接口的数据.以Charles为例,用Charles可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据. 1.1 中间人攻击 先简要地说下什么是中间人攻击: ①客户端:"我是客户端,给我你的公钥" -> 服务端(被中间人截获). 所以现在是: 客户端->中间人 ②

iOS开发中多线程的安全隐患总结

2019-07-02
资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 一.解决方案 解决方案:使用线程同步技术(同步,就是协同步调,按预定的先后次序进行) 常见的线程同步技术是:加锁 1.OSSpinLock OSSpinLock叫做"自旋锁",等待锁的线程会处于忙等(busy-wait)状态,一直占用着CPU资源 目前已经不再安全,可能会出现优先级反转问题 如果等待

iOS开发教程之WKWebView与JS的交互

2019-07-01
前言 iOS8以后,Apple公司推出了WKWebView,对比之前的UIWebView不论是处理速度还是内存性能,都有了大幅度的提升! 那么下面我就分享一下WKWebView与JS的交互. 首先使用WKWebView.你需要导入WebKit #import 然后初始化一个WKWebView,设置代理,并且执行代理的方法.在网页加载成功的时候,我们会调用一些JS代码对网页进行设置. WKWebView的代理一共有三个:WKUIDelegate,WKNavigationDelegate,WKScr

iOS自定义转场动画的几种情况

2019-06-27
前言 在开发中,无论我们使用 Push 还是 Present 推出新的 ViewController 时,系统为了提高用户体验都会为我们默认加上一些过渡动画.但是,系统默认的动画总是不能满足大家各种各样的需求的,所以系统也为我们提供了在不同场景下自定义过渡动画以及通过手势控制过渡进度的实现方案. 这篇文章记录了自定义转场动画中的几种情况: 模态跳转(Present) 导航控制器跳转(Push) UITabbarController 三方框架--Lottie 效果图 预备 首先,我们现在介绍几个在

解决SDK注入权限验证安卓正常,IOS出现config fail的方法

2019-06-23
实测有效 解决微信游览器和企业微信游览器JSSDK注入权限验证 安卓正常,IOS出现config fail 一开始我们想到的是可能微信这边的Bug,但细想一下应该不是.因为可能涉及到了IOS的底层原理的问题,可能是不受微信所控.(有问题欢迎拍砖) 出现问题得解决问题啊,不能把问题晾在那边不管,这是程序员的尊严! 我这个是SPA应用,所以拿其中一个vue项目来做探讨,其他SPA应用同理 首先我们想到在安卓中生效,在IOS中不生效是什么原因? 我们把所有设置都检查了一遍,最终发现是当前路由locat

Objective-C中block循环引用问题详解

2019-06-14
目标:block执行过程中,self不会释放:执行完可以释放. 最初 block中直接使用self会强引用. self.myBlock = ^() { [self doSomething]; }; 或者使用了对象的属性 self.myBlock = ^() { NSString *str = _str; NSString *str2 = self.str; }; 在这样的情况下,self强引用block,block也持有该对象,导致循环引用. 要注意的是,只有在self强引用block的时候才会

iOS中gif图的显示方法示例

2019-06-13
一.前言 iOS开发中,大部分时候我们显示一张静态图就可以了,但是有的时候为了UI表现更生动,我就有可能需要展示gif图来达到效果了. 网上找了一下,显示gif图的框架找到了两个. SDWebImage YYImage 二.显示本地gif图 SDWebImage和YYImage的显示本地图片代码. //load loacle gif image - (void)loadLocaleGifImage{ //sdwebimage [self labelFactoryWithFrame:CGRectM

使用objc runtime实现iOS闭环的懒加载功能

2019-06-13
使用objc runtime实现懒加载 地址:AutoPropertyCocoa 懒加载形式如下 - (id)lazyloadProperty{ if(_lazyloadProperty == nil){ _lazyloadProperty = [XClass ...]; } return _lazyloadProperty; } 一般使用宏定义可以轻松完成.但是没有一致性,移植差. 利用objc runtime的动态性实现懒加载可以实现即可增加又可删除功能,也可以避免污染类型.该三方弥补了目前

iOS去除Webview键盘顶部工具栏的方法

2019-06-04
前言 在默认情况下,iOS 使用 Webview 打开的网页,在进行表单输入时,弹出的键盘顶部会多出一个工具栏. 左边有两个上下按钮,右边有一个Done/完成按钮.这是用来切换输入框的,就像 PC 上按Tab键可以切换输入框一样. 为了让 App 中嵌入的 H5 更接近 Native,咱们可以去掉它. UIWebView UIWebView,可以使用[self hideKeyboardShortcutBar:self.webView]去掉工具栏. - (void) hideKeyboardSho

iOS UIPickerView的简单封装示例

2019-06-01
前言 在iOS实际项目中,经常会出现界面中多个地方需要使用UIPickerView,如果在每个需要用到的地方都创建一个UIPickerView不仅更耗性能,而且还会让你的代码变得更加杂乱.冗余,因此我在这里向大家介绍一下我对UIPickerView的一些简单封装. 所需属性 /** pickerView*/ @property (nonatomic, strong) UIPickerView pickerView; /* pickerView背景*/ @property (nonatomic,