自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(702)
  • 资源 (42)
  • 收藏
  • 关注

原创 iOS 信号量 DispatchSemaphore

规则是,每当你调用 DispatchSemaphore 的 signal 方法,这个数字+1,每当你调用 DispatchSemaphore 的 wait 方法,这个数字-1。这说明一旦 semaphore.signal() 执行,semaphore.wait() 会被立即被通知,只要信号量 >= 0 ,wait 后的代码立即被执行。这样,如果 signal() 的调用次数 >= wait() 的调用次数,则 print(“=== a car passed.”) 才会被执行,否则不会。

2023-06-02 13:55:32 873

原创 Swift Tips(3)

// key 属性定义了包装器的一个参数/// 构造器,属性包装器在修饰某个属性时将调用/// wrappedValue 是 @propertyWrapper 必须要实现的属性。get {T??set {wrappedValue 在这里引用为被修饰的属性,它所实现的 get/set 方法,将在其修饰的属性上生效。也就是说被修饰的属性自动实现了 wrappedValue 的 get/set 方法,从而减少了重复代码。

2023-05-09 16:37:36 641 1

原创 Swift Tips(2)

定义 outlet collection 时不能使用 weak:将 weak 删除即可。Editor->Debug Selected Views 进行调试。↩︎。

2023-04-04 10:58:53 599

原创 matchedGeometryEffect

iOS 14 中引入了 matchedGeometryEffect() 修饰符,允许视图进行变形动画。matchedGeometryEffect 确实很方便,然而只有 iOS 14 以上才支持。

2023-03-23 17:48:34 462 1

原创 Swift Tips(1)

Swift tips1. 为什么将 View 从别处粘贴进另一个View后无法添加约束

2023-03-01 15:21:27 438 1

原创 iOS 绿幕技术

绿幕(green screen)技术,又称 chroma key effect,实际上是将图片上指定颜色设置为透明的图形处理技术,这些透明区域也可以被任意背景图片替换。这种技术在 视频合成中被广泛使用。iOS 中,通过 CoreImage 的某些滤镜比如 CIBlendWithMask 可以实现这种效果,但是实现过程比较繁琐。

2023-02-23 16:28:03 659

原创 @ViewBuilder 在自定义 View 中的使用

我们无法在此时知道它的确切类型,因为它完全由调用者制定,可能是任意类型的 View,我们只知道它是一种 View,但无法具体知道是什么View,是一个 Text 还是 Image 还是多个 Text+Image 的组合。你可以看到,这个参数实际上是一个 block,它没有参数,但返回的类型为 T。有时候我们要求一个 View 要有比较高的灵活性,它的一部分视图的内容需要灵活指定。如你所见,content 的内容完全就如同你构建一个 SwiftUI View 的 body ,这给我们提供了相当大的灵活性。

2022-09-05 16:33:32 936

原创 如何对用户输入进行校验

对用户输入进行校验是非常重要,我们无法预知用户行为。当你要求用户输入信息时,用户很可能输入了不正确的格式,而一旦我们将这些错误格式的数据发送到API,往往会导致不可预期的后果,甚至程序崩溃。因此理论上只要是用户输入,我们都必须进行校验。但这不是一件简单的工作。我们不仅仅需要考虑正则校验,同时需要遵循响应式原则,尽早在用户输入的过程中发现一切错误,越早越好。仅仅在用户输入完成后才进行正则校验,不是一种良好体验。接下来,我们演示这将如何实现。...

2022-08-01 16:16:44 2311

原创 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 738

原创 SwiftUI一日速成

SwiftUI 博大精深,当然不可能一天就学会它。但对于拥有 UIKit 基础的工程师来说,一天时间却足够让你上手一个 SwiftUI 项目了。本文适用于拥有 UIKit 开发经验的 SwiftUI 初学者。看完本文可能需要你一天的时间,但却可能让你拥有初步使用 SwiftUI 的能力。...

2022-07-12 11:42:57 6478 1

原创 【深入kotlin】 - 与Java互操作:java调用kotlin

