IOS之笑脸app

ios笑脸app实现

import UIKit@IBDesignable
class FaceView: UIView {@IBInspectablevar lineWidth:CGFloat=3{didSet{setNeedsLayout()}}@IBInspectablevar color:UIColor = UIColor.blueColor(){didSet{setNeedsLayout()}}@IBInspectablevar scale:CGFloat=0.9{didSet{setNeedsLayout()}}var faceCenter:CGPoint{return convertPoint(center, fromView: superview)}var faceRadius:CGFloat{return min(bounds.size.width, bounds.size.height)/2*scale}private struct Scaling {static let FaceRadiusToEyeRadiusRatio: CGFloat = 10//大圆半径(face半径)与小圆半径(eye半径)的比率,次数越小,小圆越大.因为 下面bezierPathForEye的方法中定义 eyeRadius = faceRadius / Scaling.FaceRadiusToEyeRadiusRatiostatic let FaceRadiusToEyeOffsetRatio: CGFloat = 3//大圆与小圆的偏移率,此数越大,小圆的圆心距大圆越近static let FaceRadiusToEyeSeparationRatio: CGFloat = 1.5//两个小圆之间在大圆内的分离比率static let FaceRadiusToEyeMounthWidthRatio: CGFloat = 1static let FaceRadiusToEyeMounthHeightRatio: CGFloat = 3static let FaceRadiusToEyeMounthOffsetRatio: CGFloat = 3}private enum Eye {case Left , Right}private func bezierPathForEye(whichEye: Eye) -> UIBezierPath {//此处定义的方法为设置一只眼睛的位置,上面定义了左右眼的枚举,可通过调用.Left.Right来实现两个位置的设定let eyeRadius = faceRadius / Scaling.FaceRadiusToEyeRadiusRatio//定义小圆半径是大圆半径的几分之几,此处因为FaceRadiusToEyeRadiusRatio: CGFloat = 10 故为十分之一let eyeVerticalOffset = faceRadius / Scaling.FaceRadiusToEyeOffsetRatio//小圆的垂直偏距let eyeHorizontalSeparation = faceRadius / Scaling.FaceRadiusToEyeSeparationRatio//小圆的水平距离var eyeCenter = faceCentereyeCenter.y -= eyeVerticalOffset//此处相当于是用大圆圆心的y坐标减去小圆圆心的y坐标,故小圆圆心在大圆圆心之上.若为加,则在下switch whichEye {case .Left: eyeCenter.x -= eyeHorizontalSeparation / 2//相当于大圆圆心的x坐标减去(小圆圆心的x坐标除以2),即在大圆圆心的左侧case .Right: eyeCenter.x += eyeHorizontalSeparation / 2//此处加,即在右侧}let path = UIBezierPath(arcCenter: eyeCenter, radius: eyeRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true) //画圆path.lineWidth = lineWidth //设定线宽return path}private func bezierPathForSmile(fractionOfMaxSmile: Double) -> UIBezierPath {let mouthWidth = faceRadius / Scaling.FaceRadiusToEyeMounthWidthRatio//大圆半径与线宽的比率,此处线宽=大圆半径let mouthHeight = faceRadius / Scaling.FaceRadiusToEyeMounthHeightRatio//mouthHeight即线的中点到圆心的距离let mouthVerticalOffset = faceRadius / Scaling.FaceRadiusToEyeMounthOffsetRatiolet smileHeight = CGFloat(max(min(fractionOfMaxSmile, 1), -1)) * mouthHeight//此处max(min(fractionOfMaxSmile, 1), -1)限定了笑脸指数只能在-1到1之间,fractionOfMaxSmile这个参数可以自行设定,如果设定的大于1,则只取1,设定小于-1,则只取-1let start = CGPoint(x: faceCenter.x - mouthWidth / 2, y: faceCenter.y + mouthVerticalOffset)  //设置起点let end = CGPoint(x: start.x + mouthWidth, y: start.y)  //设置终点let cp1 = CGPoint(x: start.x + mouthWidth / 3 , y: start.y + smileHeight) //设置曲线点1,此处mouthWidth / 3用于调节曲线的弧度let cp2 = CGPoint(x: end.x - mouthWidth / 3, y: cp1.y)  //设置曲线点2let path = UIBezierPath()path.moveToPoint(start)path.addCurveToPoint(end, controlPoint1: cp1, controlPoint2: cp2)path.lineWidth = lineWidthreturn path}override func drawRect(rect: CGRect) {let facePath=UIBezierPath(arcCenter: faceCenter, radius: faceRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true)facePath.lineWidth=lineWidthcolor.set()facePath.stroke()bezierPathForEye(.Left).stroke()bezierPathForEye(.Right).stroke()let smiliness = 0.8let smilePath = bezierPathForSmile(smiliness)smilePath.stroke()}
}
  • IBDesignable可以在storyboard中看到自定义的uiview
  • IBInspectable使属性可以改变

利用协议与代理联结数据源

protocol FaceViewDataSource:class {func smilnessForFaceView(sender:FaceView)->Double?
}

手势识别实现缩放与改变笑脸弧度

