在Swift中实现UILabel动画效果的最佳方法?

2024-03-14

我对 Swift 动画还很陌生,并且知道如何去做,但想看看其他人会如何做 -

我正在尝试创建这样的效果:当用户进入搜索栏时,搜索栏的占位符文本会缩小并向上移动到搜索字段上方,并更改为不同的颜色。像这样:

http://magicus.xyz http://magicus.xyz当您点击用户名时。

如果我在搜索栏上放置一个 uilabel 并在输入搜索器时缩放此标签,我不确定输入搜索栏是否会注册,因为 uilabel 将位于其上方。

我通常会尝试复制这些文本字段。我将如何创作这个动画?或者甚至为我的搜索栏添加底部边框?

Bridger:

//
//  Makestagram-Bridging-Header.h
//  round
//
//  Created by Skylar Thomas on 6/24/16.
//  Copyright © 2016 Make School. All rights reserved.
//

#ifndef Makestagram_Bridging_Header_h
#define Makestagram_Bridging_Header_h

#import "PureLayout.h"

#endif /* Makestagram_Bridging_Header_h */

ERROR:

我的项目:


这是一个很好的项目的来源,它完全实现了您的搜索:

    public enum EGFloatingTextFieldValidationType {
        case Email
        case Number
    }

    public class EGFloatingTextField: UITextField {


        private typealias EGFloatingTextFieldValidationBlock = ((text:String,inout message:String)-> Bool)!

        public var validationType : EGFloatingTextFieldValidationType!


        private var emailValidationBlock  : EGFloatingTextFieldValidationBlock
        private var numberValidationBlock : EGFloatingTextFieldValidationBlock


        let kDefaultInactiveColor = UIColor(white: CGFloat(0), alpha: CGFloat(0.54))
        let kDefaultActiveColor = UIColor.blueColor()
        let kDefaultErrorColor = UIColor.redColor()
        let kDefaultLineHeight = CGFloat(22)
        let kDefaultLabelTextColor = UIColor(white: CGFloat(0), alpha: CGFloat(0.54))


        public var floatingLabel : Bool!
        var label : UILabel!
        var labelFont : UIFont!
        var labelTextColor : UIColor!
        var activeBorder : UIView!
        var floating : Bool!
        var active : Bool!
        var hasError : Bool!
        var errorMessage : String!



        required public init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            self.commonInit()
        }


        override public init(frame: CGRect) {
            super.init(frame: frame)
            self.commonInit()
        }

        func commonInit(){

            self.emailValidationBlock = ({(text:String, inout message: String) -> Bool in
                var emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}"

                var emailTest = NSPredicate(format:"SELF MATCHES %@" , emailRegex)

                var  isValid = emailTest.evaluateWithObject(text)
                if !isValid {
                    message = "Invalid Email Address"
                }
                return isValid;
            })
            self.numberValidationBlock = ({(text:String,inout message: String) -> Bool in
                var numRegex = "[0-9.+-]+";
                var numTest = NSPredicate(format:"SELF MATCHES %@" , numRegex)

                var isValid =  numTest.evaluateWithObject(text)
                if !isValid {
                    message = "Invalid Number"
                }
                return isValid;

            })
            self.floating = false
            self.hasError = false

            self.labelTextColor = kDefaultLabelTextColor
            self.label = UILabel(frame: CGRectZero)
            self.label.font = self.labelFont
            self.label.textColor = self.labelTextColor
            self.label.textAlignment = NSTextAlignment.Left
            self.label.numberOfLines = 1
            self.label.layer.masksToBounds = false
            self.addSubview(self.label)


            self.activeBorder = UIView(frame: CGRectZero)
            self.activeBorder.backgroundColor = kDefaultActiveColor
            self.activeBorder.layer.opacity = 0
            self.addSubview(self.activeBorder)

            self.label.autoAlignAxis(ALAxis.Horizontal, toSameAxisOfView: self)
            self.label.autoPinEdge(ALEdge.Left, toEdge: ALEdge.Left, ofView: self)
            self.label.autoMatchDimension(ALDimension.Width, toDimension: ALDimension.Width, ofView: self)
            self.label.autoMatchDimension(ALDimension.Height, toDimension: ALDimension.Height, ofView: self)

            self.activeBorder.autoPinEdge(ALEdge.Bottom, toEdge: ALEdge.Bottom, ofView: self)
            self.activeBorder.autoPinEdge(ALEdge.Left, toEdge: ALEdge.Left, ofView: self)
            self.activeBorder.autoPinEdge(ALEdge.Right, toEdge: ALEdge.Right, ofView: self)
            self.activeBorder.autoSetDimension(ALDimension.Height, toSize: 2)

            NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("textDidChange:"), name: "UITextFieldTextDidChangeNotification", object: self)
        }
        public func setPlaceHolder(placeholder:String){
            self.label.text = placeholder
        }

        override public func becomeFirstResponder() -> Bool {

            var flag:Bool = super.becomeFirstResponder()

            if flag {

                if self.floatingLabel! {

                    if !self.floating! || self.text!.isEmpty {
                        self.floatLabelToTop()
                        self.floating = true
                    }
                } else {
                    self.label.textColor = kDefaultActiveColor
                    self.label.layer.opacity = 0
                }
                self.showActiveBorder()
            }

            self.active=flag
            return flag
        }
        override public func resignFirstResponder() -> Bool {

            var flag:Bool = super.becomeFirstResponder()

            if flag {

                if self.floatingLabel! {

                    if self.floating! && self.text!.isEmpty {
                        self.animateLabelBack()
                        self.floating = false
                    }
                } else {
                    if self.text!.isEmpty {
                        self.label.layer.opacity = 1
                    }
                }
                self.label.textColor = kDefaultInactiveColor
                self.showInactiveBorder()
                self.validate()
            }
            self.active = flag
            return flag

        }

        override public func drawRect(rect: CGRect){
            super.drawRect(rect)

            var borderColor = self.hasError! ? kDefaultErrorColor : kDefaultInactiveColor

            var textRect = self.textRectForBounds(rect)
            var context = UIGraphicsGetCurrentContext()
            var borderlines : [CGPoint] = [CGPointMake(0, CGRectGetHeight(textRect) - 1),
                CGPointMake(CGRectGetWidth(textRect), CGRectGetHeight(textRect) - 1)]

            if  self.enabled  {

                CGContextBeginPath(context);
                CGContextAddLines(context, borderlines, 2);
                CGContextSetLineWidth(context, 1.0);
                CGContextSetStrokeColorWithColor(context, borderColor.CGColor);
                CGContextStrokePath(context);

            } else {

                CGContextBeginPath(context);
                CGContextAddLines(context, borderlines, 2);
                CGContextSetLineWidth(context, 1.0);
                var  dashPattern : [CGFloat]  = [2, 4]
                CGContextSetLineDash(context, 0, dashPattern, 2);
                CGContextSetStrokeColorWithColor(context, borderColor.CGColor);
                CGContextStrokePath(context);

            }
        }

        func textDidChange(notif: NSNotification){
            self.validate()
        }

        func floatLabelToTop() {

            CATransaction.begin()
            CATransaction.setCompletionBlock { () -> Void in
                self.label.textColor = self.kDefaultActiveColor
            }

            var anim2 = CABasicAnimation(keyPath: "transform")
            var fromTransform = CATransform3DMakeScale(CGFloat(1.0), CGFloat(1.0), CGFloat(1))
            var toTransform = CATransform3DMakeScale(CGFloat(0.5), CGFloat(0.5), CGFloat(1))
            toTransform = CATransform3DTranslate(toTransform, -CGRectGetWidth(self.label.frame)/2, -CGRectGetHeight(self.label.frame), 0)
            anim2.fromValue = NSValue(CATransform3D: fromTransform)
            anim2.toValue = NSValue(CATransform3D: toTransform)
            anim2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
            var animGroup = CAAnimationGroup()
            animGroup.animations = [anim2]
            animGroup.duration = 0.3
            animGroup.fillMode = kCAFillModeForwards;
            animGroup.removedOnCompletion = false;
            self.label.layer.addAnimation(animGroup, forKey: "_floatingLabel")
            self.clipsToBounds = false
            CATransaction.commit()
        }
        func showActiveBorder() {

            self.activeBorder.layer.transform = CATransform3DMakeScale(CGFloat(0.01), CGFloat(1.0), 1)
            self.activeBorder.layer.opacity = 1
            CATransaction.begin()
            self.activeBorder.layer.transform = CATransform3DMakeScale(CGFloat(0.01), CGFloat(1.0), 1)
            var anim2 = CABasicAnimation(keyPath: "transform")
            var fromTransform = CATransform3DMakeScale(CGFloat(0.01), CGFloat(1.0), 1)
            var toTransform = CATransform3DMakeScale(CGFloat(1.0), CGFloat(1.0), 1)
            anim2.fromValue = NSValue(CATransform3D: fromTransform)
            anim2.toValue = NSValue(CATransform3D: toTransform)
            anim2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
            anim2.fillMode = kCAFillModeForwards
            anim2.removedOnCompletion = false
            self.activeBorder.layer.addAnimation(anim2, forKey: "_activeBorder")
            CATransaction.commit()
        }

        func animateLabelBack() {
            CATransaction.begin()
            CATransaction.setCompletionBlock { () -> Void in
                self.label.textColor = self.kDefaultInactiveColor
            }

            var anim2 = CABasicAnimation(keyPath: "transform")
            var fromTransform = CATransform3DMakeScale(0.5, 0.5, 1)
            fromTransform = CATransform3DTranslate(fromTransform, -CGRectGetWidth(self.label.frame)/2, -CGRectGetHeight(self.label.frame), 0);
            var toTransform = CATransform3DMakeScale(1.0, 1.0, 1)
            anim2.fromValue = NSValue(CATransform3D: fromTransform)
            anim2.toValue = NSValue(CATransform3D: toTransform)
            anim2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)

            var animGroup = CAAnimationGroup()
            animGroup.animations = [anim2]
            animGroup.duration = 0.3
            animGroup.fillMode = kCAFillModeForwards;
            animGroup.removedOnCompletion = false;

            self.label.layer.addAnimation(animGroup, forKey: "_animateLabelBack")
            CATransaction.commit()
        }
        func showInactiveBorder() {

            CATransaction.begin()
            CATransaction.setCompletionBlock { () -> Void in
                self.activeBorder.layer.opacity = 0
            }
            var anim2 = CABasicAnimation(keyPath: "transform")
            var fromTransform = CATransform3DMakeScale(1.0, 1.0, 1)
            var toTransform = CATransform3DMakeScale(0.01, 1.0, 1)
            anim2.fromValue = NSValue(CATransform3D: fromTransform)
            anim2.toValue = NSValue(CATransform3D: toTransform)
            anim2.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
            anim2.fillMode = kCAFillModeForwards
            anim2.removedOnCompletion = false
            self.activeBorder.layer.addAnimation(anim2, forKey: "_activeBorder")
            CATransaction.commit()
        }

        func performValidation(isValid:Bool,message:String){
            if !isValid {
                self.hasError = true
                self.errorMessage = message
                self.labelTextColor = kDefaultErrorColor
                self.activeBorder.backgroundColor = kDefaultErrorColor
                self.setNeedsDisplay()
            } else {
                self.hasError = false
                self.errorMessage = nil
                self.labelTextColor = kDefaultActiveColor
                self.activeBorder.backgroundColor = kDefaultActiveColor
                self.setNeedsDisplay()
            }
        }

        func validate(){

            if self.validationType != nil {
                var message : String = ""

                if self.validationType! == .Email {

                    var isValid = self.emailValidationBlock(text: self.text, message: &message)

                    performValidation(isValid,message: message)

                } else {
                    var isValid = self.numberValidationBlock(text: self.text, message: &message)

                    performValidation(isValid,message: message)
                }
            }
        }


    }

    extension EGFloatingTextField {

    }

