iOS绘制专属于程序猿的浪漫爱心_IOS

近来无事,想想IT该怎样才能彰显浪漫情怀,不能口头上说说而已,最关键的是要有可视化的东西展示出来才行~

废话不多说,直接上Demo

HeartView.h

//
// HeartView.h
// DrawHeart
//
// Created by WQL on 16/3/1.
// Copyright  2016年 WQL. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface HeartView : UIView
/**
 * 比率
 */
@property (nonatomic,assign) CGFloat rate;
/**
 * 填充的颜色
 */
@property (nonatomic,strong) UIColor *fillColor;
/**
 * 线条的颜色
 */
@property (nonatomic,strong) UIColor *strokeColor;
/**
 * 线条的宽度
 */
@property (nonatomic,assign) CGFloat lineWidth;
@end

HeartView.m文件:

//
// HeartView.m
// DrawHeart
//
// Created by WQL on 16/3/1.
// Copyright  2016年 WQL. All rights reserved.
//

#import "HeartView.h"
//间距
NSInteger const spaceWidth = 5;
//波浪的振幅
NSInteger const waveAmplitude = 5;
@interface HeartView ()
{
  CGFloat t;
}
@end

@implementation HeartView

- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    [self loadTimer];
  }
  return self;
}

- (void)drawRect:(CGRect)rect
{
  [super drawRect:rect];

  //上面的两个半圆 半径为整个frame的四分之一
  CGFloat radius = MIN((self.frame.size.width-spaceWidth*2)/4, (self.frame.size.height-spaceWidth*2)/4);

  //左侧圆心 位于左侧边距+半径宽度
  CGPoint leftCenter = CGPointMake(spaceWidth+radius, spaceWidth+radius);
  //右侧圆心 位于左侧圆心的右侧 距离为两倍半径
  CGPoint rightCenter = CGPointMake(spaceWidth+radius*3, spaceWidth+radius);

  //左侧半圆
  UIBezierPath *heartLine = [UIBezierPath bezierPathWithArcCenter:leftCenter radius:radius startAngle:M_PI endAngle:0 clockwise:YES];

  //右侧半圆
  [heartLine addArcWithCenter:rightCenter radius:radius startAngle:M_PI endAngle:0 clockwise:YES];

  //曲线连接到新的底部顶点 为了弧线的效果,控制点,坐标x为总宽度减spaceWidth,刚好可以相切,平滑过度 y可以根据需要进行调整,y越大,所画出来的线越接近内切圆弧
  [heartLine addQuadCurveToPoint:CGPointMake((self.frame.size.width/2), self.frame.size.height-spaceWidth*2) controlPoint:CGPointMake(self.frame.size.width-spaceWidth, self.frame.size.height*0.6)];

  //用曲线 底部的顶点连接到左侧半圆的左起点 为了弧线的效果,控制点,坐标x为spaceWidth,刚好可以相切,平滑过度。y可以根据需要进行调整,y越大,所画出来的线越接近内切圆弧(效果是越胖)
  [heartLine addQuadCurveToPoint:CGPointMake(spaceWidth, spaceWidth+radius) controlPoint:CGPointMake(spaceWidth, self.frame.size.height*0.6)];

  //线条处理
  [heartLine setLineCapStyle:kCGLineCapRound];
  //线宽
  [self setHeartLineWidthWithPath:heartLine];
  //线条的颜色
  [self setHeartStrokeColor];

  //根据坐标点连线
  [heartLine stroke];
  //clipToBounds 切掉多余的部分
  [heartLine addClip];

  //初始化波浪的构成
  UIBezierPath *waves = [UIBezierPath bezierPath];

  //首先 把起始点设置为左侧 x坐标为spaceWidth 心形从下往上填充,y坐标需要满足一定的函数关系式,当rate为0时,位置为总高度-2倍的留白距离(spaceWidth)+波浪的振幅;当rate为1时,位置为留白距离(spaceWidth)-振幅。由这两个状态构建函数表达式,即可得到如下表达式
  CGPoint startPoint = CGPointMake(spaceWidth, (self.frame.size.height-3*spaceWidth+waveAmplitude*2)*(1-self.rate)+spaceWidth-waveAmplitude);
  [waves moveToPoint:startPoint];

  //关键的地方来了 波浪线怎么画?
  //首先,x坐标是从左往右连续的 y坐标是起始的高度加上一定的波动 这里选择了cos函数。5是波动的幅度大小,50控制的是波峰的间距,t是为了让其动起来,随时间发生波动
  for (int i = 0; i<self.frame.size.width-spaceWidth*2+self.lineWidth*2; i++) {
    //x是要考虑线宽的 不然的话,会导致填充的宽度不够 y就是在某个值附近波动
    CGPoint middlePoint = CGPointMake(spaceWidth+i-self.lineWidth, startPoint.y+waveAmplitude*cos(M_PI/50*i+t));

    [waves addLineToPoint:middlePoint];
  }

  //画波浪线的右端 到底部的垂直线
  [waves addLineToPoint:CGPointMake(self.frame.size.width-spaceWidth*2, self.frame.size.height-spaceWidth*2)];
  //画右侧底部的点 到达左侧底部的点之间的横线
  [waves addLineToPoint:CGPointMake(spaceWidth, self.frame.size.height-spaceWidth*2)];
  //设置填充颜色
  [self setHeartFillColor];
  //填充
  [waves fill];

}
//设置线条宽度 默认为1
- (void)setHeartLineWidthWithPath:(UIBezierPath*)path
{
  CGFloat lineW;
  if (self.lineWidth) {
    lineW = self.lineWidth;
  }else{
    lineW = 1;
  }

  [path setLineWidth:lineW];
}

