自己画View其实没那么可怕
2017-03-02 16:49
260 查看
身边好多 刚入行的朋友 特别恐惧 自己画 控件 其实 这个东西 并不是太难 (主要归功于苹果的工程师们 , 因为OC最接近自然语言) , 现在 我们就 画一个渐变色的VIew (我就用一些特别low的 方式 一步步 说一说过程, <=.= 网上一查 一大把嘿嘿>)
- (void)creatGround {
//创建CGContextRef
//这句话 可以理解为 创建一张画布 字面上看着 就是说 开始绘制 上下文 括号里的就是 画布的大小啦
UIGraphicsBeginImageContext(self.bounds.size);
//重绘图像
CGContextRef gc =
UIGraphicsGetCurrentContext();
//创建CGMutablePathRef就是 绘画的路径 可以当成 铅笔的走向 这里设定的是 可变的 也就是 可以动的
CGMutablePathRef path =CGPathCreateMutable();
//绘制Path(这里就是 点到点的 走向啦 点动成线 线动成面 完美的诠释了这句话 )
// 设置 范围 (就是你的铅笔可以瞎几把画的范围, 这里是父视图的全范围)
CGRect rect =CGRectMake(0,0,
self.frame.size.width,self.frame.size.height);
//不要被MoveToPoint 的只管翻译意思蒙蔽了, 这个其实就 起点
CGPathMoveToPoint(path,NULL,
CGRectGetMinX(rect),0);
//(特别注意 OC 画图 是逆时针走向的 比如 口 先画竖线 再画 横 在往上 再往左)
CGPathAddLineToPoint(path,NULL,
0,CGRectGetMaxY(rect));
// CGPathAddLineToPoint 里面的参数 就不说了 试着去改一改 看看效果就知道了
CGPathAddLineToPoint(path,NULL,
CGRectGetWidth(rect),CGRectGetMaxY(rect));
CGPathAddLineToPoint(path,NULL,
CGRectGetWidth(rect),0);
//结束 回归起点 (就是闭合 从最后的Point 链接到原点 )
CGPathCloseSubpath(path);
//绘制渐变
[selfdrawLinearGradient:gcpath:path
startColor:UWPink.CGColorendColor:[UIColorhx_colorWithHexRGBAString:@"#f54f68"].CGColor];
//注意释放CGMutablePathRef
CGPathRelease(path);
//从Context中获取图像,并显示在界面上
UIImage *img =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageViewalloc]
initWithImage:img];
[selfaddSubview:imgView];
}
- (void)drawLinearGradient:(CGContextRef)context
path:(CGPathRef)path
startColor:(CGColorRef)startColor
endColor:(CGColorRef)endColor
{
CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = {0.0,1.0
};
NSArray *colors =@[(__bridgeid)
startColor, (__bridgeid) endColor];
CGGradientRef gradient =CGGradientCreateWithColors(colorSpace,
(__bridgeCFArrayRef) colors, locations);
CGRect pathRect =CGPathGetBoundingBox(path);
//具体方向可根据需求修改
CGPoint startPoint =CGPointMake(CGRectGetMinX(pathRect),0);
CGPoint endPoint =CGPointMake(CGRectGetMinX(pathRect),CGRectGetMaxY(pathRect));
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint,0);
CGContextRestoreGState(context);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
/*复制粘贴 拿起键盘就是干*/
---------------------------没法再丑的博客------------------
- (void)creatGround {
//创建CGContextRef
//这句话 可以理解为 创建一张画布 字面上看着 就是说 开始绘制 上下文 括号里的就是 画布的大小啦
UIGraphicsBeginImageContext(self.bounds.size);
//重绘图像
CGContextRef gc =
UIGraphicsGetCurrentContext();
//创建CGMutablePathRef就是 绘画的路径 可以当成 铅笔的走向 这里设定的是 可变的 也就是 可以动的
CGMutablePathRef path =CGPathCreateMutable();
//绘制Path(这里就是 点到点的 走向啦 点动成线 线动成面 完美的诠释了这句话 )
// 设置 范围 (就是你的铅笔可以瞎几把画的范围, 这里是父视图的全范围)
CGRect rect =CGRectMake(0,0,
self.frame.size.width,self.frame.size.height);
//不要被MoveToPoint 的只管翻译意思蒙蔽了, 这个其实就 起点
CGPathMoveToPoint(path,NULL,
CGRectGetMinX(rect),0);
//(特别注意 OC 画图 是逆时针走向的 比如 口 先画竖线 再画 横 在往上 再往左)
CGPathAddLineToPoint(path,NULL,
0,CGRectGetMaxY(rect));
// CGPathAddLineToPoint 里面的参数 就不说了 试着去改一改 看看效果就知道了
CGPathAddLineToPoint(path,NULL,
CGRectGetWidth(rect),CGRectGetMaxY(rect));
CGPathAddLineToPoint(path,NULL,
CGRectGetWidth(rect),0);
//结束 回归起点 (就是闭合 从最后的Point 链接到原点 )
CGPathCloseSubpath(path);
//绘制渐变
[selfdrawLinearGradient:gcpath:path
startColor:UWPink.CGColorendColor:[UIColorhx_colorWithHexRGBAString:@"#f54f68"].CGColor];
//注意释放CGMutablePathRef
CGPathRelease(path);
//从Context中获取图像,并显示在界面上
UIImage *img =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imgView = [[UIImageViewalloc]
initWithImage:img];
[selfaddSubview:imgView];
}
- (void)drawLinearGradient:(CGContextRef)context
path:(CGPathRef)path
startColor:(CGColorRef)startColor
endColor:(CGColorRef)endColor
{
CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = {0.0,1.0
};
NSArray *colors =@[(__bridgeid)
startColor, (__bridgeid) endColor];
CGGradientRef gradient =CGGradientCreateWithColors(colorSpace,
(__bridgeCFArrayRef) colors, locations);
CGRect pathRect =CGPathGetBoundingBox(path);
//具体方向可根据需求修改
CGPoint startPoint =CGPointMake(CGRectGetMinX(pathRect),0);
CGPoint endPoint =CGPointMake(CGRectGetMinX(pathRect),CGRectGetMaxY(pathRect));
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint,0);
CGContextRestoreGState(context);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
/*复制粘贴 拿起键盘就是干*/
---------------------------没法再丑的博客------------------
相关文章推荐
- 要知道其实自己并没有那么出众,你若盛开,清风自来!(低要求,高行动)
- 把自己当成打工的,一辈子都是打工的(太精彩了,怀着创业的心态,那么你在什么状态都可以叫创业,深入实践与学习就是创业,鼓励创业其实是鼓励创业的精神,成立公司只是一种形式,虚荣心没有意义)
- 看看多线程,其实没那么可怕----小话多线程(1)
- 人生感悟:你其实远没有自己想象中那么努力
- 看看多线程,其实没那么可怕----小话多线程(1)
- 其实自己喜欢说的话就是那么几句,不信你看看
- 自定义View没那么可怕~进度圈
- 其实也因为和自己产生了那么点的共鸣,私自想留下当成经验
- webpack其实没那么可怕——官方文档解读
- 如何在Eclipse PDE的Error Log View中显示自己的Log
- 有些很简单的问题,自己做起来却是那么复杂
- 其实事情没有想象的那么难
- 为什么自己脾气总是那么坏
- 理解I/O Completion Port(先转帖一下吧,其实很多东西有自己的讲解,以后再更新)
- 呵呵,自己总是那么好运。上网找到一本liunx的菜鸟专用书。
- 技术的贡献率其实并没有你原来想象的那么高
- 根据C++标准,如果const的引用被初始化为对一个临时变量的引用,那么它会使这个临时变量的生命期变得和它自己一样
- [外包速递] 开发者其实就差那么一点——让CSDN放大你的成长!
- 这个问题也常有人会来问,其实想要别人看不到真实ip,那么穿梭或者用代理,
- 原来自己做的服务器漏洞是那么的多