获得徽章 0
- #iOS知识小集#「 UIButton 在粗体文本下的系统 bug 」
UIButton 相信大家是非常熟悉了,但是不知道大家有没有遇到这样的问题。button 同时设置了图片和文字(代码如图1所示)
然后把系统【设置】->【辅助功能】->【粗体文本】开关打开,手机会自动重启。再去查看这个 button 的时候,你会发现文字和图片发生了重叠,类似图2所示。
坑爹的发现,文字和图片叠在一起了,当时测试反馈的时候一脸懵逼,然后仔细检查代码,没啥毛病。最终找到了一种可行的解决方案,但是会稍微有点复杂。需要写一个 UIButton 的子类,代码如图3所示。
使用这个类替换掉 UIButton 之后,粗体模式下也一切正常了,这里只是做了一个小小的 trick,为了解决这个系统 bug。但是为啥能生效的原因不太清楚,如果有知道产生这个问题的真正原因和正确解决姿势的小伙伴欢迎分享。如果你也遇到了这个问题,可以暂时先用这种方式规避。展开赞过评论2 - #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
展开赞过评论2 - #iOS知识小集#「 使用__kindof关键字来扩大变量类型限定范围 」
通常来说,如果我们不确定一个变量的类型,可以使用id来代表变量的类型,但是这样做的坏处是编译器在编译时不会对真实类型进行类型检查,如果我们只是想指定一个变量为一个类的类型或其子类的类型,我们可以使用__kindof来表示。例如在图一的代码中,我们定义了一个元素类型为UIView或者UIView子类的数组,如果往数组中添加UIImageView类型的对象,编译器会报错"Incompatible pointer types initializing 'UIImageView *' with an expression of type 'UIView *'"
如图二所示,当我们使用__kindof UIView * 来对数组元素类型进行修饰时,就不会报错了。展开等人赞过评论6 - #iOS知识小集#「 Objective-C 项目接入 Swift 第三方库的方法 」
目前很多最新的第三库都使用了 Swift 进行开发,且并未兼容 Objective-C。我最近在 OC 项目遇到了一个不得不使用的 Swift 第三方库,官方 issues 给出的 OC 项目引入办法是非常捉急的使用通知来获取操作结果。由于这个类库的方法较少,所以最后采用了使用 Swift 封装一个桥接类,在桥接类里将自己用到的方法、协议、变量都添加 @objc 支持 OC 使用,而这些内容的具体实现则是使用原本的 Swift 第三方库,工作量也非常小。
原理非常简单,只是一个思路的转变,并且也很好地解决了自己的问题。对于此类问题有更优雅解决办法的同学欢迎在评论区指出。展开等人赞过17 - #iOS知识小集#「 如何和浮点数愉快的玩耍 」
最近遇到了一个小数的坑:1*10+3*1+1*0.1+4*0.01 你觉得这个计算出来是多少呢?难道不是13.14么?的确不是,如图1。
这是由于计算机中浮点数用二进制表示可能会丢失精度,很难准确的表示我们语义上的数值,比如说13.14。感兴趣的小伙伴可以去搜索一下相关知识。知道原理后,该如何去处理这类计算呢,如果在一些特定的场景内,只有2位小数的情况,那么可以运算前乘以100的倍数,然后再除以100,用整数去计算,可以减少误差,如图2。当其他小伙伴阅读代码的时候估计会很难理解这样的神操作,况且我们很难去预知这些浮点数的计算有多少位小数,这种情况可以使用NSDecimalNumber去计算,如图3,也可以得到我们想要的结果。
NSDecimalNumber的接口并不是很友好,我们可以写一些category或者其他扩展类让上层业务更易用。
如果有更好的玩耍方案,欢迎一起分享讨论。展开等人赞过25 - What’s new in RxSwift 5
- 将 Relay 拆分成一个独立的框架 -- RxRelay
- Variable 最终被弃用
- 新增 do(on:) 重载
- bind(to:) 现在支持多个观察者
- 一个新的 compactMap 操作符
- toArray() 现在返回 Single
- 泛型约束命名整理展开赞过评论2 - #iOS知识小集#「 Xcode文件顺序错乱小技巧 」
有时候对Xcode的中的文件重新导入后,会导致 .h 和 .m 文件不在一起,整个文件顺序都乱了,如图 1 所示:
其实Xcode提供了一种简单的方法,可以让这些文件回归到正确的位置,选中某个目录下的文件,按图中的方法,执行即可,如图2所示:
执行完后,文件就会按照正确的位置显示了。展开赞过评论2