欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS中UITextField派生类实现placeholder动画显示效果

程序员文章站 2022-05-27 08:22:16
我们知道动画对于ui是怎么说都不为过,往往只需加一点点动画效果,那么一点点灵动轻巧的触动,用户感觉就会完全不一样。 这里我将向大家展示如何通过派生uitextfield类实现占位符动画显示效果。 这...

我们知道动画对于ui是怎么说都不为过,往往只需加一点点动画效果,那么一点点灵动轻巧的触动,用户感觉就会完全不一样。

这里我将向大家展示如何通过派生uitextfield类实现占位符动画显示效果。

这里有2个关键点:

1.怎么显示动画?
2.如何让占位符显示动画?

一.怎么显示动画?

我们不想闭门造车,只想草舟借箭 ;)

所以本猫决定采用ltmorphinglabel这个github上很棒的动画类来解决怎么显示动画这个问题。

至于ltmorphinglabel的动画效果及使用简介,大家可到我写的这篇博文中观赏:

swift借助cocoapods库实现ui功能上的串串烧

二.如何让占位符显示动画?

下一步就是如何让uitextfield的占位符显示动画?通过xcode的view继承体系查看,其实uitextfield的占位符也是uilabel。

我们只需要在找到它之后将其替换为ltmorphinglabel对象就可以了。

看似很简单,但要注意的是,需要将原来uilabel的属性复制过来,这样才能保证显示动画的同时外观不那么唐突。

首先我们先找到uitextfield的占位符对象:

if let placeholderlabel = self.value(forkey: "_placeholderlabel") as? uilabel{
 //todo:将placeholderlabel替换为ltmorphinglabel
}

然后新建一个ltmorphinglabel对象,复制placeholderlabel的属性:

let frame = placeholderlabel.frame
morphingplaceholderlabel = ltmorphinglabel(frame: frame)
morphingplaceholderlabel.text = placeholderlabel.text
morphingplaceholderlabel.backgroundcolor = placeholderlabel.backgroundcolor
morphingplaceholderlabel.font = placeholderlabel.font
morphingplaceholderlabel.textcolor = uicolor.lightgray
//设置动画类型
morphingplaceholderlabel.morphingeffect = .scale

将原来的label替换为morphingplaceholderlabel:

self.addsubview(morphingplaceholderlabel)
self.setvalue(morphingplaceholderlabel, forkey: "_placeholderlabel")

最后别忘了将原有的label删除:

placeholderlabel.removefromsuperview()

我们需要找到替换label的时机:

override public func layoutsubviews() {
 super.layoutsubviews()
 initplaceholderlable()
}

为了不造成多次重复替换,我们设置一个标志:

guard isplaceholderinited == false else {return}
isplaceholderinited = true

现在我们只需要在使用动画的地方创建我们的uitextfield派生类,就可以实现占位符显示动画的效果啦 ;)