 @IBOutlet weak var faceView: FaceView!{didSet{faceView.dataSource=selffaceView.addGestureRecognizer(UIPinchGestureRecognizer(target: faceView, action: "scale:"))//faceView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "changeHappiness:"))}}private struct Constants{static let HappinessGestureScale:CGFloat=4}@IBAction func changeHappiness(sender: UIPanGestureRecognizer) {switch sender.state {case .Ended:fallthroughcase .Changed:let translation=sender.translationInView(faceView)let happinessChange = -Int(translation.y/Constants.HappinessGestureScale)if happinessChange != 0{happiness+=happinessChangesender.setTranslation(CGPoint.zero, inView: faceView)}default:break}}func scale(gesture:UIPinchGestureRecognizer){if gesture.state == .Changed{scale*=gesture.scalegesture.scale=1}}

源代码:Happiness

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15年来,自然语言处理发展史上的8大里程碑

来源:Deep Tech深科技自然语言是人类独有的智慧结晶。自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向,旨在研究能实现人与计算机之间用自然语言进行有效通信的各种理…

spring组件扫描context:component-scan/使用详解

关于spring自动检测组件的使用方式网上太多了,而且也不是我记录的重点,我想说下一点可能你还不知道的经验我们知道如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的…

最短路径实现

主要工具 QGIS建立拓扑关系 Postgres存储数据表 Geoserver发布相关服务 QGIS建立拓扑关系 使用v.clean运行,并用DBManager即可以建立拓扑关系并导入数据库。 注意 QGIS2.16有数据溢出问题,使用QGIS2.14可以解决这个问题 Postgres存储数据表 导…

2019将成机器学习关键年:中美AI或有一战

作者 | Hussain Fakhruddin译者 | 大小非编辑 | Vincent 来源 | AI前线(ID:ai-front)导读:2019 年将是机器学习关键的一年。ML 已经成为全球数字转型的关键要素之一——到 2021 年底,累计投资预计将达到 580 亿美元。在企业应用领域&#xff…

LOGO设计中文字体设计十种手法

LOGO设计中文字体设计十种手法 Tags:LOGO设计中文字体设计手法 1.连接法——结合字体特征将笔画相连接的形式 2.简化法——根据字体特点,利用视觉错觉合理地简化字体部分笔画的形式 3.附加法——在字体外添加配合表现标示的图形的形式 4.底图法——将字体…

深度 | IBM长文解读人工智能、机器学习和认知计算

来源:人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏,近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日,IBM 官网发表了一篇概述文章,对人工智能技术的发展过程进行了简单梳理,同时还图文并…

【ACM】hdu_1862_EXCEL排序_201308091948

EXCEL排序 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11903 Accepted Submission(s): 4736 Problem DescriptionExcel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。Input测试输入包含若…

多变量线性回归

目前为止,我们探讨了单变量/特征的回归模型,现在我们对房价模型增加更多的特征, 例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为(x1,x2,…,xn) 增添更多特征后,我们引入一系列新的注释: n 代表特征的数量 x(i)代表第 i 个训练实例,是特征矩阵中的第 i 行,是一…

人工智能乌托邦 迪拜认为2071年人类应该这样生活!

来源:网易智能不同于硅谷老牌的科技力量,迪拜一直是独特的存在。他们日益崛起的科技实力正在被验证,无论是全面AI化的基础建设和城市治安力量,还是频频登上全球科技头条的机器人警察和空中出租车,迪拜试图摆脱很多人眼…

[leetcode]Decode Ways

动态规划。要注意waydp[i-1]或dp[i-2]以及way1的条件。我看有的人把数组命名为count的。 public class Solution {public int numDecodings(String s) {// Start typing your Java solution below// DO NOT write main() functionint len s.length();if (len 0) return 0;int…

逻辑回归与正则化

在分类问题中,你要预测的变量 y 是离散的值,我们将学习一种叫做逻辑回归 (Logistic Regression) 的算法,这是目前最流行使用最广泛的一种学习算法。 在分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问 题的例子有:判断一封电子邮件是否是垃圾邮件;判…

万字报告!一文看懂全球车厂的技术家底模块化平台

来源:智东西摘要:介绍模块化平台以及该平台对车企的重要意义,详解车企模块化平台布局。汽车的研发制造方式经历了手工作坊式到标准化流水线再到平台化,目前主流车企纷纷采取模块化平台方式。汽车模块化平台研发制造是指车企基于通…

记录下Lambda常用的表现形式

纯粹记录下Lambda的表现形式: (x, y) > x * y;//多参数,隐式类型>表达式 x > x * 10;//单参数,隐式类型>表达式 x > { return x * 10; }; //单参数,隐式类型>语句块 (int x) > x * 10;//单参数,显…

西湖大学全披露:68位顶级科学家加盟,已获捐资35亿,最小捐赠者12岁

来源:量子位最终,2018年10月20日,成为了西湖大学的成立日。在刚结束的成立大会上,5名诺贝尔奖得主、70余位国内外校长及代表、近百位捐赠人齐聚。可谓少长咸集,高朋满座,生而备受期待。而且就在创立大会上&…

字体大宝库:设计师必备的专业免费英文字体

字体绝对是每一个设计非常重要的部分,设计者总是希望有最好的免费字体,以保持他们字体库的更新。所以今天我要向设计师们分享一个专业的免费英文字体集合。这些免费的字体是适用于任何类型的图形设计:Web,打印,动态图形…

神经网络学习

代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m 个,每个包含一组输入 x 和一组输出信号 y,L 表示神经 网络层数,Sl表示每层的 neuron 个数(SL表示输出层神经元个数),SL代表最后一层中处理 单元的个数。 将神经网络的分类定义为两种情况:二类分…

干货|深度!“人工智能+制造”产业发展研究报告

来源::腾讯研究院工业革命以后的“自动化”概念追求的是机器自动生产,本质是“机器替人”,强调在完全不需要人的情况下进行不间断的大规模机器生产;而“智能化”追求的是机器的柔性生产,本质是“人机协同”…

简明外贸报价单(Price List)范本

简明外贸报价单(Price List)范本 简明外贸报价单(Price List)范本 报价单 Price List 报价日期:年 月 日 Supplier   Address   供应商 公司地址 Contact   Approvals   联系人名 产品认证 Tel …

机器学习系统设计与建议

当我们在运用训练好了的模型来预测未知数据的时候发现有较大的误差,我们下一步可以 做什么? 1. 获得更多的训练实例——通常是有效的,但代价较大,下面的方法也可能有效,可 考虑先采用下面的几种方法。 2. 尝试减少特征的数量 3. 尝试获得更多的特征 4. 尝试增加多项式特征…

李飞飞重返斯坦福后的大动作:开启「以人为中心的AI计划」

来源:网络大数据刚刚,李飞飞宣布斯坦福开启「以人为中心的 AI 计划」(Human-Centered AI Initiative,HAI),该项目由李飞飞和斯坦福大学前教务长 John Etchemendy 共同主导,Chris Manning 也参与其中。李飞飞在 twitter…