• 好友灵光一闪,说要拿Swift写动画效果。然后这几天就踏上了一条不归路 先是从网上各种找资料自学呗,原生的就不多做阐述,大家都推荐一个老外写的JNW用了,感觉还是不错的,还有一个就是faceBook的pop框架。原生...

    好友灵光一闪,说要拿Swift写动画效果。然后这几天就踏上了一条不归路
    先是从网上各种找资料自学呗,原生的就不多做阐述,大家都推荐一个老外写的JNW用了,感觉还是不错的,还有一个就是faceBook的pop框架。原生里面有个延迟的方法,JNW里么看到好像。然后后面有些效果其实混着用了,反正是跟着感觉来的。

    不多说、先上最终效果图
    这里写图片描述

    这里写图片描述

    这里写图片描述


    首先、我们的整体是在UIScrollView上面进行的。为了能让每滑动一下正好到下一个地球,我们可以用
    scrollView中的分页效果来实现:
    scr.pagingEnabled = true
    接着 我们先来让地球转起来,这个我们就用原生的方法就行了,写个方法然后调用即可。

       //自己写个方法
        func startAnimation()
        {
            UIView.animateWithDuration(30, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
                self.imgEarth.transform = CGAffineTransformRotate(self.imgEarth.transform, CGFloat(M_PI_2)*30)}, completion: nil)
    
        }

    然后就是滑动的时候的缩放效果了,因为scrollView自己代理里面有几个方法,分别是开始滑动,将要结束,和结束时候的方法。我们我们利用这几个方法在这之中风别掉用就可以了

        //scr 滑动开始时 执行缩放效果
        func scrollViewWillBeginDragging(scrollView: UIScrollView) {
            var y = scr.contentOffset.y
            yscoFirst = y
    
            if ( y<10 ) {
                //println("111111111\(y)")
                self.lessenAnimation(imgEarth)
                self.enLargeAnimation(imgEarth2)
                self.moonAnimation()
            }
            if y>10 {
                //println("2 \(y)")
                //self.enLargeAnimation(imgMoon2)
                self.lessenAnimation(imgEarth2)
                self.enLargeAnimation(imgEarth3)
                self.moonAnimationBack()
            }
            if( y > 320){
                //println(" 3 \(y)")
                self.lessenAnimation(imgEarth3)
                self.enLargeAnimation(imgEarth4)
                self.moonAnimation1()
            }
            if (y > 450){
                self.lessenAnimation(imgEarth4)
                self.moonAnimationBack1()
            }
    
        }
    
        //scr 滑动将要结束时执行地球旋转动画
        func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
            var y = scr.contentOffset.y
            if (yscoFirst < y) {
                earthArrayNumber++
            if (yscoFirst > y){
                earthArrayNumber--
                println("\(earthArrayNumber)")
            }
    
        }
    
        //scr 结束滑动时 执行
        func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
            var y = scr.contentOffset.y
            if (y != 0) {
                //println("qqqqq(y)")
                self.enLargeAnimation(imgEarth)
                self.enLargeAnimation(imgEarth2)
                self.enLargeAnimation(imgEarth3)
                self.enLargeAnimation(imgEarth4)
            }
                    if( y < 320){
                self.startAnimation()
    
            }
            if(y<368){
                self.startAnimation2()
                var x:CGFloat = imgEarth2.frame.width
                var y:CGFloat = imgEarth2.frame.height
                imgEarth2.frame = CGRectMake(screenY/2+40, screenX/1.5-45, x, y)
            }
            if (y<500){//y>265 &&
                self.startAnimation3()
            }
    
    
        }
    展开全文
  • for i in 0.. if self.navigationController?.viewControllers[i].isKindOfClass(LoanViewController) == true{ // send notification // NSNotificationCenter.defaultCenter().postNotificationName("RefreshDa

    for i in 0..<(self.navigationController?.viewControllers.count)! {
    if self.navigationController?.viewControllers[i].isKindOfClass(LoanViewController) == true{
    // send notification
    // NSNotificationCenter.defaultCenter().postNotificationName("RefreshData", object: nil)


    _ = self.navigationController?.popToViewController(self.navigationController?.viewControllers[i] as! LoanViewController, animated: true)
    break
    }

    }

    展开全文
  • 点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达! 先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是...
        

    点击上方“iOS开发”,选择“置顶公众号”

    关键时刻,第一时间送达!

    640?640?wx_fmt=gif















































































































































































































































































































        先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。


        “这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。


        “哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。


        “何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。


        这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。


        不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。


        “你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。


        巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”


        “不是挑战你,是要宰了你。”楚枫冷声笑道。


        “好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。


        如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。


        不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。


        “我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。


        “这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。


        “钟离长老?可是那位性情古怪的钟离一护?”


        “没错,就是他。”


        “天哪,巫九竟然拜入了他的门下?”


        人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。


        只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。


        “恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。































































































    一、委托模式


    1、使用过程


    协议最常见的用法莫过于进行代理传值,这就是委托模式。常用的应用场景有:controller中自定义了一个view,view中又添加了一个自定义view。在自定义的view中如果有些函数或者属性需要到controller中去调用,委托模式的做法就是规定一个协议,让controller去遵守一个协议并提供实现,那么在自定义view中就能使用协议中的方法。 


    举个例子,现在想在一个controller中添加一个自定义view,可以实现点击view中按钮更改controller中label的值。简单的代码如下: 


    自定义view


    //SelectTabbar.swift
    @objc protocol SelectTabbarDelegate {
        func changeLabel(_ str: String)
    }


    //SelectTabbar.swift
     class SelectTabbar: UIView {
        var keywords : [String]?
        var buttons : [UIButton]?
        weak public var delegate : SelectTabbarDelegate?

        init(frame: CGRect,keywords:[String]) {
            super.init(frame: frame)
            self.keywords = keywords
            renderView()
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        override func layoutSubviews() {
            super.layoutSubviews()
        }

        private func renderView(){
            buttons = keywords?.enumerated().map({ (index,key) ->UIButton in
                let buttonWidth = kScreenWidth/CGFloat((keywords?.count)!)
                let button = UIButton.init(frame: CGRect.init(x: CGFloat(index)*buttonWidth, y: 0, width: buttonWidth, height: 50))
                button.setTitle(key, for: .normal)
                button.setTitleColor(UIColor.blue, for: .normal)
                button.backgroundColor = UIColor.gray
                button.tag = index
                button.addTarget(self, action: #selector(tapButton(sender:)), for: .touchUpInside)
                addSubview(button)
                return button
            })
        }

        @objc func tapButton(sender: UIButton){
            delegate?.changeLabel(keywords![sender.tag])
        }

    }


    controller:


    class TestViewControllerUIViewController,SelectTabbarDelegate {
        lazy var label : UILabel = {
            var label = UILabel(frame: CGRect.init(x: 50, y: 200, width: 100, height: 30))
            label.text = labelStr
            label.backgroundColor = UIColor.red
            return label
        }()

        private var labelStr : String? {
            didSet{
                label.text = labelStr
            }
        }

        override func viewDidLoad({
            super.viewDidLoad()
            view.backgroundColor = .white
            view.addSubview(label)
            setupSelectTabbar()
        }

        func setupSelectTabbar(){
            let selectTabbar = SelectTabbar(frame: CGRect.init(x: 0, y: kNavigationHeightAndStatuBarHeight, width: kScreenWidth, height: 50),keywords:["aa","bb"])
            selectTabbar.delegate = self
            view.addSubview(selectTabbar)
        }
        func changeLabel(_ str: String{
            labelStr = str
        }

    }


    这样就能比较清楚的表明自己的逻辑。否则,如果要在view操作controller的内容,则需要在外部操作controller的实例,这就造成一个问题,就是无法操作实例中的私有属性和私有方法(虽然iOS是一门动态语言,不存在绝对的私有,但是谁会去一直去使用runtime来进行操作呢)。 


    2、注意点


    在 ARC 中,对于一般的 delegate,我们会在声明中将其指定为 weak,在这个 delegate 实际的对象被释放的时候,会被重置回 nil。这可以保证即使 delegate 已经不存在时,我们也不会由于访问到已被回收的内存而导致崩溃。ARC 的这个特性杜绝了 Cocoa 开发中一种非常常见的崩溃错误,说是救万千程序员于水火之中也毫不为过。 


    在 Swift 中我们当然也会希望这么做。但是当我们尝试书写这样的代码的时候,编译器不会让我们通过:


    'weak' cannot be applied to non-class type


    原因:这是因为 Swift 的 protocol 是可以被除了 class 以外的其他类型遵守的,而对于像 struct 或是 enum 这样的类型,本身就不通过引用计数来管理内存,所以也不可能用 weak 这样的 ARC 的概念来进行修饰。 

    两种解决方法: 


    1、使用@objc 


    2、声明类类型专属协议。通过添加 class 关键字来限制协议只能被类类型遵循,


    而结构体或枚举不能遵循该协议。class 关键字必须第一个出现在协议的继承列表中,在其他继承的协议之前 


    protocol SelectTabbarDelegate : class


    二、AOP编程思想的运用


    首先我们理解下AOP的含义。


    In computing, aspect-oriented programming (AOP) is a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. It does so by adding additional behavior to existing code (an advice) without modifying the code itself, instead separately specifying which code is modified via a “pointcut” specification, such as “log all function calls when the function’s name begins with ‘set’”. This allows behaviors that are not central to the business logic (such as logging) to be added to a program without cluttering the code, core to the functionality. AOP forms a basis for aspect-oriented software development.


    在swift简单来说,就是利用协议去切入某些代码中,将额外的功能单独出来而不产生耦合,可以将这些与主逻辑关系不大的代码统一放到一起。 


    常用的场景:日志记录,性能统计,安全控制,事务处理,异常处理等等。 

    接上面的例子,我们需要在打开TestViewController的时候统计一次,点击两个按钮的时候也进行统计,统计的内容由identifer进行区分。 


    我们先建立一个Statistician.swift 来存放我们的统计逻辑。(模拟实现) 


    申明一个StatisticianProtocal协议并提供他的默认实现。


    import Foundation
    enum LogIdentifer:String {
        case button1 = "button1"
        case button2 = "button2"
        case testViewController = "testViewController"
    }

    protocol StatisticianProtocal {
        func statisticianLog(fromClass:AnyObject, identifer:LogIdentifer)
        func statisticianUpload(fromClass:AnyObject, identifer:LogIdentifer)
        //用一个尾随闭包来扩展功能
        func statisticianExtension(fromClass:AnyObject, identifer:LogIdentifer, extra:()->())
    }

    extension StatisticianProtocal
    {
        func statisticianLog(fromClass:AnyObject, identifer:LogIdentifer) {
            print("statisticianLog--class:(fromClass) from:(identifer.rawValue)")
        }

        func statisticianUpload(fromClass:AnyObject, identifer:LogIdentifer) {
            print("statisticianUpload--class:(fromClass) from:(identifer.rawValue)")
        }

        func statisticianExtension(fromClass:AnyObject, identifer:LogIdentifer, extra:()->()){
            extra()
        }
    }

    class Statistician: NSObject {

    }


    接下来在任何需要统计的类里面,我们让这个类去遵守这个协议,然后在需要的地方调用协议中的方法即可。如果在某个特定的类中需要调用的方法略有不同,重写协议中的方法即可。


    class SelectTabbar: UIView,StatisticianProtocal {
        var keywords : [String]?
        var buttons : [UIButton]?
        weak public var delegate : SelectTabbarDelegate?

        init(frame: CGRect,keywords:[String]) {
            super.init(frame: frame)
            self.keywords = keywords
            renderView()
            //进行一次统计
            operateStatistician(identifer: .testViewController)
        }

        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }


        override func layoutSubviews() {
            super.layoutSubviews()
        }

        private func renderView(){
            buttons = keywords?.enumerated().map({ (index,key) ->UIButton in
                let buttonWidth = kScreenWidth/CGFloat((keywords?.count)!)
                let button = UIButton.init(frame: CGRect.init(x: CGFloat(index)*buttonWidth, y: 0, width: buttonWidth, height: 50))
                button.setTitle(key, for: .normal)
                button.setTitleColor(UIColor.blue, for: .normal)
                button.backgroundColor = UIColor.gray
                button.tag = index
                button.addTarget(self, action: #selector(tapButton(sender:)), for: .touchUpInside)
                addSubview(button)
                return button
            })
        }

        @objc func tapButton(sender: UIButton){
            //进行一次统计
            switch sender.tag {
              case 0:operateStatistician(identifer: .button1)
              default:operateStatistician(identifer: .button2)
            }
            delegate?.changeLabel(keywords![sender.tag])
        }

        func operateStatistician(identifer:LogIdentifer){
            statisticianLog(fromClass: self, identifer: identifer)
            statisticianUpload(fromClass: self, identifer: identifer)
            statisticianExtension(fromClass: self, identifer: identifer) {
                print("extra: in SelectTabbar class")
            }
        }

    }


    以上代码实现了三处统计的逻辑,而不用把统计的逻辑写入controller文件中,降低了功能上的耦合度。


    三、用来代替extension,增强代码可读性


    使用扩展,可以很方便的为一些继承它的子类增添一些函数。这就带来一个问题,就是所有的子类都拥有了这个方法,但是方法的本身可能不明确,或者是只是想让少数子类来使用这个方法。这时候可以使用协议来代替extension。


    //定义了一个Shakable协议,遵守这个协议的类即可使用里面的方法,并为该方法提供一个默认的实现
    //where Self:UIView表明了只有uiview的子类可以遵守这个协议
    protocol Shakable {
        func shakeView()
    }

    extension Shakable where Self:UIView
    {
        func shakeView(){
            print(Self.self)
        }
    }


    这时候可以让某个子类来遵守协议。例如刚才上面的例子。


    class SelectTabbarUIView,Shakable


    如果不在类中重新实现这个方法,则可以实现默认的方法。这个意思表明,SelectTabbar类的子类是遵守Shakable协议的,间接等于SelectTabbar():Shakable?。这样我们就可以愉快的让SelectTabbar对象去使用这个方法。(Self关键字只能用在协议或者类中,表示当前类,可作为返回值使用)。 


    一旦不想让某个子类使用shakeView()方法,很简单,只要把class SelectTabbar: UIView,Shakable中的Shakable协议干掉即可。 


    其他实践: 


    利用AOP去分离tableview的数据源和事件源的方法,可以单独处理里面的逻辑,使tableview的代理方法不显得那么冗余。 


    总结


    关于协议,还有很多种用法。以上是目前比较常用的场景。日后开发中如果发现协议在其他地方中有更好的应该,将会更新本文


    640.jpeg

    • https://github.com/PeipeiQ/MySwift

    • iOS开发整理发布,转载请联系作者获得授权

    640?wx_fmt=gif640?【点击成为源码大神】

    展开全文
  • SwiftPOP

    2019-09-10 00:20:54
    首页最新文章IT 职场前端后端移动端数据库运维其他技术- 导航条 -首页最新文章IT 职场前端- JavaScript- HTML5- CSS后端- Python- Java- C/C++- PHP- .NET- Ruby- Go移动端- Android- iOS数据库运维- Linux-...

      首页最新文章IT 职场前端后端移动端数据库运维其他技术- 导航条 -首页最新文章IT 职场前端- JavaScript- HTML5- CSS后端- Python- Java- C/C++- PHP- .NET- Ruby- Go移动端- Android- iOS数据库运维- Linux- UNIX其他技术- Git- 机器学习- 算法- 测试- 信息安全- Vim

      伯乐在线 > 首页 > 所有文章 > 开发 > 从 Swift 的面向协议编程说开去从 Swift 的面向协议编程说开去

      2016/11/21 · 开发 · 多继承, 面向协议, 面向对象

      分享到:0Android Data Binding实战-入门篇轻松学会Laravel-表单篇初识机器学习-理论篇JSON快速入门(Java版)本文作者: 伯乐在线 - bestswifter 。未经作者许可,禁止转载!

      欢迎加入伯乐在线 专栏作者。

      写在最前

      文章标题谈到了面向协议编程(下文简称 POP),是因为前几天阅读了一篇讲 Swift 中 POP 的文章。本文会以此为出发点,聊聊相关的概念,比如接口、mixin、组合模式、多继承等,同时也会借助各种语言中的例子来阐述我的思想。

      那些老生常谈的概念,相信每位读者都耳熟能详了,我当然不会无聊到浪费时间赘述一遍。我会试图从更高一层的角度对他们做一个总结,不过由于经验和水平有限,也难免有所疏漏,欢迎交流讨论。

      最后啰嗦一句:

      没有银弹

      Swift 的 POP

      更多阅读请点击:郑州牛皮癣医院

      更多阅读请点击:郑州治疗牛皮癣医院

      Swift 非常强调 POP 的概念,如果你是一名使用 Objective-C (或者 Java 等某些语言)的老程序员,你可能会觉得这是一种“新”的编程概念。甚至有些文章喊出了:“放弃面向对象,改为面向协议”的口号。这种说法从根本上讲就是完全错误的。

      面向接口

      首先,面向协议的思想已经提出很多年了,很多经典书籍中都提出过:“面向接口编程,而不是面向实现编程”的概念。

      这句话很好理解,假设我们有一个类——灯泡,还有一个方法,参数类型是灯泡,方法中可以调用灯泡的“打开”和“关闭”方法。用面向接口的思想来写,就会把参数类型定义为某个接口,比如叫 Openable,并且在这个接口中定义了打开和关闭方法。

      这样做的好处在于,假设你将来又多了一个类,比如说是电视机,只要它实现了 Openable接口,就可以作为上述方法的参数使用。这就满足了:“对拓展开放,对修改关闭”的思想。

      很自然的想法是,为什么我不能定义一个灯泡和电视机的父类,而是偏偏选择接口?答案很简单,因为灯泡和电视机很可能已经有父类了,即使没有,也不能如此草率的为它们定义父类。

      接口的缺点

      所以在这个阶段,你暂且可以把接口理解为一种分类,它可以把多个毫无关系的类划分到同一个种类中。但是接口也有一个重大缺陷,因为它只是一种约束,而非一种实现。也就是说,实现了某个接口的类,需要自己实现接口中的方法。

      有时候你会发现,其实像继承那样,拥有默认实现也是一件挺好的事。还是以灯泡举例,假设所有电器每一次开、关都要发出声音,那么我们希望 Openable 接口能提供一个默认的 open 和 close 的方法实现,其中可以调用发出声音的函数。再比如我的电器需要统计开关次数,那我就希望 Openable 协议定义了一个 count 变量,并且在每次开关时对它做统计。

      显然使用接口并不能完成上述需求,因为接口对代码复用的支持非常差,因此除了某些非常大型的项目(比如 JDBC),在客户端开发中(比如 Objective-C)使用面向接口的场景并不非常多见。

    转载于:https://my.oschina.net/u/3036964/blog/794145

    展开全文
  • swift开发之pop动画

    2015-03-22 15:39:08
    第一步:用cocoapods 安装pop  1.新建一个工程在根目录创建一个空文件Podfile, 2.在Podfile中写入 pod 'pop','~> 1.0' 3.关闭工程,在终端进入...5.进入工程之后建立swift-oc的桥接头文件 import "POP.h" 6.到此p
    第一步:用cocoapods 安装pop 
    1.新建一个工程在根目录创建一个空文件Podfile,
    2.在Podfile中写入 pod 'pop','~> 1.0'
    3.关闭工程,在终端进入工程目录,然后输入pod install 进行安装
    4.安装结束,打开工程文件夹的xworkspace文件
    5.进入工程之后建立swift-oc的桥接头文件 import "POP.h"
    6.到此pop安装完成
    第二步:使用pop,demo代码如下
    demo效果,放大两倍,旋转180度,移动位置,改变背景颜色
    //
    //  ViewController.swift
    //  Popswift
    //
    //  Created by lyj on 15/3/22.
    //  Copyright (c) 2015年 lyj. All rights reserved.
    //


    import UIKit


    class ViewController: UIViewController {


        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            let redBall = UIView(frame: CGRect(x: 50, y: 50, width: 100, height: 100))
            redBall.backgroundColor = UIColor.redColor()
            self.view.addSubview(redBall)
            
            let scale = POPSpringAnimation(propertyNamed: kPOPViewScaleXY)
            //设置结束值各放大两倍
            scale.toValue = NSValue(CGPoint: CGPointMake(2, 2))
            //设置弹性
            scale.springBounciness = 20
            //设置速度
            scale.springSpeed = 1
            
            redBall.pop_addAnimation(scale, forKey: "")
            
            let rotation = POPSpringAnimation(propertyNamed: kPOPLayerRotation)
            rotation.toValue = M_PI
            rotation.springBounciness = 20
            rotation.springSpeed = 2
            redBall.layer.pop_addAnimation(rotation, forKey: "df")
            
            let position = POPSpringAnimation(propertyNamed: kPOPLayerPositionX)
            position.toValue = 400
            position.springBounciness = 20
            position.springSpeed = 5
            redBall.layer.pop_addAnimation(position, forKey: "sdf")
            
            let bgcolor = POPSpringAnimation(propertyNamed: kPOPViewBackgroundColor)
            bgcolor.toValue = UIColor.blueColor()
            bgcolor.springBounciness = 20
            bgcolor.springSpeed = 1
            redBall.pop_addAnimation(bgcolor, forKey: "dssa")
            
        }


        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }




    }




    欢迎转载,转载请注明出处http://blog.csdn.net/colinasd
    展开全文
  • 当我们自定义继承UIViewController视图控制器的基类视图控制器时,会新增返回到上级的视图控制器方法,于是就要区分,返回时使用 pop 的方法,还是使用dismiss 的方法了。 方法1 - (void)backPreviousController {...
  • Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果...
  • 之前用OC代码写过PUSH和POP的转场动画,闲来无事,将其转换成Swift语言,希望对大家有帮助,转载请注明。。。。如何实现PUSH和POP的转场动画?首先,创建一个NSObject的类,分别用来实现PUSH和POP的动画效果创建PUSH...
  • Swift版Facebook POP

    2015-06-12 11:02:54
    Swift版Facebook POP (在iOS代码库中浏览本帖) 关键字:POP,动画,Swift代码类库:特效(SpeciallyEffect)GitHub链接:https://github.com/aleclarson/facebook-pop-for-swift#facebook-pop-for-swift ...
  • swift push和pop

    2018-02-06 15:54:37
    push跳转到指定页面 self.navigationController?.pushViewController(FoundNewsViewController(), ...pop返回上一个页面 self.navigationController?.popViewController(animated: true)
  • 支持oc和Swift:京东,腾讯体育等等都是这种效果 git:https://github.com/Bonway/BBGestureBack 说明文档:https://blog.csdn.net/bonway_huang/article/details/50505975
  • // MyButton.swift // PopInstall // // Created by su on 15/12/11. // Copyright © 2015年 tian. All rights reserved. // import UIKit class MyButton: UIButton { override func touchesB...
  • iOS7.0后苹果提供了自定义转场动画的API,利用这些API我们可以改变 push和pop(navigation非模态),present和dismiss(模态),标签切换(tabbar)的默认转场动画。
  • Swift POP+MVVM

    2019-01-05 03:28:57
    Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果...
  • 边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple // 保留Pop手势 navigationController?.interactivePopGestureRec...
  • swift - 全屏pop手势

    2019-09-23 21:53:59
    UINavigationController...为了能到达到全屏pop的效果这里有2中解决方案: 1、通过runtime拿到系统的侧滑手势,并把这个手势添加到UINavigationController的全屏view上(这里主要介绍这一种方案) //利用运行时动态...
  • 什么是3D Touch 3D Touch 是iOS9之后专为 iPhone6s 机型加入的新特性,这一新技术移植于 Mac Book 上的 ForceTouch 更准确地说应该是 ForceTouch 在iPhone 上的实现吧。3D Touch 实质是一种新型的快捷单点触控技术,...
  • 自定义UINavigationController的push和pop动画我们这里先创建一个简单的工程 , 在storyboard 中拖一个导航控制器 , rootViewController 改成我们的ViewController 。为了实现自定义动画切换 , 我们需要实现两个...
  • swift

    2018-11-22 15:43:42
    iOS 跳转到任意某个rootViewController     x 代表第几个根视图,任意视图跳转哦   self.tabBarController.selectedViewController = self.tabBarController.childViewControllers[X];...[self....
1 2 3 4 5 ... 20
收藏数 4,171
精华内容 1,668