Kotlin 类的一个属性编译后,会产生 3 种 Java 对象:如果 kotlin 属性名为 is 开头(Bool 类型),get 方法名 = 属性名,set 方法名则是将 is 替换为 set,字段名=属性名。当对 kotlin 属性使用该注解修饰后,这个属性就变成一个实例变量(public),kotlin 编译器不会生成 get/set 方法。在 java 中直接通过字段名进行访问。Kotlin 顶层对象会编译成静态成员、静态方法。类名是文件名+Kt。...

2022-07-12 11:24:13 4539

原创 【深入kotlin】 - 与Java互操作:kotlin调用java

比如如下 Java 类:在 kotlin 中调用 Person:平台类型在 kotlin 中为了解决 Java 中所有引用类都是可空类型的问题,将所有来自于 java 的类型称为平台类型(platform types)。对这种类型kotlin 不再执行严格的非空检查。数组数组在 kotlin 中是,即不支持协变/逆变(out/in)。但 java 不同:Kotlin 中的数组更加安全,它不允许协变/逆变,你无法将一个 Array 赋给 Array(编译不通过)。数组参数也是如此。Java 中,允

2022-07-12 11:22:49 2196 1

原创 【深入kotlin】 - Flow 进阶

Flow 的收集动作总是发生在调用协程的上下文当中,而非定义 Flow 的上下文。运行输出结果如下(打开 debug 参数):可以看出 flow 运行于 collect 调用时的协程,即 runBlocking 开启的协程。这无疑会阻塞住主线程。因此我们可以将 flow 运行在其它上下文:程序报出如下异常:大意是收集线程发生在主线程,但 emit 线程发生在后台线程。withContext(Dispatchers.Default) 一句修改了 flow 的上下文,将 flow 的分发器修改到了 D

2022-06-06 15:47:36 1246 1

原创 【深入kotlin】 - 初识 Flow

