
iPhone开发
文章平均质量分 77
颐和园
这个作者很懒,什么都没留下…
展开
-
Swift Tips(3)
// key 属性定义了包装器的一个参数/// 构造器,属性包装器在修饰某个属性时将调用/// wrappedValue 是 @propertyWrapper 必须要实现的属性。get {T??set {wrappedValue 在这里引用为被修饰的属性,它所实现的 get/set 方法,将在其修饰的属性上生效。也就是说被修饰的属性自动实现了 wrappedValue 的 get/set 方法,从而减少了重复代码。原创 2023-05-09 16:37:36 · 874 阅读 · 1 评论 -
Swift Tips(2)
定义 outlet collection 时不能使用 weak:将 weak 删除即可。Editor->Debug Selected Views 进行调试。↩︎。原创 2023-04-04 10:58:53 · 770 阅读 · 0 评论 -
Swift Tips(1)
Swift tips1. 为什么将 View 从别处粘贴进另一个View后无法添加约束原创 2023-03-01 15:21:27 · 548 阅读 · 1 评论 -
iOS 绿幕技术
绿幕(green screen)技术,又称 chroma key effect,实际上是将图片上指定颜色设置为透明的图形处理技术,这些透明区域也可以被任意背景图片替换。这种技术在 视频合成中被广泛使用。iOS 中,通过 CoreImage 的某些滤镜比如 CIBlendWithMask 可以实现这种效果,但是实现过程比较繁琐。原创 2023-02-23 16:28:03 · 930 阅读 · 0 评论 -
如何对用户输入进行校验
对用户输入进行校验是非常重要,我们无法预知用户行为。当你要求用户输入信息时,用户很可能输入了不正确的格式,而一旦我们将这些错误格式的数据发送到API,往往会导致不可预期的后果,甚至程序崩溃。因此理论上只要是用户输入,我们都必须进行校验。但这不是一件简单的工作。我们不仅仅需要考虑正则校验,同时需要遵循响应式原则,尽早在用户输入的过程中发现一切错误,越早越好。仅仅在用户输入完成后才进行正则校验,不是一种良好体验。接下来,我们演示这将如何实现。...原创 2022-08-01 16:16:44 · 2616 阅读 · 0 评论 -
Implement a customized pin code input control
As a iOS engineer, you are asked to collect user's input for a pin code. How can we make it? You can simply use a UITextField to do that, but it doesn't make sense that user can enter any characters and super long text as a pin code input.原创 2022-08-01 16:15:33 · 853 阅读 · 0 评论 -
创建酷炫的 CollectionViewCell 转换动画
新建 iOS App 项目,打开 Main.storyboad,拖入一个 CollectionView,为其创建布局约束如下:为 CollectionView 创建一个 IBOutlet 连接:新建 swift 文件,充当我们的 model ,这就是我们要渲染在 cell 上的数据:新建 UICollectionViewCell 子类 SalonSelectorCollectionViewCell。打开 SalonSelectorCollectionViewCell.xib,创建如下 UI :Salon原创 2022-06-06 15:02:19 · 1429 阅读 · 0 评论 -
如何在同一串文字中凸现富文本-EmphasizeString
What’s itEmphasizeString(https://gitee.com/kmyhy/emphasized-string) is an extension that it help you to emphasize, highlight, underline, style specific sub-strings in a string. For example, given a string said ‘Pls login now at www.yourdomain.com’, you ca原创 2022-05-03 17:37:36 · 680 阅读 · 0 评论 -
用 SwiftUI ViewModifier 自定义弹窗
SwiftUI 以 ViewModifier方式提供了方式多样的呈现视图方式(弹窗),比如 contextMenu、alert、actionSheet。相比较 UIKit 的弹窗,这些 ViewModifier 无疑能大大简化我们代码。但无一例外,这些 ViewModifier 只提供了很少的定制化选项。比如 Alert,你不能改变 Title 的样式、字体、颜色,也不能在上面放一个 TextField 或者 Image,甚至自定义呈现动画。既然系统提供的 ViewModifier 不能满足需要,那么我原创 2022-04-02 13:23:12 · 3007 阅读 · 0 评论 -
Swift 自定义 Loading 按钮 ContentButton
git 仓库地址:https://gitee.com/kmyhy/content-buttonApp 中经常会用到这样的按钮,当你点击它,它会显示一个 loading 图标并不停地转圈(小菊花),表示它正在异步加载某些数据,当加载完成,按钮才恢复原样:这正是 ContentButton 能为你做的。它的使用非常简单,直接将源文件放到你的项目中即可:ContentButton.swiftContentButton 还用到了一个 UIColor 的扩展函数 init(hexString: ),定原创 2022-02-23 19:22:40 · 2326 阅读 · 0 评论 -
Swift Tips(18-32)
18. 软键盘添加 Done buttonextension UITextField {func addDoneToolbar(onDone: (target: Any, action: Selector)? = nil) {var doneButton: UIBarButtonItem! if let onDone = onDone {doneButton = UIBarButtonItem(title: localizedString(with: “cosmos_common_done”), s原创 2021-10-18 11:36:11 · 652 阅读 · 0 评论 -
Swift Tips(1-17)
1. 为什么有时候无法为一个 View从别处粘贴进另一个View后无法添加约束?在 Size 面板中将 Layout 属性改为 Inferred(Constraints)。此外,当一个 view 下面没有 Constraints 时,无法将别的 view 拖进这个 view。你可以从 Library 中随便拖一个控件到这个view,然后随便为这个控件添加一个约束,然后删除这个控件。这时就可以为这个 View 添加一个 Contraints 集合,然后就可以拖拽别的 view 到这个 view 来了。2.原创 2021-10-18 11:34:20 · 1088 阅读 · 0 评论 -
TransformAnimation - 一个超简单的导航转换动画
TransformAnimation 实现了一个导航转换动画,用于替换系统导航控制器默认的 push 动画:当你点击第一个 view controller 的 Butto,转换动画开始播放。这个动画首先会从位于视图中央的大图片开始,然后快速移动并缩小到右下角。动画结束时,第二个 view controller 呈现。git 地址:https://gitee.com/kmyhy/transform-animat用法首先,将这 2 个文件拖到项目中:UIView+Extension.swift原创 2021-10-18 11:19:17 · 1115 阅读 · 0 评论 -
FreeShadow - 绘制不规则阴影
FreeShadow 能做什么在 iOS 开发中, 绘制阴影是一件常规任务。但绝大多数时候,我们只能绘制规则形状但阴影,比如矩形。那么怎么才能绘制不规则图形的阴影呢? 你可以使用 FreeShadow。FreeShadow 可以创建通过 UIBezierPath 绘制的不规则几何图形甚至是位图的阴影。用法将 ShadowView.swift 拖到你的项目中。ShadowView 是一个协议,定义了 3 个属性: var shadow: NSShadow{ get set } ..原创 2021-10-15 15:27:56 · 464 阅读 · 0 评论 -
ArcLayoutView: 一个弧形布局的实现
介绍如果在项目中,设计师让你实现这样的效果 :这会不会让你很抓狂呢? 别急,我们可以使用 ArcLayoutView用法其实就只有一个文件:ArcLayoutView.swift,把它放到你的项目中就好:)编译时可能会出现两个宏找不到,你可以在 ViewController.swift 中找到它们:let SCREEN_HEIGHT = UIScreen.main.bounds.heightlet SCREEN_WIDTH = UIScreen.main.bounds.width以及一个原创 2021-09-11 17:42:58 · 487 阅读 · 0 评论 -
最简单的 iPad 屏幕适配方案
通过修改 transform 实现的屏幕适配方案。这可能是最简单的 iPad 屏幕适配方案。只需在 viewDidLoad 方法设置 view.transform 即可:let SCREEN_WIDTH = UIScreen.main.bounds.size.widthlet SCREEN_HEIGHT = UIScreen.main.bounds.size.heightlet DESIGN_SCREEN_WIDTH = CGFloat(834)let DESIGN_SCREEN_HEIGHT原创 2021-07-14 12:55:37 · 3836 阅读 · 0 评论 -
一个 DesignablesAgent 错误的解决
在调试 custom view 时出现错误:Runtime: iOS 14.5 (18E182) - DeviceType: IBSimDeviceTypeiPad2x进入 ~/Library/Logs/DiagnosticReports 目录,查看 IBDesignablesAgent-iOS 开头的日志,发现:1 libswiftCore.dylib 0x0000000107576509 closure #1 in closure #1 in _assertionFa原创 2021-07-14 11:31:43 · 492 阅读 · 0 评论 -
常用 LLDB 命令
常用 LLDB 命令1、设置 lldb 语言上下文settings set target.language swift或者指定某句命令用 swift 语法:e -l Swift -- print($pin.alpha) 2、强制类型转换e let $in = unsafeBitCast(0x7df67c50, to: FromCurrencyInputView.self)3、use of undeclared identifier.需要导入 library:(lldb) expr @原创 2021-06-17 17:12:36 · 462 阅读 · 0 评论 -
关于iOS测试
关于测试如何 Update snapshot image如果修改了 UI,那么当你提 PR 时很可能 UITest 会测试失败,因为 UI 有了改变。你会看到测试代码在哪里失败,比如 OnboardLandingViewControllerTests 类的某 某方法等。找到这个类的 setUp 方法添加: recordMode = true然后运行 snapshot test,然后 snapshot test 会录制一张图片并打印出图片路径 (有 时候可能需要将这张图片复制一份到 cosmos原创 2021-06-17 17:07:21 · 420 阅读 · 1 评论 -
Swift 常见问题
Swift 常见问题比较对象地址可以用 Objectidentifier 结构来唯一标志一个对象:ObjectIdentifier(Person(name: "James")).uintValue) 通过比较 UnintValue 即可得知是否是同一对象。协议扩展protocol BannerViewProtocol: class {var bannerView: BannerView? { get set }var containerStackView: UIStackView { ge原创 2021-06-17 16:54:52 · 630 阅读 · 1 评论 -
你还在用 addSubviews 自定义 cell 吗?iOS 14 将不允许你这样做
iOS 14 强制要求程序员将自定义 cell 的 view 添加到 contentView 中,而不是 cell 中,否则你将会发现添加的这些 view 不能响应触摸事件。因为 iOS 14 在呈现 cell 时,将 contentView 的层级一下子提到了最上面,于是有一天测试会跑过来对你说:哥们,这里出现了一个 Bug …于是你检查代码根本不能发现什么问题,因为在 iOS 14 以下的模拟器上是正常的!只有 iOS 14 以上才会出现这个问题…那是因为你过去已经习惯了直接在 cell 上调用 ad原创 2021-03-31 14:33:57 · 466 阅读 · 0 评论 -
Swift Extension 实现前缀功能
为了避免命名冲突,在需要对系统类型进行扩展时,我们需要在扩展的方法前面添加一个前缀,类似“命名空间”的功能,比如:"ABC123456".abc.test()其中,test() 是我们为 String 扩展的方法,abc 就是一个前缀。怎么实现的呢?首先,我们需要定义一个结构体,用来定义这个“前缀”。一. 定义结构体struct Abc<Base> { var base: Base init(_ base: Base) { self.base = b原创 2020-07-29 18:10:37 · 1118 阅读 · 0 评论 -
非管理员权限安装Xcode10
如果是公司的 Mac, 这个Mac 是 Managed 的,往往会没有管理员密码。这种情况下虽然可以安装 Xcode10,但启动 Xcode10时会要求你安装 Xcode10但命令行工具,这时会要求输入管理员密码。而如果不安装命令行工具,Xcode就无法启动。这种情况下,需要使用以下步骤:安装 Xcode 10安装 Xcode 10 CLI ToolsXCSelect Xcode 10...原创 2020-03-17 16:41:11 · 997 阅读 · 0 评论 -
MVVM 的 BehaviorRelay 和 Driver
BehaviorRelay 实际上是 Variable 的替代。概念上和 Variable 并无区别。而 Variable 是对 BehaviorSubject的封装,因此它可以不停地监听值的变化并发送事件。此外 Variable 会将当前值缓存值它的 value 属性中,你可以用 .value 的方式读取 Variable 的当前值,通过 accept() 方法修改当前值。Driver 是一种...原创 2020-03-17 11:31:57 · 3638 阅读 · 0 评论 -
创建自动布局约束(代码方式)
两种主要的自动布局约束创建方式(代码创建):addConstraints() scrollView.addSubview(statusButton) scrollView.addConstraints([ statusButton.topAnchor.constraint(equalTo: scrollView.topAnchor, constant:12), ...原创 2020-03-17 10:28:56 · 1012 阅读 · 0 评论 -
Accessibility 通知
Accessibility提供了一系列的通知,可以完成一些特定的需求。比如:UIAccessibilityLayoutChangedNotification可以坚挺这个通知,以获取Voice Over功能的开/关。UIAccessibilityLayoutChangedNotification可以主动发送这个通知,将VoiceOver焦点移动到元素:UIAccessibility...原创 2020-03-16 11:53:23 · 1784 阅读 · 1 评论 -
3步实现iOS本地化(swift)
1. 导入 Localisation.swift 到项目文件github下载地址:https://github.com/kmyhy/Localisation/tree/master/LocalizedSwift2. 实现 LocalisationProtocol新建扩展,实现 LocalisationProtocol协议,比如:extension Localisation { st...原创 2020-02-22 12:30:16 · 937 阅读 · 0 评论 -
iOS 的 Accessibility
自定义 UIView 的 Accessibility ID自定义 UIView 的 subviews 的 Accessibility ID 默认是无效的。如果想让测试能够检索到 subviews 的 Accessibility ID,可以在 init 方法里: cancelButton.isAccessibilityElement = true textField.isA...原创 2020-02-13 17:36:08 · 2094 阅读 · 0 评论 -
iOS VIPER 架构解读
苹果官方推荐的 APP 架构是 MVC 架构,实际上它并不是传统的三层架构,而是两层架构,即整个 APP 由“模型”和“视图控制器”两层构成。因此视图控制器显得尤其重要,它的重要体现在两个方面:ViewController 是 iOS APP 中最重要的“基石”,没有 ViewController 就没有 APP——iOS 9 以后,要求 UIWindow 必须要有一个 rootViewCon...原创 2019-12-22 09:41:50 · 3066 阅读 · 0 评论 -
Swift UI(1)准备
Swift UI 需要什么Xcode 11 以上macOS Catalina 10.15Xcode 11 以上没有什么可说的,这是应有之意。macOS 15(Catalina) 就有点奇怪了,为什么呢?因为只有在 macOS 15 上,你才可以使用 Swift UI 的 Preview 预览功能。如果是 macOS 14,Xcode 的 Canvas 窗口会提示“SwiftUI prev...原创 2019-12-22 09:39:43 · 768 阅读 · 0 评论 -
SSL证书失效导致无法上传问题
一日在项目中调试后台的文件上传接口不成功,返回 Error Domain=NSURLErrorDomain Code=-999 “cancelled” UserInfo…… 错误。先以为是 mimeType 问题,尝试多次修改 mimeType 毫不奏效。后来想到会不会是后台使用的 SSL 证书问题?之所以这些想,是因为之前在 Postman 中调接口时发现,必须在设置中关闭 SSL 证书校验...原创 2019-12-22 09:37:00 · 1433 阅读 · 0 评论 -
MCCSframework 教程(七)子控制器嵌套
对于子控制器,我们并不陌生。在前面的教程中我们已经多次过它。今天,我们来详细介绍一下子控制器的嵌套,即子控制器嵌套子控制器。子控制器嵌套SubController 类有一个 children 属性:@property (strong, nonatomic) NSArray<SubController*>* children;它的类型也是 SubController,这意味着,...原创 2019-11-15 17:25:02 · 337 阅读 · 0 评论 -
新书推荐:iOS Swift 游戏开发指南
章节目录如下:第 1 章 游戏的设计 … 91.1 设计游戏引擎 …91.2 创建基于继承的设计…101.3 创建基于组件的设计…121.4 用 GameplayKit 创建基于组件的游戏设计 … 161.5 计算屏幕的帧刷新时间 …181.6 进入和退出游戏 …191.7 用定时器进行游戏的刷新…221.8 每帧刷新…231.9 游戏暂停…241.10 记录游戏时间 …25...原创 2019-11-06 13:56:14 · 1522 阅读 · 0 评论 -
MCCSframework 教程(六)图片上传
在上一篇教程中,我们介绍了如何用 MCCSframework 调用 iPhone 的相机和相册,接下来我们将继续上一篇教程的工作,介绍如何将用户选中的图片上传到后台。在 MCCSframework 中,上传不属于网络 API,而是封装成了单独的模块。图片的上传比较复杂,除了网络操作外,我们同样需要一些 UI 来展示用户上传成功了的图片,因此它也涉及了模型、cell 和子控制器。让我们首先从模型...原创 2019-11-03 22:21:22 · 550 阅读 · 0 评论 -
iOS 10 中时区问题导致 DateTools 框架 weekday 方法计算不正确
某日发现 DateTools 的 weekday 方法在不同 iOS 上计算出的结果不一样的问题。具体表现为:在 iOS 10 上计算出的结果比 iOS 12 上的结果少一天。比如同样是 2019-09-23,iOS 10 上计算结果为 1,而 iOS 12 上计算结果为 2。跟踪代码发现,weekday 方法中调用了 [self componentForDate:self type:DTDat...原创 2019-11-03 22:20:13 · 768 阅读 · 0 评论 -
MCCSframework 教程(五)相机和相册
在上一篇教程中,我们演示了在 MCCSframework 中,如何构建复杂表单。今天,我们介绍如何使用 MCCSframework 的组件实现手机相册的浏览、选择和拍照。我们会继续上一篇教程中未完成的工作,最终效果如下图所示:子控制器新建一个子控制器 PhotoPickSC。在 PhotoPickSC.h 中声明几个属性:@interface PhotoPickSC : SubContro...原创 2019-10-23 16:15:40 · 681 阅读 · 0 评论 -
MCCSframework 教程(四)表单
除了极少部分纯展现的 APP,大部分 APP 都需要通过表单向用户搜集数据。MCCSframework 的表单符合 “MCCS” 的理念。主控制器(C)将表单界面托管给子控制器(S),子控制器通过 Cell 展现表单控件。子控制器将表单控件和模型(M)进行绑定,完成对用户输入数据的搜集。接下来演示一个 APP 表单的例子。在这个例子中包含了键盘输入、日期选择、拍照/图片上传、下拉列表、true/...原创 2019-10-22 13:01:03 · 551 阅读 · 0 评论 -
MCCSframework教程(三): ScrollMenu
MCCSframework 除了提供 BaseVC、SubController、BaseController、NavBarVC 等核心类外,还提供了大量工具类、分类、宏和实用函数,在前面的教程中,我们已经使用过其中一些了。今天要介绍的是一个和 UI 相关的组件 ScrollMenu。ScrollMenu 有点像 TabBar,允许用户通过点击按钮在多个 ViewController 之间切换,并...原创 2019-10-15 16:36:41 · 547 阅读 · 0 评论 -
退出2层循环的n种方法
退出循环的n种方法,你能想出几种?1、增加变量,作为退出条件:2、使用goto语句: 3、使用return语句:4、嵌套if语句:5、使用子函数......原创 2010-07-14 10:20:00 · 5783 阅读 · 0 评论 -
使用UITableView实现树视图
本文的目的,是研究有没有可能在一个TableView中呈现树形数据,尤其是树形菜单。众多的网络资料都强调,Cocoa框架不支持树形视图,苹果推荐程序员使用TableViewController+NavigationController的方式展现树形菜单。如果2-3层的树形数据还可以忍受,万一层次稍多一点,必须反复的用导航按钮在视图中转来转去,显然并不太方便。何况笔者认为2-3层的导航也要切换多次视图,也是一种浪费。原创 2010-07-21 16:44:00 · 12792 阅读 · 18 评论