我尝试实现4 CGPoint
个值的动画。没有成功。这里是界面。
@interface PlateCorners : NSObject
@property (nonatomic) CGPoint tl;
@property (nonatomic) CGPoint tr;
@property (nonatomic) CGPoint br;
@property (nonatomic) CGPoint bl;
+ (instancetype)cornTL:(CGFloat)TLx :(CGFloat)TLy
TR:(CGFloat)TRx :(CGFloat)TRy
BL:(CGFloat)BRx :(CGFloat)BRy
BL:(CGFloat)BLx :(CGFloat)BLy;
@end
@interface VisualizerView : UIView
@property (nonatomic) PlateCorners *corners;
- (void)animateCornersTo:(PlateCorners *)corners;
@end
并实施:
- (void)animateCornersTo:(PlateCorners *)corners {
if (!self.corners) {
self.corners = corners;
return;
}
NSArray *keys = @[@"tl", @"tr", @"bl", @"br"];
NSArray *values = @[[NSValue valueWithCGPoint:corners.tl],
[NSValue valueWithCGPoint:corners.tr],
[NSValue valueWithCGPoint:corners.bl],
[NSValue valueWithCGPoint:corners.br]];
for (NSInteger i = 0; i < keys.count; i++) {
POPBasicAnimation *anim = [self.corners pop_animationForKey:keys[i]];
if (anim) {
anim.toValue = values[i];
} else {
anim = [POPBasicAnimation easeOutAnimation];
anim.property = [POPAnimatableProperty propertyWithName:keys[i] initializer:^(POPMutableAnimatableProperty *prop) {
prop.readBlock = ^(id obj, CGFloat values[]) {
CGPoint p = [[obj objectForKey:keys[i]] CGPointValue];
values[0] = p.x;
values[1] = p.y;
};
// write value
prop.writeBlock = ^(id obj, const CGFloat values[]) {
[obj setObject:[NSValue valueWithCGPoint:CGPointMake(values[0], values[1])]
forKey:keys[i]];
};
// dynamics threshold
prop.threshold = 0.01;
}];
anim.toValue = values[i];
anim.duration = 0.2;
[self.corners pop_addAnimation:anim forKey:keys[i]];
}
}
}
不起作用。尝试这一点,但仍然没有成功。
- (POPAnimatableProperty *)animatableCorners {
return [POPAnimatableProperty propertyWithName:@"corners" initializer:^(POPMutableAnimatableProperty *prop) {
// read value
prop.readBlock = ^(PlateCorners *obj, CGFloat values[]) {
values[0] = obj.tl.x;
values[1] = obj.tl.y;
values[2] = obj.tr.x;
values[3] = obj.tr.y;
values[4] = obj.br.x;
values[5] = obj.br.y;
values[6] = obj.bl.x;
values[7] = obj.bl.y;
};
// write value
prop.writeBlock = ^(id obj, const CGFloat values[]) {
[obj setCorners:[PlateCorners cornTL:values[0] :values[1]
TR:values[2] :values[3]
BL:values[4] :values[5]
BL:values[6] :values[7]]];
};
// dynamics threshold
prop.threshold = 0.01;
}];
}