开始用Swift开发iOS 10 - 14 基础动画,模糊效果和Unwind Segue

动画是通过一系列静态图片(帧)快速显示来模拟动作和形状的变化过程。

在iOS中,创建基础动画很简单,只需要利用UIView的类型方法:animate(withDuration:animations:)。这个方法的原理就是,设置好开始状体和结束状态,然后* UIView animation* 创建中间的过程效果。继续上一篇开始用Swift开发iOS 10 - 13 Self Sizing Cells and Dynamic Type

添加评级Button

  • 下载图片包,添加到xcassets里。

  • detail view右上角添加一个Button,设置其内容为空,image为更添加的图片check(一个对勾图标),typesystemtintwhite

  • Button添加四个约束,右、上两个spacing约束,宽度和高度约束。

创建Restaurant Review视图控制器

  • 在storyboard中新建一个View Controller
  • 在新建视图控制器中添加Image View,并改变其大小为整个view,先设置image属性为一个随机图片,比如cafeloisl。 并设置一些约束。

按照下图设置之后是UI:


  • Review的图片上添加一个UIView,x、y、宽度、高度分别是53、40、269、420。
  • 添加Image View,宽度和高度分别为269,200,随机设置image
  • 添加一个内容为You've dined here. What do you think?Label。字体风格为Light,大小为27,居中退器,行数为2。
  • 添加三个按钮内容分别为Absolutely love it!GoodI don't like it。背景为红色,tintwhite,字体是Light和16。
  • 设置三个按钮为一个stack view,改变distributionFill Equallyspaing为5。
  • 为上面添加的UIView添加四个约束。上左右的spacing约束分别为20,37,37。高度约束为420。
  • 为label添加左右下三个spacing约束,值都是15。
  • 为stack view天机左右下三个spacing约束,分别为8,8,10。

创建Present modally类型的Segue

开始用Swift开发iOS 10 - 10 Navigation Controller的介绍和Segue中介绍过Segue类型。Present modally是新页面将以动画形式从底部出现到覆盖整个手机屏幕。

  • contrl-drag从对勾button到Review视图控制,选择Present modally。并设置新生成segue的identifiershowReview

定义如何退出Review View Controller

Navigation Controller中自带了返回按钮,这边需要自己设置unwind segue

  • Review View Controller中的UIView的右上角添加一个关闭按钮,类似于对勾按钮,添加右上和宽度高度约束。
  • 为了实现unwind segue,需要做两件事:
    首先,在返回的的视图控制器(RestaurantDetailViewController)中定义一个方法,定义这个方法是为了告诉xcode这个segue是可以返回的。
    @IBAction func close(segue:UIStoryboardSegue) {
    }

其次在IB中关联返回。control+drag关闭按钮到Exit,选择closeWithSegue:

为背景图片添加模糊效果

UIVisualEffectView

  • 新建ReviewViewController继承至UIViewController,关联上面新建视图控制器。
  • ReviewViewController中添加背景图片结构,并关联图片。
    @IBOutlet var backgroundImageView: UIImageView!
  • ReviewViewControllerviewDidLoad中添加:
        let blurEffect = UIBlurEffect(style: .dark)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = view.bounds
        backgroundImageView.addSubview(blurEffectView)

模糊效果有点像在要添加的视图上面添加一个视图(UIVisualEffectView),这图有模糊效果(UIBlurEffect),模糊样式通过UIBlurEffectStyle控制,有三种extraLight, light, dark

模糊样式:左为Light,右为Dark

实现 UIView Animation

  • 为准备实现动画效果的UIView添加接口,并关联。
    @IBOutlet var containerView: UIView!
  • 定义初始状态:在ReviewViewControllerviewDidLoad中添加:
    containerView.transform = CGAffineTransform.init(scaleX: 0, y: 0)
  • 定义介绍状态:在ReviewViewControllerviewDidAppear中添加:
    override func viewDidAppear(_ animated: Bool) {
        UIView.animate(withDuration: 0.3, animations: {
            self.containerView.transform = CGAffineTransform.identity
        })
    }

CGAffineTransform.identity表示原本设置的大小和位置状态。

动画的变化过程

Spring 动画

只要修改一下结束状态就可以了:

        UIView.animate(withDuration: 0.4, delay: 0.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 0.2, options: .curveEaseInOut, animations: {
            self.containerView.transform = CGAffineTransform.identity
        }, completion: nil)

从上向下的动画

只要修改一下初始状态,把初始位置设置在上面即可:

        containerView.transform = CGAffineTransform.init(translationX: 0, y: -1000)

组合两种变化

containerView.transform = CGAffineTransform.init(translationX: 0, y: -1000)修改成:

let scaleTransform = CGAffineTransform.init(scaleX: 0, y: 0)
let translateTransform = CGAffineTransform.init(translationX: 0, y: -1000)
let combineTransform = scaleTransform.concatenating(translateTransform)
containerView.transform = combineTransform

Unwind Segues 和数据传输

Review View中点击三个不同评价按钮也通过Unwind Segues返回并传输数据。

  • RestaurantDetailViewController在添加另外一个unwind action方法。
@IBAction func ratingButtonTapped(segue: UIStoryboardSegue) {
}
  • 分别对三个按钮control+dragExit,选择ratingButtonTappedWithSegue:,并分别把三个unwind segue的identifier改成 great good dislike
  • Restaurant中添加rating属性: var rating = ""
  • 更新 ratingButtonTapped(segue:)
    @IBAction func ratingButtonTapped(segue: UIStoryboardSegue) {
        if let rating = segue.identifier {
            restaurant.isVisited = true
            
            switch rating {
            case "greate":
                restaurant.rating = "Absolutely love it! Must try."
            case "good":
                restaurant.rating = "Pretty good."
            case "dislike":
                restaurant.rating = "I don't like it."
            default:
                break
            }
        }
        tableView.reloadData()
    }
  • 更新RestaurantDetailViewControllertableView(_:cellForRowAt:)中当fieldLabel为“Been here”的valueLabel的值:
    cell.valueLabel.text = (restaurant.isVisited) ? "Yes, I've been herebefore. (restaurant.rating)" : "No"

修改ReviewViewController中的图片为相应的图片

  • ReviewViewController中添加一个属性:
    var restaurant: Restaurant!

  • RestaurantDetailViewController中添加prepare(for:sender:)方法,作为RestaurantDetailViewControllerReviewViewController的segue时调用,用于传输数据。

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showReview" {
            let destinationController = segue.destination as! ReviewViewController
            destinationController.restaurant = self.restaurant
        }
    }
  • ReviewViewController 中添加图片接口。
    @IBOutlet var topImageView: UIImageView!
  • ReviewViewControllerviewDidLoad中显示图片:
        let image = UIImage(named: self.restaurant.image)
        backgroundImageView.image = image
        topImageView.image = image

为closeButton添加动画效果

  • 添加接口
    @IBOutlet var closeButton: UIButton!
  • viewDieLoad中添加:
    closeButton.transform = CGAffineTransform.init(scaleX: 1000, y: 0)
  • viewDidAppear:添加:
        UIView.animate(withDuration: 0.5, delay: 0.5, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.3, options: .curveEaseInOut, animations: {
            
            self.closeButton.transform = CGAffineTransform.identity
            
        }, completion: nil)

代码

Beginning-iOS-Programming-with-Swift

说明

此文是学习appcode网站出的一本书 《Beginning iOS 10 Programming with Swift》 的一篇记录

系列文章目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容