意向:
我想在视图中绘制一个圆圈,我可以从ViewController中移动,调整大小并重新着色。
设定:
我将UIView子类化为创建一个只保持圆圈的视图:
@implementation CircleView
+ (Class)layerClass //override
{
return [CAShapeLayer class];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
self.opaque = NO;
CAShapeLayer *layer = (CAShapeLayer *)self.layer;
layer.fillColor = nil;
layer.strokeColor = [UIColor colorWithWhite:1 alpha:1].CGColor;
layer.lineWidth = 2;
}
return self;
}
-(void) layoutSubviews
{
CAShapeLayer *layer = (CAShapeLayer *)self.layer;
layer.path = [UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
}
@end
然后我在父视图initWithFrame中初始化它:
{
CGFloat diam = MIN(frame.size.width, frame.size.height);
self.circleView = [[VCCCircleView alloc] initWithFrame:ASRectCenteredOnPoint(ASRectGetCenter(frame), (CGSize){diam,diam})];
self.circleView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin;
[self addSubview:self.circleView];
}
最后,父视图还提供了一种动画视图的方法:
-(void)setCircleFrame:(CGRect)frame
{
CAShapeLayer *layer = (CAShapeLayer *)self.circleView.layer;
[UIView animateWithDuration:1 delay:10 options:UIViewAnimationOptionLayoutSubviews animations:^(void)
{
circleView.frame = frame;
//for debug: circleView.frame = CGRectInset(circleView.frame, -30, -30);
} completion:nil];
}
这个想法是你可以设置框架和圆圈将移动和调整大小。简单吧?
问题:
圆圈确实*不*为它的大小变化设置动画,但它确实为它的位置变化设置了动画。 - 结果是它跳转到新的大小,然后动画原点的移动。对于我引入动画的大延迟,这一点尤其明显。
我注意到,如果我只是更改圆圈的位置,则不会调用circleView的layoutSubviews,但如果我更改了界限,则会显示。
我没有使用任何转换。
我尝试了什么:
BeginFromCurrentState
)我没有尝试过: