获得徽章 0
#iOS知识小集#「 解决某些情况UIImage的data为空的问题 」

通常,我们会用UIImage的jpegData()和pngData()方法来获取UIImage的data,操作很简单,但是在某些特定情况下,UIImage对象不为nil,但是取出来的data是nil。

例如在在生成二维码的过程中(如图),image是可以正常显示在屏幕上的,但是获取data的时候,确是nil,用Xcode预览工具查看也是无法查看的。解决方案是在内存中绘制一下,再使用即可,这样可以隐氏的补全bitmap,当然你也可以写一堆CoreGraphics代码自己直接补全bitmap。

在我们拿到一个非nil的UIImage对象的时候,可以先用jpegData()或pngData()转一下,取出来data如果是nil,再补全一下bitmap,看是否有data。

如果有更好的方案,欢迎一起分享讨论。
展开
知识小集于2019-05-28 12:34发布的图片
知识小集于2019-05-28 12:34发布的图片
评论
赞了这篇沸点
OCLint 实现 Code Review - 给你的代码提提质量
评论
你可能并不需要拦截 WebView 的静态资源
评论
#iOS知识小集#「 关于 UITableViewCell 的 indentationLevel 」

UITableViewCell 的 textLabel 是有一个默认左边距为10px的。实际上,这是由indentationLevel 和 indentationWidth 控制的缘故。indentationLevel 默认为0,indentationWidth 默认为10。

现在重新对这两个属性赋值。

cell.indentationLevel = 2;
cell.indentationWidth = 50;

运行之后,如图一。cell 的缩进量明显变大了。

缩进量 = indentationLevel * indentationWidth。值得注意的是,当indentationLevel = 0时,无论indentationWidth设为多少,最后缩进量都为10。

但是对于自定义cell来说,indentationLevel 并不能起到缩进效果。如图二。要解决这个问题的话,可能只能通过改变约束来达到目的。如果有更好的解决方案,欢迎交流。
展开
知识小集于2019-05-23 13:00发布的图片
知识小集于2019-05-23 13:00发布的图片
评论
赞了这篇沸点
#iOS知识小集#「 UIButton 在粗体文本下的系统 bug 」

UIButton 相信大家是非常熟悉了,但是不知道大家有没有遇到这样的问题。button 同时设置了图片和文字(代码如图1所示)

然后把系统【设置】->【辅助功能】->【粗体文本】开关打开,手机会自动重启。再去查看这个 button 的时候,你会发现文字和图片发生了重叠,类似图2所示。

坑爹的发现,文字和图片叠在一起了,当时测试反馈的时候一脸懵逼,然后仔细检查代码,没啥毛病。最终找到了一种可行的解决方案,但是会稍微有点复杂。需要写一个 UIButton 的子类,代码如图3所示。

使用这个类替换掉 UIButton 之后,粗体模式下也一切正常了,这里只是做了一个小小的 trick,为了解决这个系统 bug。但是为啥能生效的原因不太清楚,如果有知道产生这个问题的真正原因和正确解决姿势的小伙伴欢迎分享。如果你也遇到了这个问题,可以暂时先用这种方式规避。
展开
知识小集于2019-05-22 13:07发布的图片
知识小集于2019-05-22 13:07发布的图片
知识小集于2019-05-22 13:07发布的图片
评论
赞了这篇沸点
#iOS知识小集#「 使用__kindof关键字来扩大变量类型限定范围 」

通常来说,如果我们不确定一个变量的类型,可以使用id来代表变量的类型,但是这样做的坏处是编译器在编译时不会对真实类型进行类型检查,如果我们只是想指定一个变量为一个类的类型或其子类的类型,我们可以使用__kindof来表示。例如在图一的代码中,我们定义了一个元素类型为UIView或者UIView子类的数组,如果往数组中添加UIImageView类型的对象,编译器会报错"Incompatible pointer types initializing 'UIImageView *' with an expression of type 'UIView *'"

如图二所示,当我们使用__kindof UIView * 来对数组元素类型进行修饰时,就不会报错了。
展开
知识小集于2019-05-16 12:19发布的图片
知识小集于2019-05-16 12:19发布的图片
评论
赞了这篇沸点
第一届 BISTUHackathon 编程马拉松大赛
PJHubs于2019-05-18 21:46发布的图片
2
飞聊,来试试

我和3个小伙伴都在【飞聊】的【知识小集小组】,快下载“飞聊”App跟我们一起吧!长按复制这段话,打开飞聊就能马上加入! 7YtQhzizUKs
知识小集于2019-05-22 21:13发布的图片
评论
应用内购买坑太多
评论
#iOS知识小集#「 performSelector: 传递多个参数 」

在 Objective-C 中,方法的调用方式通常由中括号括起来:

[obj methodWithArg1:xxx arg2:xxx]

但有些场景下,我们需要用 performSelector 的方式调用一个对象的方法,例如:

[obj performSelector:@selector(methodWithArg1:arg2:) withObject:xxx withObject:xxx]

不过,performSelector: 方法最多只能传递 2 个参数,对于 2 个以上的参数,就没法用它来调用了。

但我们可以用 NSInvocation 调用的方式来扩展 performSelector: 方法,使之能够支持传递不定个参数,具体如图 1 所示,其中 [EndMark end] 是一个单例,作为参数传递个数结束的标识,其定义如图 2,而不用 nil 作为结束标识,这样可以使该方法支持接收 nil 作为参数值。

接下来,我们就可以使用 performSelector: 方法传递多个参数了。此外,我们也可以使用 objc_msgSend 函数实现给一个方法传递多个参数,如图 3 所示。

参考链接:不一样的方式实现performSelector接收多个参数 t.cn
展开
知识小集于2019-05-21 13:11发布的图片
知识小集于2019-05-21 13:11发布的图片
知识小集于2019-05-21 13:11发布的图片
评论
赞了这篇沸点
#iOS知识小集#「 Objective-C 项目接入 Swift 第三方库的方法 」

目前很多最新的第三库都使用了 Swift 进行开发,且并未兼容 Objective-C。我最近在 OC 项目遇到了一个不得不使用的 Swift 第三方库,官方 issues 给出的 OC 项目引入办法是非常捉急的使用通知来获取操作结果。由于这个类库的方法较少,所以最后采用了使用 Swift 封装一个桥接类,在桥接类里将自己用到的方法、协议、变量都添加 @objc 支持 OC 使用,而这些内容的具体实现则是使用原本的 Swift 第三方库,工作量也非常小。

原理非常简单,只是一个思路的转变,并且也很好地解决了自己的问题。对于此类问题有更优雅解决办法的同学欢迎在评论区指出。
展开
1
赞了这篇沸点
这个有意思:GLSL 与布丁晃动艺术
评论
赞了这篇沸点
#iOS知识小集#「 如何和浮点数愉快的玩耍 」

最近遇到了一个小数的坑:1*10+3*1+1*0.1+4*0.01 你觉得这个计算出来是多少呢?难道不是13.14么?的确不是,如图1。

这是由于计算机中浮点数用二进制表示可能会丢失精度,很难准确的表示我们语义上的数值,比如说13.14。感兴趣的小伙伴可以去搜索一下相关知识。知道原理后,该如何去处理这类计算呢,如果在一些特定的场景内,只有2位小数的情况,那么可以运算前乘以100的倍数,然后再除以100,用整数去计算,可以减少误差,如图2。当其他小伙伴阅读代码的时候估计会很难理解这样的神操作,况且我们很难去预知这些浮点数的计算有多少位小数,这种情况可以使用NSDecimalNumber去计算,如图3,也可以得到我们想要的结果。

NSDecimalNumber的接口并不是很友好,我们可以写一些category或者其他扩展类让上层业务更易用。

如果有更好的玩耍方案,欢迎一起分享讨论。
展开
知识小集于2019-05-14 13:24发布的图片
知识小集于2019-05-14 13:24发布的图片
知识小集于2019-05-14 13:24发布的图片
2
下一页
个人成就
优秀创作者
文章被点赞 4,729
文章被阅读 582,846
掘力值 16,143
收藏集
1
关注标签
6
加入于