扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
众所周知, UIImageView 在drawrect方法中是不走的,也就是继承UIImageView的子控件,无法在drawrect方法中重新绘制,因为该方法是失效的。
成都创新互联公司服务项目包括秀峰网站建设、秀峰网站制作、秀峰网页制作以及秀峰网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,秀峰网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到秀峰省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
- (void)drawRect:(CGRect)rect {
// Drawing code
CGFloatwidth =CGRectGetWidth(rect);
CGFloatheight =CGRectGetHeight(rect);
CGFloatradius = widthheight?height/2.0:width/2.0;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path,NULL, width/2.0, height/2.0, radius,0,2*M_PI,YES);
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame= rect;
maskLayer.path= path;
self.layer.mask= maskLayer;
}
那么怎样才能让UIImageview绘制出圆形呢?需要让他走绘制的方法,如果不能走drawrect,那么采用他还会走什么方法呢?答案是layoutSubviews, 把方法写在layoutSubviews里面即可。
#import "HZRoundImageView.h"
@implementationHZRoundImageView
- (instancetype)initWithFrame:(CGRect)frame {
if(self= [superinitWithFrame:frame]) {
}
return self;
}
- (void)layoutSubviews {
CGRectrect =self.bounds;
// Drawing code
CGFloatwidth =CGRectGetWidth(rect);
CGFloatheight =CGRectGetHeight(rect);
CGFloatradius = widthheight?height/2.0:width/2.0;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddArc(path,NULL, width/2.0, height/2.0, radius,0,2*M_PI,YES);
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame= rect;
maskLayer.path= path;
self.layer.mask= maskLayer;
}
然后在其他地方调用, 无论是使用initWithFrame方法还是autolayout都可以变成圆形。
调用一个例子如下:
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initUI];
}
- (void)initUI {
HZRoundImageView *imageView = [[HZRoundImageView alloc]initWithFrame:CGRectMake(100,100,100,150)];
[self.view addSubview:imageView];
[imageView setBackgroundColor:[UIColor greenColor]];
[imageView setImage:[UIImageimageNamed:@"bbs_item0"]];
imageView.layer.masksToBounds=YES;
[imageView mas_makeConstraints:^(MASConstraintMaker*make) {
make.center.equalTo(self.view);
make.width.equalTo(self.view).multipliedBy(0.8);
make.height.equalTo(self.view).multipliedBy(0.8);
}];
}
效果如上图。
ios中catransition实现动画圆形翻转程序:
#define kDegreesToRadian(x) (M_PI * (x) / 180.0 )
#define kRadianToDegrees(radian) (radian* 180.0 )/(M_PI)
- ( void )viewDidLoad
{
[ super viewDidLoad ];
self . title = @" 测试动画 " ;
self . view . backgroundColor = [ UIColorlightGrayColor ];
myTest1 = [[ UILabelalloc ] initWithFrame : CGRectMake ( 10 , 100 , 60 , 40 )];
myTest1 . backgroundColor = [ UIColorblueColor ];
myTest1 . textAlignment = NSTextAlignmentCenter ;
myTest1 . text = @" “ ;
myTest1 . textColor = [ UIColorwhiteColor ];
[ self . viewaddSubview : myTest1 ];
[myTest1.layer addAnimation:[self keyframeAnimation:myPah durTimes:5 Rep:MAXFLOAT] forKey:nil];
iOS是由苹果公司开发的移动操作系统 。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等产品上。iOS与苹果的Mac OS X操作系统一样,属于类Unix的商业操作系统。原本这个系统名为iPhone OS,因为iPad,iPhone,iPod touch都使用iPhone OS,所以2010WWDC大会上宣布改名为iOS(iOS为美国Cisco公司网络设备操作系统注册商标,苹果改名已获得Cisco公司授权)。
第一种方法:通过设置layer的属性最简单的一种,但是很影响性能,一般在正常的开发中使用很少.pre t="code" l="cpp"UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
//只需要设置layer层的两个属性
//设置圆角
imageView.layer.cornerRadius = imageView.frame.size.width / 2;
//将多余的部分切掉
imageView.layer.masksToBounds = YES;
[self.view addSubview:imageView];第二种方法:使用贝塞尔曲线UIBezierPath和Core Graphics框架画出一个圆角pre t="code" l="cpp"UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
imageView.image = [UIImage imageNamed:@"1"];
//开始对imageView进行画图
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, [UIScreen mainScreen].scale);
//使用贝塞尔曲线画出一个圆形图
[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width] addClip];
[imageView drawRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
//结束画图
UIGraphicsEndImageContext();
[self.view addSubview:imageView];第三种方法:使用CAShapeLayer和UIBezierPath设置圆角
首先需要导入AVFoundation/AVFoundation.h
pre t="code" l="cpp"#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
imageView.image = [UIImage imageNamed:@"1"];
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
//设置大小
maskLayer.frame = imageView.bounds;
//设置图形样子
maskLayer.path = maskPath.CGPath;
imageView.layer.mask = maskLayer;
[self.view addSubview:imageView];
}
这三种方法中第三种最好,对内存的消耗最少啊,而且渲染快速
具体实现步骤:
实现共享元素
首先要在 AndroidManifest.xml 中为需要这种动画的 Activity 开启这个功能,为此为这里为其写了一个style,注意要放在values-v21的style.xml文件里面。
实现补间动画效果
上面的步骤其实就可以实现共享元素的效果了,那么下面在加上补间动画和圆形缩放动画让整体的效果更好。实现补间动画很简单(这边使用的是渐变的效果)。
整体效果的实现也使用了AppBarLayout,CollapsingToolbarLayout,Toolbar等一些控件进行实现。
1.需要做个这样的圆形进度条
自定义弹窗view就不说了,主要是这个圆形进度view,底色是灰色然后有进度灰色被黑色覆盖或者说变成黑色
首先我们自定一个view,加个uilabel做进度lbael @property ( nonatomic , strong ) UILabel *percentLabel; //数字进度label
进度条进度改变的方法 - ( void )drawprogress:( CGFloat )progress;
环行进度条用calayer来做
动画在UI交互中是一种增强用户体验的利器,目前看到几乎每一个移动App都会使用到各种动画效果。
在IOS开发中实现动画效果通常有三种方式。
可以用来做什么呢:
设置UIView的属性:例如
frame
bounds
center
transform
alpha
backgroundColor
contentStretch
看一下实例:
我们可以看到self.greenView通过UIView Animation动画将某些属性进行了改变。
现在我们适当的加入一些动画执行的方式【options】
在开发中可以添加特定的options满足不同的动画需要。
弹簧效果:
CABasicAnimation 为layer属性提供了基础的帧动画能力,创建一个CABasicAnimation的实例,使用继承自CAPropertyAnimation的animationWithKeyPath:方法,来指定要添加动画的layer属性的keypath
让一个view向左平移,在x方向上从屏幕x中间线型移动到左边消失,耗时1.5秒的动画
KeyPath的改变动画的效果就不一样,开发中改变KeyPath的属性可以实现大多数我们需要的动画执行的效果
用CABasicAnimation执行动画,在动画结束后会回归动画开始前的状态。想要解决的话,必须设置“removedOnCompletion”和“fillMode”这两个属性。
由于在开发过程中光是CABasicAnimation的fromValue、toValue起点和终点设置是无法满足我们希望在动画中途进行更多的变化的需求,所以我们需要认识一下CAKeyframeAnimation
从上面的继承图我们看出CAKeyframeAnimation 比CABasicAnimation多了更多的可设置属性
关键帧动画其实通过一组动画类型的值(或者一个指定的路径)和这些值对应的时间节点以及各时间节点的过渡方式来控制显示的动画。关键帧动画可以通过path属性和values属性来设置动画的关键帧。
可以保存一组动画CAKeyframeAnimation、CABasicAnimation对象,将CAAnimationGroup对象加入图层后,组中所有动画对象可以同时并发运行。
注意:默认情况下,一组动画对象是同时运行的,也可以通过设置单个动画对象的beginTime属性来更改动画的开始时间,单个动画的执行效果可以与动画组执行效果属性分开设定,根据需要调整改变。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流