//设置线条颜色
- (void)setHeartStrokeColor
{
  UIColor *strokColor;
  if (self.strokeColor) {
    strokColor = self.strokeColor;
  }else{
    strokColor = [UIColor blackColor];
  }

  [strokColor set];
}
//设置填充的颜色
- (void)setHeartFillColor
{
  UIColor *fillColor;
  if (self.fillColor) {
    fillColor = self.fillColor;
  }else{
    fillColor = [UIColor orangeColor];
  }

  [fillColor set];

}

//为了实现动态的效果,加一个Timer
- (void)loadTimer
{
  NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.02 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
  [timer fire];
}
//t 是一个影响波浪线的参数,每次修改之,再画,则每次的都不一样,则有动态的效果
- (void)timerAction
{
  t += M_PI/50;

  if (t == M_PI) {
    t = 0;
  }
  //修改了t之后 要调用draw方法
  [self setNeedsDisplay];
}

@end一些关键点,我已经注释啦~

下面就是看看怎么使用这个视图了:

ViewController.m中:

//
// ViewController.m
// DrawHeart
//
// Created by WQL on 16/3/1.
// Copyright  2016年 WQL. All rights reserved.
//

#import "ViewController.h"
#import "HeartView.h"

NSInteger const heartWidth = 200;
NSInteger const heartHeight = 200;

@interface ViewController ()
{
 HeartView *heartView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
 [super viewDidLoad];
 heartView = [[HeartView alloc]initWithFrame:CGRectMake((self.view.frame.size.width-heartWidth)/2, (self.view.frame.size.height-heartHeight)/2, heartWidth, heartHeight)];

 heartView.rate = 0.5;
 heartView.lineWidth = 1;
 heartView.strokeColor = [UIColor blackColor];
 heartView.fillColor = [UIColor redColor];
 heartView.backgroundColor = [UIColor clearColor];
 [self.view addSubview:heartView];

 [self loadSlider];
}

- (void)loadSlider
{
 UISlider *valueSlider = [[UISlider alloc]initWithFrame:CGRectMake((self.view.frame.size.width-300)/2, self.view.frame.size.height-150, 300, 50)];
 valueSlider.minimumValue = 0.0;
 valueSlider.maximumValue = 1.0;
 valueSlider.value = 0.5;
 [valueSlider addTarget:self action:@selector(valueChangedAction:) forControlEvents:UIControlEventValueChanged];
 [self.view addSubview:valueSlider];
}

- (void)valueChangedAction:(UISlider*)slider
{
 heartView.rate = slider.value;
}

- (void)didReceiveMemoryWarning {
 [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.
}

@end

这里我添加了一个slider,为了实现随意设置爱心填充的rate。

哈,下面就是看看效果了:

以上就是本文的全部内容,希望对大家的学习有所帮助,快点制作属于自己浪漫爱心送给自己吧。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ios
爱心
ios开发 绘制爱心、ps绘制爱心、canvas绘制爱心、ai绘制爱心、flash 绘制爱心,以便于您获取更多的相关知识。

时间: 2024-10-29 11:38:18

iOS绘制专属于程序猿的浪漫爱心_IOS的相关文章

程序猿浪漫表白

问题描述 想多了吧,程序猿何来浪漫可言不应该都是宅男,天天呆在公司家里啃方便面么不过,看到这个,觉得程序猿一旦动心,还是挺有钱途的http://www.qfans.net/love/1/love_qs/love.htm那么问题来了我自己想仿造做一个,为了轻松,只追求重新填字,保留效果但是目前用3v的免费空间,只能更改字,不能保留效果无论从天而降的红心,和跟随鼠标移动的表白语句,都无法保留下来不知道有没有大神能帮我做效果来,解决问题或者给个更好的版本谢过了,祝大家都有女朋友...哈哈 解决方案 解

iOS APP体验设计:从程序猿和设计湿说起

iOS APP体验设计不像互联网的体验设计那样,有一堆的方法论和可以"借鉴"的案例. 目前除了苹果的<Human Interface Guidelines>和前Palm的<Zen of Palm>外,没有找到更好的设计哲学和方法论. 事实上,即便认真地研读了HIG和Zen of Palm,甚至是Oolon Colluphid的哲学巨作你也无法严格按照Guideline设计出一款出色的APP.其原因,得从程序猿和设计湿说起. 程序猿 vs 设计湿 最被思想处于上世

iOS程序猿如何快速掌握 PHP,化身&amp;quot;全栈攻城狮&amp;quot;?

这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一门后台开发语言.后台开发语言,就是以"数据接口"的形式出现在我们的开发文档的那个东西!掌握PHP,无论对自己目前的iOS开发工作还是以后个人职场生涯的长久发展,都会大有裨益!最重要的是,PHP本身不是一个玩具语言,而是目前相当一部分公司仍然在用的后台开发语言,甚至包括你目前的公司;这篇文章

iOS程序猿如何快速掌握 PHP,化身&quot;全栈攻城狮&quot;?

这是一篇以 iOS 开发人员的视角写给广大iOS 程序猿的 PHP 入门指南.在这篇文章里我努力去发掘 objectiv-c 与 php 之间的共性,来帮助有一定 iOS 开发经验的攻城狮来快速上手一门后台开发语言.后台开发语言,就是以"数据接口"的形式出现在我们的开发文档的那个东西!掌握PHP,无论对自己目前的iOS开发工作还是以后个人职场生涯的长久发展,都会大有裨益!最重要的是,PHP本身不是一个玩具语言,而是目前相当一部分公司仍然在用的后台开发语言,甚至包括你目前的公司;这篇文章

高逼格!程序猿的表白也可以这么浪漫

程序猿是什么样一个群体?很多人都认为程序猿木讷,去邻家妹妹家只有一个目的:修电脑.程序猿还会经常加班,很少陪女朋友,女朋友不舒服只会让她们多喝热水,女朋友生起气来可能在他们眼里就是一段出了BUG的代码,当然前提是他们要有女朋友-- 但是,我们不能一句话否定所有人,还有很多程序猿会利用自己的优势,追求自己所爱.其勇气还是值得肯定的.而且作为拥有高贵身份的程序猿,往往不鸣则已,一鸣惊人,不经意间就搞了个大事情,甚至冒着丢掉饭碗的危险也无所畏惧,挖空心思就是要对女神表达爱意. 坠入爱河的猿猿到底会搞个

程序猿与设计狮之间的那些事儿

  很久没聊过设计师职场了,今天说回那个千古难题:工程师与设计师的1像素之争.设计师认为一像素至关重要,非改不可,工程师认为小题大做,精力没花在刀刃上,有的设计师也容易因此沮丧,如果你是其中之一,推荐来看会代码的设计师如何解决这件事. @JingDesign :无意挑起所谓的职位之间的矛盾,直到今天看到这样一篇文章的时候,是的,这是一篇关于程序猿和设计狮之间的文章,起源是这样的,一位网友在某社区上提了一个问题: 开发人员拒绝按照 UI 标注还原设计,如何让他理解精确还原的重要性,从而去修改代码?

惊!十二星座程序猿竟然这样写代码

水瓶座 大概只有水瓶座的程序猿可以做到代码神秘到无人能解. 水瓶座,属于风系星座.常被称为"天才星座"或"未来星座".他们较着重于精神层次的提升,是很好的启发对象.对于编程,也是如此.水瓶座程序猿的代码中充满了各种天马行空的奇思妙想,同样也含纳着一般人没法理解的抽象. 双鱼座 如果说水瓶座程序猿写的代码是来自外太空的探险童话,那双鱼座程序员的代码就是浪漫的诗歌,字里行间都是普希金和海子的诗句.众所周知,双鱼座是极其细腻感性化的一个星座,哪怕是编程这种极富逻辑的东西,

程序猿转型AI必须知道的几件事!

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 历史上AI火过两次,但是最终都已销声匿迹作为结束.这次AI大火的原因:AlphaGo 4比1战胜李世石,相对于一些外行人的恐慌和恐惧,其实很多业内人员在这场世纪之战结束后,都为人类点上了一个大大的赞.因为对于了解AlphaGo背后技术的那些人来说,人类有如此的计算能力和宏观把握能力已经很了不起了.但是,就在前不久AlphaGo2.0在乌镇完胜了柯洁.事实还是证明了人类在某些方面还是有一定的缺陷,毕竟万事万物都

文艺范儿的程序猿和攻城狮们

文艺范儿的程序猿和攻城狮们 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 1. 2. 我该如何责备你,我的程序猿 --- 老帅          你的逻辑是云深不知处,自己都找不到归路:你的代