大熊猫侯佩
一枚贪吃路痴还未秃码农。优快云 博客专家,iOS 与 Swift 版块版主,热爱苹果开发。
人生看淡,不服就干!
展开
-
SwiftUI 如何在运行时从底层动态获取任何 NSObject 对象实例
在本篇博文中,我们讨论了在 SwiftUI 中监控一般 NSObject 对象的原理,并深入底层,使用钩子(Hook)和 Swizz 机制来达到近乎随心所欲的超能力!小伙伴们还不赶紧操练起来哈!原创 2024-03-04 14:18:16 · 485 阅读 · 14 评论 -
万物皆可长按:SwiftUI 5.0(iOS 17)极简原生实现任意视图长按惯性加速功能
在本篇博文中,我们讨论了 SwiftUI 5.0(iOS 17)中如何仅使用一行代码就搞定任意视图的长按惯性加速功能,并介绍了 SwiftUI 5.0 中形状(Shape)新的渲染机制。原创 2023-07-10 10:19:57 · 3714 阅读 · 16 评论 -
SwiftUI 内功:“曳光弹“实现自定义样式进度条(ProgressView)
在本篇博文中,我们利用敏捷开发中“曳光弹”原则步步为营打造了一款漂亮的进度条样式;我们最终完美的实现了目标,更重要的是:我们学到了软件工程中重要的一课!原创 2023-09-10 10:32:53 · 969 阅读 · 5 评论 -
SwiftUI 动画进阶:实现行星绕圆周轨道运动
在本篇博文中,我们讨论了 SwiftUI 中如何用定时器实现视图围绕圆周运动,并随后用动画进一步优化了运动效果。原创 2023-08-17 19:11:33 · 678 阅读 · 8 评论 -
如何为 Apple 官方 SwiftUI 示例中的图表元素加上首显动画?
在本篇博文中,我们通过讲解并更改 Apple 官方示例源代码,实现了图表视图元素在首次展开时就显示鲜活动画的效果,你值得拥有!原创 2023-04-15 15:21:51 · 528 阅读 · 0 评论 -
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题
在本篇博文中,我们探讨了如何利用Task对象在Swift的async/await并发机制中以原子的方式运行指定代码片段,从而避免数据竞争问题。原创 2022-08-25 17:03:18 · 730 阅读 · 0 评论 -
不恰当Equatable协议==方法的实现对SwiftUI中@State修饰属性的影响
在本篇博文中,我们讨论了不恰当的Equatable协议==方法实现会导致SwiftUI中@State修饰属性值无法被正确更新的问题。原创 2022-08-01 19:05:13 · 359 阅读 · 0 评论 -
SwiftUI视图onReceive方法接收“冗余”事件的解决
在本篇博文中,我们利用Combine修改器方法,在SwiftUI视图订阅中过滤了不需要的事件。原创 2022-07-13 16:04:26 · 1037 阅读 · 1 评论 -
Swift中@dynamicMemberLookup和callAsFunction特性实现对象透明代理功能
在本篇博文中,我们介绍了在Swift中如何用 @dynamicMemberLookup 和 callAsFunction 实现所谓的对象代理模式。原创 2022-06-28 16:36:03 · 444 阅读 · 0 评论 -
SwiftUI 4.0 (iOS 16) 新ViewThatFits视图使用简介
在本篇博文中,我们介绍了iOS 16最新SwiftUI 4.0中新加入的ViewThatFits视图,并举了两个实际的例子。原创 2022-06-26 19:20:03 · 843 阅读 · 0 评论 -
Xcode预览(Preview)显示List视图内容的一个Bug及解决
在本篇博文中,我们介绍了Xcode在预览(Preview)显示SwiftUI列表内容时的一个Bug,并成功的“修复”了它!原创 2022-06-22 22:09:46 · 1389 阅读 · 0 评论 -
一行代码为特定状态绑定SwiftUI视图动画
在本篇博文中,我们学习了仅用一行代码在任意视图上绑定独立状态对应的动画效果,化生硬为灵动,棒棒哒!原创 2022-06-22 10:35:30 · 334 阅读 · 0 评论 -
SwiftUI如何模拟视图发光增大的动画效果
在本篇博文中,我们实现了一个小巧的视图发光增大动画,实现很简单,相信大家可以举一反三,进一步完成更复杂美妙的动画。原创 2022-06-20 14:13:49 · 400 阅读 · 0 评论 -
阅读第三方源代码解决SwiftUI弹出视图无动画以及List被诡异重建的问题
在本篇博文里,我们通过深入第三方SwiftUI项目源代码,解决了视图弹出无动画效果以及List被重建的问题。原创 2022-06-16 10:29:34 · 317 阅读 · 0 评论 -
SwiftUI刷新List内容导致其父Section头部显示不正确的解决
SwiftUI中当刷新Section内部的List时,你会发现List中的行竟然变成了相邻Section头部的内容。这是怎么回事呢?且看分解。原创 2022-04-10 10:08:07 · 1918 阅读 · 0 评论 -
Xcode 13.2.1生成SwiftUI+CoreData项目运行时提示:persistent container with no stores loaded 警告的解决
Xcode 13.2.1生成CoreData支持的SwiftUI的项目后,运行会提示:View context accessed for persistent container with no stores loaded,且看我们如何解决原创 2022-03-06 23:07:56 · 974 阅读 · 0 评论 -
SwiftUI中sendAction无法正确被发送的解决
1. SwiftUI取得当前输入视图的尺寸在SwiftUI中,有时希望获取当前界面中输入焦点所在视图的尺寸,我们可以通过向App当前UIResponder响应对象发送消息来完成。网上现成的一段代码如下:extension UIResponder { private static weak var _currentFirstResponder: UIResponder? static var currentFirstResponder: UIResponder? { _.原创 2021-01-08 13:32:40 · 540 阅读 · 0 评论 -
SwiftUI如何写一个单独项禁用功能的SegmentPicker高仿控件
加强SwiftUI原生Picker控件功能我们知道SwiftUI中自带有标准的Picker控件,如果对它应用SegmentedPickerStyle样式,那么我们就得到了UIKit中对应的UISegmentControl控件。但某些情况下,Picker控件达不到我们的要求,比如我们希望Picker中的某些项可以被禁用,这是默认控件目前无法实现的。这里就让本猫演示一下如何写一个实现子项禁用功能的Picker控件加强版。但请不要误会,这里不会直接用到UIKit,我们只是在SwiftUI中对其扩展。.原创 2020-11-04 20:28:35 · 529 阅读 · 0 评论 -
Mac OS增加文件缓存改善写入性能
这篇准备写个直接明了的…保证没有段子…本文概述了如何使得写入性能提高近5倍的实现。答案很简单: Cache!!!func cryptFile(path: String, with keyData: Data) { guard let h = FileHandle(forReadingAtPath: path) else {return} guard let hw = Fil...原创 2020-05-02 10:06:48 · 1017 阅读 · 0 评论 -
最直白告诉你Swift语言的rethrows关键字到底有什么用?
说实在的,错误处理对于Swift语言来说还算比较简单,如果你对此早已了然于心,请直接略过。如果你搞不清throws和rethrows到底有什么区别,你可以留步稍微了解一下。throws 关键字throws很简单,就是用来告诉编译器我这个方法会抛出错误: enum MyError:Error{ case noName } ...原创 2020-03-18 09:40:57 · 1237 阅读 · 0 评论 -
SwiftUI: 利用Combine四种方式实时监听用户文本输入
自从Swift 5.1加入了Combine之后,腰不酸了,腿不疼了,各种姿势都能有了…不过对于TextField来说如何实时监听用户输入的文本呢?貌似TextField自身并没有带用户输入改变的回调,这可咋整呢?没关系,聪明的你们应该早已猜到,用Combine库,秒天秒地秒空气…truct NameInputView: View{ @State var name:String...原创 2020-03-14 09:35:57 · 2306 阅读 · 0 评论 -
Xcode:Playground中延时调用的新写法
我们知道默认情况下Playground中是不可以完成延时调用这些操作的,因为Playground只在前台执行一次,压根不会理会你所谓的延时执行.比如以下代码:import UIKitclass Foo{ @objc func show(){ print("Hi") }}let obj = Foo()Timer.scheduledTimer(timeInterval原创 2016-10-19 12:58:56 · 1446 阅读 · 0 评论 -
Swift中String和NSString的一个不同之处
我们知道在Swift中String和NSString是可以互相转换使用的…额…应该是在绝大数情况下可以互相转换使用.在某些情况下可能还有一丝丝略微的差别:比如在涉及到处理字符串中字符索引的时候.我们首先来看一下NSString的字符串替换功能:let string = "ABCDE"let range = Range(uncheckedBounds: (1,4))let nsRange = NSRa原创 2016-10-01 16:12:58 · 2684 阅读 · 0 评论 -
Xcode的playground中对于SpriteKit物理对象的更新为何无效
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;)为了便于SpriteKit中物理行为的调试,我们可以借助于Xcode的playground的强大机制.我们只需要随时修改我们的代码,就可以在观察窗中立即观察到物理对象的变化.现在为了给眼睛观察一定延时时间,我们写一个延时方法:public func dela原创 2016-04-26 11:34:53 · 3612 阅读 · 0 评论 -
深度好文: 为毛我能通过@State var修改变量? @State属性修饰器内部肿么工作的?
问题: 为毛改变(遵守View协议的结构中)常规的成员变量会报错?“Cannot assign to property: ‘self’ is immutable” “Cannot use mutatingmember on immutable value: ‘self’ is immutable”以下代码会报如上错误:struct porque: View { @State p...翻译 2020-04-15 17:16:45 · 1303 阅读 · 0 评论 -
SwiftUI: @propertyWrapper结合Combine打造可观察属性
SwiftUI视图刷新机制杂谈笼统的说,属性在被改变时想要触发视图refresh,需要满足下面两种条件之一:该对象是值类型,所有值类型都不能被修改,只能创建修改后的实例。这使得SwiftUI运行时可以捕获到这种新创建的时机,借此刷新视图。该对象是引用类型,遵守ObservableObject协议,由其中的objectWillChange发布器被SwiftUI订阅(隐式),从而在收到对象被修...原创 2020-04-15 14:34:05 · 766 阅读 · 0 评论 -
SwiftUI中带格式(Formatter)TextField如何捕获非法输入
导言本文将向大家展示如何利用格式的TextField来过滤用户非法输入,同时解决一个TextField的"怪异"行为。这是本猫第一篇付费博文,相信不会让你失望,如果能够解决到大家的难点、痛点那就更妙了…So废话少说,Let’s Go!!!TextField的格式器有什么用?带格式器的TextField可以过滤用户的非法输入,相当于将以下几个步骤的工作量放到了一起,做了一个封装:取得...原创 2020-04-08 15:29:19 · 1477 阅读 · 0 评论 -
快点射!(Swift Injection) 不带这样的!
导言注入(Injection)在任何语言里都是非常有效的解耦利器。请不要把上面的注入和注入攻击混淆起来,不要把本猫逼得变身成黑客猫 ????这里就带大家看看如何解决Swift中Injection一个常见的问题:怎么解决泛型协议实体兼容性问题???快速射(Swift Injection), 别想歪如果你没有被上面的那一句拗口的话吓跑,那么恭喜你,坚持看下去你会觉得其实也没想象的那么难…上帝...原创 2020-03-28 19:09:50 · 1036 阅读 · 0 评论 -
浅析Swift中Combine框架自定义订阅操作符
引子Swift 5.1中苹果终于千呼万唤始出来的祭出Combine框架,带着一层神秘的面纱,它来啦!Combine框架颠覆了以往苹果的开发模式,它用发布者(Publishers),订阅者(Subscribers)以及两者之间重要的纽带:订阅(Subscriptions),诠释了什么是反射式编程。如上图所示,为了更加便捷的完成输入流(Input Stream)到输出流(Output Stre...原创 2020-03-26 22:35:43 · 2302 阅读 · 0 评论 -
iOS科普一下根View及其子View中心点含义的坑
本文简单介绍了根View以及子View中心的含义。解答了为什么根View的直接子View可以用childView.center = parentView.center来设置中心,但childView的子View不可以这样做的原因。废话?中心什么意思!?的确,中心是什么意思,不是废话么?中心不就是中心么?不过严格来说,在iOS里view的中心(view.center)是其矩形中心点在其父...原创 2019-03-12 10:38:09 · 979 阅读 · 3 评论 -
Swift派生与不派生自NSObject对象之间等于比较的不同
本文简单介绍了Swift中派生与不派生自NSObject的类,在等于比较时表现出的不同行为;还顺带讨论了创建大数组时效率的问题.等于或不等于我们知道对于数组的比较来说,实际比较的是它们中的每一个对应位置上元素.所以最终都是要比较对象的.我们还知道对于Swift中的类来说,要实现==操作符,需要遵守Equatable协议,并实现==方法.比如对于类A来说:class A:NSObje...原创 2019-02-21 11:06:36 · 1749 阅读 · 2 评论 -
简约同样简单:为UISlider添加显示当前值的标签(下)
本文在重构的基础上,从类封装的角度重新实现UISlider的功能扩展:显示当前的值,比之前更加简单和易于维护。建议在看完上篇之后再来观赏。上篇观赏在此 : 简约同样简单:为UISlider添加显示当前值的标签(上)为什么要重写?在上篇里我们已经实现了UISlider的扩展功能,已经可以用了,为什么还要费事再说这个事呢?原因是:它的封装性不足,对外太开放。举个栗子:UISlider上...原创 2019-01-29 14:22:09 · 1164 阅读 · 4 评论 -
简约同样简单:为UISlider添加显示当前值的标签(上)
本文畅想了几种为UISlider添加显示当前值的方法,并选择了其中一个稳定,简单的实现.适合iOS刚入门或中级水平的童鞋们观赏.看不见值?这不科学!默认的UISlider,你可以任意拖动,却看不见当前表示的值…有点盲人摸象的赶脚了…我们一般的做法是用另一个控件表示其当前值,比如一个UILabel.不过这样貌似要另外占用一些空间,不紧凑!看到UISlider上面那个圆圆的把手了么?我...原创 2019-01-27 13:35:26 · 2529 阅读 · 0 评论 -
乱弹:Swift单复共体参数类型---与Ruby相比不那么优雅的实现
本文提出单复共体参数的一种实现,同时比较了Ruby中的实现,后者显然更加优雅。适合对Swift语言本身有兴趣,喜欢纠结语法,而且了解其他动态语言的童鞋观看。什么是单复共体参数?这是我发明的词…很简单,就是对于同一类型的对象,既可以传递它的单数形式又可以传递它的复数形式作为方法的参数。还是一头雾水???举个栗子://display(...)是一个方法,现在还不知道它的原型应该怎么写,...原创 2019-01-06 12:54:34 · 659 阅读 · 0 评论 -
CoreData中访问托管对象的NSSet关系属性导致崩溃的解决
本文介绍了再少数情况下,当访问CoreData托管对象中的NSSet关系属性引起App崩溃的现象以及解决.现象在访问托管对象的traces关系属性时,App崩溃,提示:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableSet unionSe...原创 2018-12-31 19:56:35 · 1065 阅读 · 0 评论 -
化繁为简:Swift剔除数组中重复元素的几种姿势
本文向大家介绍稍许算法的实现:关于如何去除数组中的重复元素,并比较了两种算法之间的效率.全部代码在Xcode的Playground中实现,直观明了,适合Swift学习入门童鞋观赏.有个前提如题,很多童鞋立即给出解决方法,无外乎是利用Swift内置的集合(Set)或字典(Dict)的一个特性:过滤重复元素.但由于集合和字典中元素的顺序是无法保证的,所以这建立在一个前提基础之上:结果数组元素...原创 2018-12-27 17:23:48 · 4389 阅读 · 0 评论 -
iOS使用动画连贯过渡界面转换
本博向大家演示如何通过添加动画,为原有界面元素变换增加连贯的过渡效果.为UI代码一丝动态与活力感.缘起第三方的一个图片裁剪器,拿过来做了几点修改:将其封装到动态库中,方便集成扩充了一些功能,比如等待菊花和是否允许进行裁剪等用封装好的动态库创建了一个ImageCropRow类,这样就可以在Eureka中方便的使用了大致就是如此,细节不必深究,现在的效果是这个样子的:总体符合本...原创 2018-12-22 13:02:23 · 29970 阅读 · 4 评论 -
一招搞定Xcode错误日志显示use -v to see invocation的问题
本博向大家展示了当Xcode出错信息匮乏,完全不知所云时,如何找到真正的错误原因的方法。简单有效,你值得拥有。抽风的Xcode?极少数情况下,Xcode编译出错的信息完全让人摸不着头脑,比如下面一段:<unknown>:0: error: merge-module command failed with exit code 1 (use -v to see invocatio...原创 2018-12-20 21:11:13 · 12087 阅读 · 1 评论 -
Swift调用协议扩展导致崩溃的解决
本博向大家介绍Swift对象委托的一种变通方法,但遗憾的是该方法在Swift 4.2中会导致App崩溃,生活还要继续,且看本猫如何解决它喽.什么是对象委托简单的说对象委托就是对象A假装对象B,当然A和B的类完全不同.用过Ruby的童鞋都知道,这很容易完成:Class Account &amp;amp;amp;lt; ActiveRecord::Base delegate :firstnam...原创 2018-12-19 10:36:25 · 1171 阅读 · 0 评论 -
Swift中集合(Set)无法删除自身对象的临时解决方法
这是本猫遇到的比较怪异的问题之一:明明在集合中的对象,但却无法直接删除它。由于原项目较为复杂,为了演示目的,本猫对博文示例代码做了简化,但并不影响问题的表述。背景介绍App逻辑很简单,对象Node对应着TableView中每一行,你不用知道Node对象到底是啥,你只要知道它是列表每一行后面的那个数据对象:class Node:Equatable{ var nodeId:Int va...原创 2018-12-15 16:52:50 · 589 阅读 · 1 评论