POP iOS,动画自定义属性

时间:2016-08-06 16:20:06

标签: ios objective-c animation pop

我尝试实现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;
    }];
}

0 个答案:

没有答案