心形加载的view
效果:
素材图片:
源码:
StarView.h 与 StarView.m
//
// StarView.h
// Star
//
// Created by XianMingYou on 15/3/13.
// Copyright (c) 2015年 XianMingYou. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface StarView : UIView
@property (nonatomic, strong) UIColor *backgroundViewColor;
@property (nonatomic, strong) UIColor *animationViewColor;
@property (nonatomic, assign) NSTimeInterval animationDuration;
+ (instancetype)createWithFrame:(CGRect)frame
backgroundViewColor:(UIColor *)bgColor
animationViewColor:(UIColor *)anColor;
- (void)percent:(CGFloat)percent animated:(BOOL)animated;
@end
//
// StarView.m
// Star
//
// Created by XianMingYou on 15/3/13.
// Copyright (c) 2015年 XianMingYou. All rights reserved.
//
#import "StarView.h"
#import "UIView+SetRect.h"
@interface StarView ()
@property (nonatomic, strong) UIImageView *imageView; // 图片
@property (nonatomic, strong) UIView *backgroundView; // 背景色View
@property (nonatomic, strong) UIView *animationView; // 做动画的View
@property (nonatomic) CGFloat height;
@property (nonatomic) CGFloat width;
@end
@implementation StarView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.masksToBounds = YES;
self.height = frame.size.height;
self.width = frame.size.width;
[self addSubview:self.backgroundView];
[self addSubview:self.animationView];
[self initImageView];
}
return self;
}
- (void)initImageView {
self.imageView = [[UIImageView alloc] initWithFrame:self.bounds];
self.imageView.image = [UIImage imageNamed:@"star"];
[self addSubview:self.imageView];
}
- (void)percent:(CGFloat)percent animated:(BOOL)animated {
// 过滤percent
if (percent <= 0) {
percent = 0;
} else if (percent >= 1) {
percent = 1;
}
if (animated == NO) {
CGFloat positionY = self.height * (1 - percent);
_animationView.y = positionY;
} else {
CGFloat positionY = self.height * (1 - percent);
[UIView animateWithDuration:(self.animationDuration <= 0 ? 0.5 : self.animationDuration)
animations:^{
_animationView.y = positionY;
}];
}
}
+ (instancetype)createWithFrame:(CGRect)frame
backgroundViewColor:(UIColor *)bgColor
animationViewColor:(UIColor *)anColor {
StarView *star = [[StarView alloc] initWithFrame:frame];
star.backgroundViewColor = bgColor;
star.animationViewColor = anColor;
return star;
}
@synthesize backgroundView = _backgroundView;
- (UIView *)backgroundView {
if (_backgroundView == nil) {
_backgroundView = [[UIView alloc] initWithFrame:self.bounds];
}
return _backgroundView;
}
@synthesize animationView = _animationView;
- (UIView *)animationView {
if (_animationView == nil) {
_animationView = [[UIView alloc] initWithFrame:CGRectMake(0, self.height, self.width, self.height)];
}
return _animationView;
}
@synthesize backgroundViewColor = _backgroundViewColor;
- (UIColor *)backgroundViewColor {
return _backgroundViewColor;
}
- (void)setBackgroundViewColor:(UIColor *)backgroundViewColor {
_backgroundViewColor = backgroundViewColor;
_backgroundView.backgroundColor = backgroundViewColor;
}
@synthesize animationViewColor = _animationViewColor;
- (UIColor *)animationViewColor {
return _animationViewColor;
}
- (void)setAnimationViewColor:(UIColor *)animationViewColor {
_animationViewColor = animationViewColor;
_animationView.backgroundColor = animationViewColor;
}
@end
辅助文件 UIView+SetRect.h 与 UIView+SetRect.m
//
// UIView+SetRect.h
// TestPch
//
// Created by YouXianMing on 14-12-26.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface UIView (SetRect)
// Frame
@property (nonatomic) CGPoint viewOrigin;
@property (nonatomic) CGSize viewSize;
// Frame Origin
@property (nonatomic) CGFloat x;
@property (nonatomic) CGFloat y;
// Frame Size
@property (nonatomic) CGFloat width;
@property (nonatomic) CGFloat height;
// Frame Borders
@property (nonatomic) CGFloat top;
@property (nonatomic) CGFloat left;
@property (nonatomic) CGFloat bottom;
@property (nonatomic) CGFloat right;
// Center Point
#if !IS_IOS_DEVICE
@property (nonatomic) CGPoint center;
#endif
@property (nonatomic) CGFloat centerX;
@property (nonatomic) CGFloat centerY;
// Middle Point
@property (nonatomic, readonly) CGPoint middlePoint;
@property (nonatomic, readonly) CGFloat middleX;
@property (nonatomic, readonly) CGFloat middleY;
@property (nonatomic, assign) CGFloat cornerRadius ;
@property (nonatomic ,assign) BOOL round ;
@end
//
// UIView+SetRect.m
// TestPch
//
// Created by YouXianMing on 14-12-26.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
//
#import "UIView+SetRect.h"
@implementation UIView (SetRect)
#pragma mark Frame
- (CGPoint)viewOrigin
{
return self.frame.origin;
}
- (void)setViewOrigin:(CGPoint)newOrigin
{
CGRect newFrame = self.frame;
newFrame.origin = newOrigin;
self.frame = newFrame;
}
- (CGSize)viewSize
{
return self.frame.size;
}
- (void)setViewSize:(CGSize)newSize
{
CGRect newFrame = self.frame;
newFrame.size = newSize;
self.frame = newFrame;
}
#pragma mark Frame Origin
- (CGFloat)x
{
return self.frame.origin.x;
}
- (void)setX:(CGFloat)newX
{
CGRect newFrame = self.frame;
newFrame.origin.x = newX;
self.frame = newFrame;
}
- (CGFloat)y
{
return self.frame.origin.y;
}
- (void)setY:(CGFloat)newY
{
CGRect newFrame = self.frame;
newFrame.origin.y = newY;
self.frame = newFrame;
}
#pragma mark Frame Size
- (CGFloat)height
{
return self.frame.size.height;
}
- (void)setHeight:(CGFloat)newHeight
{
CGRect newFrame = self.frame;
newFrame.size.height = newHeight;
self.frame = newFrame;
}
- (CGFloat)width
{
return self.frame.size.width;
}
- (void)setWidth:(CGFloat)newWidth
{
CGRect newFrame = self.frame;
newFrame.size.width = newWidth;
self.frame = newFrame;
}
#pragma mark Frame Borders
- (CGFloat)left
{
return self.x;
}
- (void)setLeft:(CGFloat)left
{
self.x = left;
}
- (CGFloat)right
{
return self.frame.origin.x + self.frame.size.width;
}
- (void)setRight:(CGFloat)right
{
self.x = right - self.width;
}
- (CGFloat)top
{
return self.y;
}
- (void)setTop:(CGFloat)top
{
self.y = top;
}
- (CGFloat)bottom
{
return self.frame.origin.y + self.frame.size.height;
}
- (void)setBottom:(CGFloat)bottom
{
self.y = bottom - self.height;
}
#pragma mark Center Point
#if !IS_IOS_DEVICE
- (CGPoint)center
{
return CGPointMake(self.left + self.middleX, self.top + self.middleY);
}
- (void)setCenter:(CGPoint)newCenter
{
self.left = newCenter.x - self.middleX;
self.top = newCenter.y - self.middleY;
}
#endif
- (CGFloat)centerX
{
return self.center.x;
}
- (void)setCenterX:(CGFloat)newCenterX
{
self.center = CGPointMake(newCenterX, self.center.y);
}
- (CGFloat)centerY
{
return self.center.y;
}
- (void)setCenterY:(CGFloat)newCenterY
{
self.center = CGPointMake(self.center.x, newCenterY);
}
#pragma mark Middle Point
- (CGPoint)middlePoint
{
return CGPointMake(self.middleX, self.middleY);
}
- (CGFloat)middleX
{
return self.width / 2;
}
- (CGFloat)middleY
{
return self.height / 2;
}
- (void)setCornerRadius:(CGFloat)cornerRadius
{
self.layer.masksToBounds = YES ;
self.layer.cornerRadius = cornerRadius ;
}
- (void)setRound:(BOOL)round
{
[self setCornerRadius:self.height/2];
}
- (CGFloat)cornerRadius
{
return self.layer.cornerRadius ;
}
- (BOOL)round
{
return NO ;
}
@end
使用时候的源码:
//
// ViewController.m
// Star
//
// Created by XianMingYou on 15/3/13.
// Copyright (c) 2015年 XianMingYou. All rights reserved.
//
#import "ViewController.h"
#import "StarView.h"
@interface ViewController ()
@property (nonatomic, strong) StarView *star;
@property (nonatomic, strong) NSTimer *timer;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.star = [StarView createWithFrame:CGRectMake(0, 0, 100, 100)
backgroundViewColor:[[UIColor redColor] colorWithAlphaComponent:0.05f]
animationViewColor:[[UIColor redColor] colorWithAlphaComponent:0.5f]];
self.star.animationDuration = 1.f;
self.star.center = self.view.center;
[self.view addSubview:self.star];
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.5f
target:self
selector:@selector(timerEvent:)
userInfo:nil
repeats:YES];
}
- (void)timerEvent:(id)sender {
CGFloat percent = arc4random() % 100 / 100.f;
[self.star percent:percent animated:YES];
}
@end