ThreadLocal 是 Java 中线程间数据访问冲突中的一种解决方式,常用于取代锁。其会将线程间共享的数据复制为多份(每个线程的 ThreadLocal 数据维护在一张 map 表中,其中的 key 就是每个线程对象。这张 map 中,key 是 ThreadLocal 自己,value 是复制后的数据)。这样,每个线程操作一份数据,从而解决访问冲突。但在协程环境中,这个问题变得复杂。因为协程并没有和线程绑定,一个协程在执行过程中是可以切换线程的(例如之前 Dispatchers.Unconfined

2022-06-06 15:10:50 445

原创 创建酷炫的 CollectionViewCell 转换动画

新建 iOS App 项目,打开 Main.storyboad,拖入一个 CollectionView,为其创建布局约束如下:为 CollectionView 创建一个 IBOutlet 连接:新建 swift 文件,充当我们的 model ,这就是我们要渲染在 cell 上的数据:新建 UICollectionViewCell 子类 SalonSelectorCollectionViewCell。打开 SalonSelectorCollectionViewCell.xib,创建如下 UI :Salon

2022-06-06 15:02:19 1058

原创 SwiftUI: Navigation all know

In normal UIKit, we use UINavigationController to make the navigaion within App. But in SwiftUI, we can’t make good use of UINavigationController anyway.Actually, SwiftUI has a totally different navigation system which include NavigationView - just like

2022-06-06 14:52:01 507

原创 如何在同一串文字中凸现富文本-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 601

原创 【深入kotlin】 - 协程上下文、Job和CoroutineScope

协程调试打印协程名首先看这段代码:private fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")fun main() = runBlocking<Unit> { val a = async { log("a") 10 } val b = async { log("b") 20 } log(" a*b = ${a.awiat()*b.awai

2022-05-02 21:11:19 1183

原创 【深入kotlin】 - 协程的取消

取消fun main() = runBlocking{ val job = GlobalScope.launch { repeat(200){ println(it) delay(500) } } delay(1000) println("to cancel the job.") job.cancel() // 取消job job.join() // 必须 join。此句作用是挂起协程,直至 job 完成才会真正取消 job printl

2022-05-02 21:08:11 1238

原创 【深入kotlin】 - 协程

协程是轻量级的fun main() = runBlocking{ repeat(100){ // 2 launch() { delay(1000) println("A") } } println("------end --------") // 1}首先打印 end 一行,因为前面启动的 launch 都是延迟执行的。repeat 函数重复调用语句块指定次数(100次)。用于每次都是启动另外的协程,这些协程都会延迟 1 秒打印,所以 1 秒后,100 个 A 基本上同

2022-05-02 21:06:56 878

原创 【深入kotlin】 - 创建协程

创建协程的方式主要有:launch()、async()、coroutineScope()、runBlocking() 。launch()创建一个异步协程(非阻塞),返回一个不带返回值的 job。fun main(){ GlobalScope.launch{// 默认 CorutineDispatcher 为 Dispatchers.Default delay(1000) // 仅可用于协程,而非线程 println("Halloween Special") // 1 } println

2022-04-02 13:41:13 2491

原创 【深入kotlin】- 协程

协程是一个类似于线程的概念,但也不完全相同,它是一种轻量级的线程,它比线程的概念更小,功能更加强大,方便我们以顺序执行的方式进行异步编程。一个线程可以拥有若干个协程,协程可以进行执行、挂起、延迟等操作。通过协程,我们可以获得比线程更大的控制权,却只需付出更低的代价。CoroutineScopeCoroutineScope 接口代表了协程的概念。GlobalScope 是其中一个实现。CoroutineScope 只有一个属性 coroutineContext,表示协程上下文。协程上下文/协程分发器C

2022-04-02 13:33:51 1782

原创 【深入kotlin】 - 反射的应用

到目前为止,我们都是通过反射获取类的信息,接下来我们能利用这些反射信息干什么呢?调用成员函数class MyClass { fun printSomething(name: String){ println("something: $name") } fun printNothing() { println("nothing") }}fun main(args:Array<string>) { val kc = MyClass:class val myClass

2022-04-02 13:32:09 1712

原创 用 SwiftUI ViewModifier 自定义弹窗

SwiftUI 以 ViewModifier方式提供了方式多样的呈现视图方式(弹窗),比如 contextMenu、alert、actionSheet。相比较 UIKit 的弹窗,这些 ViewModifier 无疑能大大简化我们代码。但无一例外,这些 ViewModifier 只提供了很少的定制化选项。比如 Alert,你不能改变 Title 的样式、字体、颜色,也不能在上面放一个 TextField 或者 Image,甚至自定义呈现动画。既然系统提供的 ViewModifier 不能满足需要,那么我

2022-04-02 13:23:12 2825

原创 Swift 自定义 Loading 按钮 ContentButton

git 仓库地址:https://gitee.com/kmyhy/content-buttonApp 中经常会用到这样的按钮,当你点击它,它会显示一个 loading 图标并不停地转圈(小菊花),表示它正在异步加载某些数据,当加载完成,按钮才恢复原样:这正是 ContentButton 能为你做的。它的使用非常简单,直接将源文件放到你的项目中即可:ContentButton.swiftContentButton 还用到了一个 UIColor 的扩展函数 init(hexString: ),定

2022-02-23 19:22:40 2157

原创 【深入kotlin】 - KClass 特性深入研究

KClass 特性深入研究kotlin 反射 vs. Java 反射其实可以通过 KClass 获取属性的 java 特性,比如获得 get/set 方法和 field 的引用:class T(val x:Int)fun main(args: Array<String>) { println(T::x) // 打印:val com.kotlin.T.x: kotlin.Int println(T::x.javaGetter) // 打印:public final int com.

2022-02-23 19:19:27 702

原创 【深入kotlin】 - 方法引用和属性引用

反射kotlin 通过 kotlin-reflect.jar 提供对反射的支持。KClass通过类引用 KClassKClass 引用了 kotlin 类(具有内省能力)。类似于 Java 的 class 。要获取一个类的 KClass,通过类型名::class获得,而对应的 Java class 则通过类型名::class.java获得:fun main(args: Array<String>) { val c= String::class // 获取 KClass printl

2022-02-23 19:17:44 2176

原创 【深入kotlin】 - 匿名函数、闭包和接收者

匿名函数匿名函数没有名字,它很大程度上和 lambda 表达式类似,它的函数体既可以是语句块,又可以是表达式。同时,匿名函数的参数类型可以推断而不用指定,这点跟普通的函数不同。此外,匿名函数只能定义在函数体内。fun main(args:Array<String>){ fun(x:Int y:Int) = x+y // 1 val arr = arrayOf("hello","world","!") arr.filter(fun(item): Boolean = item.lengt

2022-02-23 19:14:47 1756

原创 【深入kotlin】 - lambda 表达式和高阶函数

函数式编程函数不依赖于任何类存在(从源代码级别上,从字节码层级,它仍然会依赖于类存在)。典型的如顶层函数。lambda 表达式lambda 表达式和 java 相同,它由被“箭头”符号(->)分隔的两个部分组成。箭头左边是括号包裹的参数列表(如果只有一个参数,括号可以省略),箭头右边是返回值类型:// 定义 lambda 表达式的类型(a: Int, b: Int) -> Int// 定义 lambda 表达式实例{ a,b -> a+b } // 花括号包裹,不能省略//

2022-01-16 17:14:41 1841

原创 【深入kotlin】 - 委托

委托委托不是 java 中的概念。它仅仅是一种设计模式,但是 kotlin 从语言层级上,通过 by 关键字提供了对委托模式的支持。类委托interface MyInteface { // 1 fun myPrint()}class MyInterfaceImpl(val name: String):MyInterface { //2 override fun myPring() { println(name) }}class MyClass(myInterface:MyInterf

2022-01-16 17:12:35 1881

原创 【深入kotlin】 - 枚举和注解

枚举所谓枚举,就是实例个数有限的类。定义enum class Season { SPRING, SUMMER, AUTUMN, WINTER}既然是class,当然也可以有主构造器,通过主构造器为所有实例的 temperature 赋予不同的初始值:enum class Season2(val temperature: Int) { SPRING(10), SUMMER(30),AUTUMN(30),WINTER(0)}当然也可以声明方法,而且可以在实例中重写方法:enum cl

2022-01-16 17:11:37 2371

原创 【深入kotlin】 - 嵌套类和内部类

嵌套类和内部类嵌套类kotlin 中,嵌套类和内部类是两种不同的类。所谓嵌套类是指定义在类体内的类。class OuterClass { private val name: String = "Anna" class NestedClass { fun nestedMethod() = "Attila" }}fun main(args: Array<String>){ println(OuterClass.NestedClass().nestedMethod()) //

2022-01-16 17:10:01 2294

原创 【深入kotlin】 - 范型

范型定义class A<T>(t:T){ var a: T init { this.a = t }}......var aa = A("kotlin")println(aa.a) // 打印 kotlin其中 A<String>("kotlin")可以根据类型推断简写写成 A("kotlin")。协变、逆变所谓协变、逆变是指一个对象被意外地降级为子类/升级为父类。特别是集合操作中,很容易出现此类问题。在 Java 中,List<String&gt

2021-12-09 16:08:33 835

原创 【深入kotlin】-数据类和密封类

kotlin

2021-12-09 15:54:18 2262

原创 【深入kotlin】- 伴生对象和扩展

kotlin

2021-12-09 15:49:36 2148

原创 【深入kotlin】- 接口和抽象类

kotlin

2021-12-09 15:46:41 2003

原创 【深入kotlin】- 类

类Kotlin 中定义类有些地方不同于 java。不需要 public一个类默认就是 public 的,所以不用显示地声明一个类为 public。不需要花括号如果一个类是空实现,可以不需要 {}class MyClass主构造方法Kotlin 规定每个类允许有一个主构造方法和多个次要构造方法。主构造方法是类名的一部分主构造方法定义类名之后,用 constructor 关键字声明:class MyClass contructor(username: String){ ...}这

2021-11-26 18:37:19 2415

原创 【深入kotlin】- 基础语法(三)

原义字符串同 swift 一样,kotlin 通过三引号"""支持原义符串,在原义字符串中,所有字符都按原样输出(包括换行),不需要进行转义。异常try/catch跟 java 不同,kotlin 中的 try 是个表达式而非语句,其返回值是 try / catch 块中的最后一个表达式。finally 块不返回。val s = "100"val result: Int? = try { parseInt(s)}catch(ex: NumberFormatException) { nu

2021-11-26 18:35:17 1574

原创 【深入kotlin】 - 基础语法(二)

Import同 Java 一样,位于同一包内的 class 不需要 import,否则需要 import。但可以指定别名:import com.example.xxx as zzz将 xxx 导入,并重命名为 zzz。判断if 比 swift 中有所扩展。比较特别的地方是支持三目运算(swift 中时 ? : 三目运算符):a = if(c==b) c else b甚至可以使用多行语句,最后一句的表达式自动返回(不需要 return):str = if(a<0) { printl

2021-11-26 18:33:15 1857

原创 【深入kotlin】 - 基础语法(一)

变量常量变量和 swift 一样,用 var 声明:var str:String = "hello"kotlin 同样支持类型推断,可以根据变量初始化值推断变量类型。因此上句可以写成:var str = "hello"常量和 swift 不同,用 val 而不是 let 声明:val a = 10这种常量值 kotlin 中叫做“不可变量”,表示该常量不可改变(除了声明的时候可以赋值)。此外还有一种常量,用 const val,二者的区别在于:const val 默认是 publi

2021-11-26 18:31:56 485

实现 CheckButton:超简易教程

《实现 CheckButton:超简易教程》一文源代码

2013-06-25

MailCore示例

mailCore 专栏中示例项目源代码

2013-05-07

返回按钮定制方法

如果你想在导航栏/工具栏定制一个带左箭头的Bar Button Item,那么有三种可能的方法:

2012-12-18

Method Swizzling示例

Method Swizzling 示例

2012-12-14

CorePlot1.0饼图demo

CorePlot 1.0 饼图 demo

2012-11-02

DispatchSourceTest.zip

<NSThread 、NSRunLoop 和 Dispatch Queue> 一文示例源代码

2012-07-13

RunLoop示例

《NSThread 、NSRunLoop 和 Dispatch Queue》一文示例源代码

2012-07-13

HttpsDemo Code

NSURLConnection self-sign certification HTTPS

2012-07-10

AChartEngine 折线图和EmbeddedChart示例

AChartEngine 折线图和EmbeddedChart示例

2012-07-04

Learn_iPhone_and_iPad_Cocos2D_Game_Development一书源代码

2D_Game_Development一书源代码

2012-06-29

GlyphDemo工程源代码

在应用程序中使用自定义字体文件 演示了CGContextShowGlyphsAtPoint的使用。

2012-06-07

checkbutton源代码

iPhone下实现的CheckButton按钮

2012-05-12

SplitVCDemo.zip

《iPad开发:UISplitViewController应用 》一文示例代码

2012-03-22

ASIHTTPRequestTest.zip

"ASIHTTPRequest和libxml结合,实现边请求边解析 "一文源代码

2012-03-11

《结合UImageView实现图片移动和缩放》Demo

示例MoveScaleImageView的使用

2012-02-28

KeyboardUtil

iPhone的软键盘为216像素高,程序员不得不在软键盘弹出时想办法调整窗口视图,避免输入控件被弹出的软键盘所遮挡。KeyBoardUtil进行了一些封装,便于程序员使用。

2011-12-06

《使用UITableView实现树视图》一文源代码

TreeView for iPhone,《使用UITableView实现树视图》一文源代码

2011-07-20

MoveScaleImageView

《结合UIImageView实现图片的移动和缩放 》一文源代码

2011-07-12

封装好的分组折叠表格

封装好的分组折叠表格,欢迎大家使用。无聊

2011-06-21

ext2.0网格实践源码

ext网格实践一文中,eclipse工程源码,具体请参考博文

2010-02-22

Flex和jsp整合实践

《Flex和jsp整合实践》一文中的源代码,纯原创。

2010-01-26

一步一步学grails(14)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(13)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(12)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(11)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(10)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(9)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(8)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(7)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(6)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(5)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(4)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(3)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(2)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

一步一步学grails(1)

去年早些时候写的一个项目驱动的grails入门教程。绝对原创。

2010-01-21

treepanel实例

里面已经包含了教程、示例代码、要用到的js脚本库和jar包,你随便改改就可以用在自己的项目里

2009-12-04

中国电信IsmpSp接口开发

中国电信ismp接口是一个基于SOAP1.1的SOA应用,它提供的wsdl文件在axis2中(SOAP1.2)能够得到足够的支持吗?

2009-08-24

Grails入门教程(二)

一、建立域关系 二、理解脚手架代码 ……

2009-08-24

使用axis2开发IsmpSp接口

中国电信Ismp接口改造的具体的开发过程:

2009-08-24

Grails入门教程(一)

原创的grails教程,所有代码都自己跑过了

2009-05-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除