2017-02-07 3 views
1

내가 무엇을 가지고 : 하위 계층으로 CAGradientLayer을 가지고UIView의 프레임과 하위 레이어 중 하나의 프레임을 애니메이션으로 만드는 방법은 무엇입니까?

내가 (PVIEW 이름) UIView의가 있습니다. 실제로 이것이다 : ->보기 - 의 ViewController> PVIEW -> CAGradientLayer

이이 모든 생성하는 코드입니다 : 나는 일단

을 할 노력하고있어 무엇

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UITestView * pView = nil; 
    UIColor * scolor = nil, *ecolor = nil; 
    self.view.backgroundColor = [UIColor yellowColor]; 

    pView = [[UITestView alloc] initWithFrame: CGRectMake(self.view.frame.origin.x, 100.0, self.view.frame.size.width, 100.0)]; 
    scolor = [UIColor colorWithRed:(14/255.0) green: (238/255.0) blue:(123/255.0) alpha:1]; 
    ecolor = [UIColor colorWithRed:(6/255.0) green: (216/255.0) blue:(69/255.0) alpha:1]; 

    // creating the gradient layer  
    CAGradientLayer * layer = [[CAGradientLayer alloc] init]; 
    layer.frame = self.bounds; 
    layer.colors = @[(id)scolor.CGColor,(id)ecolor.CGColor]; 
    [pView.layer insertSublayer:layer atIndex:0]; 

    // creating a tapGestureRecognizer 
    [pView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapInViews:)]]; 
    [self.view addSubview:pView]; 

    touched = NO; 
} 
.... 
@end 

탭 동작이 pView에서 감지 됨 pView의 높이를 100.0으로 늘리려고하지만 애니메이션으로 표시하려고합니다. 이전에 pView를 건드린 경우 (높이가 이미 100.0만큼 증가한 경우) pView의 높이를 100.0으로 낮추고 싶습니다. 즉, 원래 크기로 되돌립니다.

내가 이미 알고

내가 알고 내가 또한 PVIEW에 부착 된 CAGradientLayer의 프레임 (또는 범위)을 변경해야합니다 PVIEW의 프레임을 변경하려면 때문이다. 이러한 변경 사항을 애니메이션으로 적용하고 싶으므로이 애니메이션이 동시에 발생하고 기간이 같아야합니다.

레이어의 프레임 (또는 경계)은 애니메이션 블록 내에서만 애니메이션 가능하다는 것을 알고 있습니다.

내가 무엇을 :

이이 옵션 I했습니다 시험 :

- (void) handleTapInViews: (nonnull UITapGestureRecognizer *) sender { 
    pView = sender.view; 

    if (touched) { 
    [UIView animateWithDuration:0.4 animations:^{ 

     pView.frame = CGRectMake(pView.frame.origin.x, pView.frame.origin.y, pView.frame.size.width, pView.frame.size.height - 100.0); 
     pView.layer.sublayers[0].frame = pView.bounds; 

     [self.view setNeedsLayout]; 
    } completion:^(BOOL finished) { 
     touched = NO; 
    }]; 

    } 
    else { 
    [UIView animateWithDuration:0.4 animations:^{ 

     pView.frame = CGRectMake(pView.frame.origin.x, pView.frame.origin.y, pView.frame.size.width, pView.frame.size.height + 100.0); 
     pView.layer.sublayers[0].frame = pView.bounds; 

     [self.view setNeedsLayout]; 
    } completion:^(BOOL finished) { 
     touched = YES; 
    }]; 

    } 

} 
이 옵션은 실제로 작동

(즉, PVIEW의 프레임과 레이어 변화의 프레임 둘 다 animatedly)하지만 동기화되지는 않습니다. 즉, 레이어 프레임의 변경 사항은 pView 프레임의 변경 사항보다 약간 더 빠릅니다 (인식 할 수 있음). 이 효과는 pView의 높이를 줄이면 더욱 분명 해집니다.

나는 CABasicAnimation과 CAAnimationGroup에 대해서도 읽어 보았습니다. 레이어의 경계와 위치를 애니메이션으로 나타냅니다. 이 경우에도 레이어의 애니메이션은보기의 애니메이션보다 조금 더 빠릅니다 (인식 할 수 있으며 기간 설정이나 기타에 대해 물어 보는 경우 초 단위가 아닙니다).이 경우 애니메이션 후에 레이어의 경계가 원하는 효과가 아닌 원래 크기로 돌아갑니다. 나는이 마지막 문제가 애니메이션의 끝에 레이어에 새로운 값이 할당되어 고정 될 수 있음을 이미 알고 있지만 확실하게 어디에서 코드를 삽입해야할지 모른다.

내가이 다른 옵션에 대해 읽은 대부분의 다음 링크에서이다 : 어떤 경우에

link1

link2

link3

link4

, ~하다 아무도 내가 이것을 고칠 수있는 방법을 알고 있니? 미리 감사드립니다.

답변

0

글쎄, Polor의 backgroundColor를 ecolor = [UIColor colorWithRed : (6/255.0) green : (216/255.0) blue : (69/255.0) alpha : 1로 설정했다. 이 방법을 사용하면 레이어의 애니메이션에 대해 주석 처리 한 효과가보기의 애니메이션보다 빠르지 만 지금은 눈에 띄지 않습니다. 나는 이것이 아마도 적절한 대답이 아니라고 생각한다.