他的名字是EGFloatingTextField你可以找到更多详细信息here https://github.com/enisgayretli/EGFloatingTextField

Usage:

let emailLabel = EGFloatingTextField(frame: CGRectMake(8, 64, CGRectGetWidth(self.view.bounds) - 16, 48))
emailLabel.floatingLabel = true
emailLabel.setPlaceHolder("Email")
emailLabel.validationType = .Email
emailLabel.keyboardType = .EmailAddress
self.view.addSubview(emailLabel)

附:你需要导入PureLayout图书馆,here https://github.com/PureLayout/PureLayout您可以找到完整的源代码和如何导入它的说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Swift中实现UILabel动画效果的最佳方法? 的相关文章

  • 无法将类型“X”的值转换为预期参数类型“X”

    Xcode 8 和 Swift 3 今天让我非常难过 请看一下并告诉我您是否遇到过类似的问题以及是否可以解决它 我一直在尝试不同的解决方案 其中 Cmd Shift K Cmd Shift Option K 删除派生数据 更改使用的结构 它
  • 获取保存到照片库的图像的 PHAsset/localIdentifier

    我在用着UIImageWriteToSavedPhotosAlbum https www hackingwithswift com example code media uiimagewritetosavedphotosalbum how
  • 设备锁定时扫描外围设备

    我的中央管理器可以在前台和后台检测新的外围设备 我知道这一点是因为当它发现新的外围设备时我会触发 UNNotification 但是 当设备锁定时 它似乎不会继续扫描新的外围设备 在我的能力范围内 我启用了使用 LE 配件的后台模式以及远程
  • Phonegap Cordova Statusbar 插件创建双栏

    我正在开发一个使用phonegap 的应用程序 通过 CLI 构建 而不是 PhoneGap 构建 我的 cordova plugin statusbar 插件有问题 打开时它将增加额外的条高度 这是它的样子 双高菜单栏 我通过两种方式实现
  • IOS:init(CGImage) 的使用不明确

    我正在尝试转换CGImage into a CIImage 但是 它不起作用 这行代码 let personciImage CIImage CGImage imageView image CGImage 抛出以下错误 init CGImag
  • Objective C 中最好的多线程方法?

    我正在开发一个 iPad 应用程序 目前正在努力寻找多线程的最佳方法 让我用一个简化的例子来说明这一点 我有一个包含 2 个子视图的视图 一个目录选择器和一个包含所选目录中所有图像缩略图的图库 由于 下载 和生成这些缩略图可能需要相当长的时
  • GMSMarker 不透明度动画不重复

    我正在尝试使带有自定义图标的 GMSMarker 以衰减的动画不透明度闪烁 动画应该重复几次 但事实并非如此 它只执行一次转换 然后就停止了 这种情况仅在对不透明度属性进行动画处理时发生 在对其他属性进行动画处理时效果很好 这是代码 GMS
  • 如何为自定义手势识别器实现velocityInView:?

    我正在实施一个自定义UIGestureRecognizer子类 我想实施velocityInView 同样的方式UIPanGestureRecognizer已经做到了 但我不确定如何去做 如何计算以点 秒为单位的速度 Firstly 如果您
  • iOS SecKeyRef(公钥)将其发送到服务器[重复]

    这个问题在这里已经有答案了 现在我的公钥有问题 我使用 SecKeyGeneratePair 来生成公钥和私钥 现在我必须将我的公钥发送到服务器 我使用下面的方法将 SecKeyRef 转换为 NSData 我总是得到相同的公钥 不过我将其
  • 正常运行时间 iOS Objective-C - 毫秒精度

    我正在努力争取 iOS 的正常运行时间 我正在使用 mach absolute time 但我发现它在睡眠期间暂停 我找到了这个片段 time t uptime struct timeval boottime int mib 2 CTL K
  • 如何分发我的应用程序的多个版本?

    我想分发我的应用程序的两个版本 稳定分支以及当前的开发主干 使用试飞 http testflightapp com 而且 如果可能的话 我只想邀请测试人员一次 我可以在一个 TestFlight 团队中拥有一个应用程序的两个版本吗 或者也许
  • 如何将 NSDictionary 转换为 NSData,反之亦然?

    我正在发送NSString and UIImage使用蓝牙 我决定将两者都存储在NSDictionary然后将字典转换为NSData 我的问题是如何转换NSDictionary to NSData反之亦然 NSDictionary gt N
  • Mobile Safari 中的 React PWA 图像上传会破坏应用程序吗?

    我们很惊讶在网上没有发现任何提及此问题的信息 因此我们在此发帖希望能找到解决方案 当我们在使用 iPhone 进行移动 Safari 浏览时遇到此问题 运行下面 2 个易于遵循的测试 一个有效 一个无效 链接在这里https pwa rea
  • 如何强制重装iOS模拟器?

    我想下载模拟器组件 Xcode 6 2 但在下载过程中我的互联网连接丢失了 Xcode 仍然显示我已经安装了 7 1 模拟器 你知道如何强制重装iOS模拟器吗 我已完成以下步骤 从 Library Caches com apple dt X
  • NSExceptionDomains xcode 8 不工作

    我正在使用 UIWebView 来显示电子邮件订阅注册页面 它不是 https 页面 所以我显然需要破例 我不想将其设置为 NSAllowsArbitraryLoads 因为它只是整个应用程序中的一页 应用程序可能会被拒绝 所以我在 inf
  • Mac 上的 iOS 7 模拟器无法使用自定义位置(也不请求许可)

    我正在尝试制作一个使用设备当前位置的 iOS7 应用程序 我在 Mac 上使用 iPhone 模拟器 但遇到了一些问题 每次出现位置管理器所在的视图时 即使在我设置了自定义位置 从模拟器 gt 调试 gt 位置 之后 它也会打印出纬度和经度
  • iOS 11.x 系统颜色

    我读过很多关于如何自定义视图颜色的文章 但没有任何关于检索标准控件 如 iOS 11 x 或以前版本中的导航栏 状态栏和选项卡栏 的系统颜色的文章 UIColor 类有 3 种系统颜色 但它们几乎没有用 例如 调用 UINavigation
  • 使用 Objective-C 将 XMP 数据嵌入到 PNG

    我需要将自定义 XMP 文件嵌入到 iOS 应用程序中的 PNG 中 到目前为止 我能做的就是编译 Adob e XMP 工具包 生成 Xcode 项目 然后正确编译该项目 从那里我不知道如何在我的 Xcode 项目中使用该库以及如何使用它
  • Xcode 8 - 删除了一些按钮边框

    我刚刚将 Xcode 版本从 7 3 更新到 8 0 一些按钮边框消失了 代码看起来很好 所以我真的不知道各层发生了什么 顺便说一句 在其他一些控制器中我可以看到图层边框 self button layer borderColor bord
  • Xcode 6 Launchscreen.xib 具有适用于 iPad 横向和纵​​向的不同资源

    使用 Xcode 6 中引入的 LaunchScreen 我可以定义用于 iPad 横向和纵 向的不同资源吗 由于两个 iPad 方向的特征是相同的 遗憾的是 顺便说一句 我无法区分两者 这是否意味着 要么对 iPad 横向和纵 向使用相同

随机推荐

  • C 标准库函数名称中的“f”代表什么?

    什么是fC 标准库函数的名称代表什么 我注意到很多函数都有一个f以他们的名义 这对我来说真的没有意义 例如 fgets fopen printf scanf sqrtf等等 你的问题总体来说太笼统了 但我可以解释一些例子 fgets htt
  • 在不同列中显示列表项元素

    我正在尝试更改 DataLife Engine 模板的外观 我想知道您是否可以帮助我进行对齐 我有一列显示一些信息 如下所示 div class short description div class table ul class tabl
  • const 记录参数的 [Ref] 属性有用吗?

    对于最新的 Delphi 版本 Berlin 10 1 24 Ref 属性真的有必要吗 我问这个是因为在线文档 http docwiki embarcadero com RADStudio Berlin en Parameters Delp
  • 迭代 Doctrine 的变更集

    我正在尝试记录用户在我的网站上执行的特定操作 并让侦听器检查某些实体是否正在更新 如果是这样 我的目标是记录他们正在编辑的字段 但不是所有字段 有些字段并不重要 或太长 我在将更改集保存到数据库时遇到问题 这就是为什么我想过滤重要字段 这可
  • 当用户填写表单时运行 javascript

    我是 Google Apps 脚本新手 需要帮助 我正在努力实现以下目标 在 Google 表单中设置文本框失去焦点的触发器 此事件中的代码将是 获取文本框的值 设置文本框的值 不幸的是 目前 Google Apps 脚本和 Google
  • 不带斜体的 MathJax 字体

    我想用MathJax http www mathjax org使用常规字体 而不是斜体 我尝试加载不同的 STIX 字体 但使用 MathJax 渲染的符号始终转换为斜体 我查过STIX 字体常见问题解答页面 http www stixfo
  • 创建一个html5音频并播放它不起作用

    我想动态创建一个 html5 音频并播放它 代码如下 function playAnotherMusic playUrl var audioElement document createElement audio audioElement
  • 如果出现错误,请停止在 jquery 中提交表单

    这是我的代码 http jsfiddle net Xk38X 6 http jsfiddle net Xk38X 6 register click function if company f val length 0 company f c
  • 如何检测任何类型的用户交互?

    安全问题 我现在不知道这是如何发生的 但这个问题的读者会想到这个问题的解决方案是一种安全威胁 所以请记住 我感兴趣的所有数据都是测量用户进入 活动的时间 就这样 用户做了什么 我是NOT有兴趣 我需要的是非常简单的概念 但我找不到解决方案
  • 发送文件到 Mule 入站端点

    我正在尝试将包含文件和两个输入的表单发送到 Mule 入站端点 我有一个自定义处理器和一个定义如下的流程
  • 如何在ggplot中缩放独立层的颜色?

    我有一个数据集 记录了三座建筑物的能源使用情况 我有一个融化的数据框 可以从钻石组中模仿 data lt melt diamonds c depth table cut color id c cut color 本质上 我有来自三个不同建筑
  • Stripe 订阅取消和重新激活模型的最佳实践

    我正在开发一个应用程序 该应用程序有 Stripe 的每月订阅计划 我正在创建一个客户然后订阅供用户订阅 这对我来说效果很好 但我还没有弄清楚如何使用 Stripe 订阅创建取消流程 我使用了取消订阅按钮stripe subscriptio
  • 目标元素位于其他元素之前

    在我对此进行研究的过程中 我偶然发现这个线程 https stackoverflow com questions 10225364 select specific element before other element 但由于它已有 2
  • 用户完成编辑后如何从 EditText 上移除焦点?

    我的布局上有一个 EditText 用户输入一些文本并点击 完成 键后 我想从中删除闪烁的光标 我搜索了 StackOverflow 并找到了 3 个对我不起作用的答案 闪烁的光标仍然存在 private class MyOnKeyList
  • 虚拟环境下降级Python版本

    关于 TensorFlow 我总是遇到同样的错误 ModuleNotFoundError No module named tensorflow contrib 我实际上使用的是Python版本3 9不过网上看的好像是这个版本3 7是最后一个
  • 从 WHERE 子句中包含 Varying IN 列表的表中进行 SELECT

    我在正在处理的项目中遇到一个问题 我无法给您实际的代码 但我创建了一个可执行的示例代码 如下所示 Here temp and temp id有两张桌子 temp表包含逗号分隔的 id 列表 即VARCHAR2 temp id表包含实际的 i
  • 如何从散列的散列中提取键名?

    我有以下哈希值 HoH flintstones gt husband gt fred pal gt barney jetsons gt husband gt george wife gt jane his boy gt elroy simp
  • phpseclib 给了我一个奇怪的错误

    我试图使用这个 但它只是给了我这个错误 我不知道如何解决这个问题 警告 include once Math BigInteger php 无法打开流 否 这样的文件或目录 home www sfs web statistics public
  • linq .Value 可空对象必须有一个值。如何跳过?

    我有一些 linq 代码 有时null cbo3 ItemsSource empty Union from a in from b in CompleteData select b TourOpID Distinct select new
  • 在Swift中实现UILabel动画效果的最佳方法?

    我对 Swift 动画还很陌生 并且知道如何去做 但想看看其他人会如何做 我正在尝试创建这样的效果 当用户进入搜索栏时 搜索栏的占位符文本会缩小并向上移动到搜索字段上方 并更改为不同的颜色 像这样 http magicus xyz http