2013-02-17 27 views
12

Mặc dù tôi đã đặt câu hỏi này trước đây, tôi muốn liên hệ lại để làm rõ những gì tôi muốn thực hiện với sự giúp đỡ của bạn. Tôi đã tự hỏi làm thế nào bạn sẽ tạo ra một nền tảng và ứng dụng iOS trong xCode tương tự như nền của ứng dụng thời tiết năng lượng mặt trời (ảnh chụp màn hình cung cấp) mà thay đổi chút ít theo thời gian (trong một chu kỳ). Như bạn có thể thấy gradient rất trơn tru và rõ ràng chứa hơn hai điểm chính. Bất kỳ trợ giúp nào về ví dụ hoặc đoạn mã sẽ được đánh giá cao. Cảm ơn lần nữa, Ben.Tạo nền gradient động tương tự như Ứng dụng thời tiết năng lượng mặt trời trong xCode

Screenshot 1 Screenshot 2

Trả lời

16

Những gì tôi cần là:

  1. thêm một CAGradientLayer để điều khiển của bạn xem (hoặc xem tùy chỉnh), ví dụ:

    @property (nonatomic, retain) CAGradientLayer *gradient; 
    
  2. Trong điều khiển xem của bạn , trong viewDidLoad, tạo và thêm lớp gradient vào chế độ xem của bạn:

    self.gradient = [CAGradientLayer layer]; 
    gradient.frame = self.view.bounds; 
    gradient.colors = [NSArray arrayWithObjects: 
           (id)topColor.CGColor, 
           (id)bottomColor.CGColor, 
           nil]; 
    gradient.locations = [NSArray arrayWithObjects: 
            [NSNumber numberWithFloat:0.0f], 
            [NSNumber numberWithFloat:0.7], 
            nil]; 
    [self.view.layer addSublayer:self.gradient]; 
    

    3a. thêm một NSTimer để điều khiển của bạn mà sẽ cập nhật self.gradient trong khoảng thời gian thích hợp bằng cách thực hiện:

    topColor = ...; bottomColor = ...; 
        NSArray* newColors = [NSArray arrayWithObjects: 
           (id)topColor.CGColor, 
           (id)bottomColor.CGColor, 
           nil]; 
    [(CAGradientLayer *)self.layer setColors:newColors]; 
    

    này sẽ cho phép bạn quyết định chính xác mà màu sắc mà bạn muốn sử dụng cho gradient tại mỗi bước. Nếu không, bạn có thể thử với một hoạt ảnh như sau:

    3b. thêm các hình ảnh động như thế này,

    - (void)animateLayer... { 
    
        [UIView animateWithDuration:duration 
             delay:0 
             options:UIViewAnimationOptionCurveEaseInOut 
            animations:^{ 
        [CATransaction begin]; 
        [CATransaction setAnimationDuration:duration]; 
    
         topColor = ...; bottomColor = ...; 
         NSArray* newColors = [NSArray arrayWithObjects: 
           (id)topColor.CGColor, 
           (id)bottomColor.CGColor, 
           nil]; 
        [(CAGradientLayer *)self.layer setColors:newColors]; 
    
        [CATransaction commit]; 
        } 
          completion:^(BOOL b) { 
           [self animateLayer..]; 
          }]; 
    } 
    

Bạn cũng có thể kết hợp 3a và 3b.

+0

Cách thức và địa điểm sẽ triển khai 3b ở đâu? –

+0

3b đã cung cấp cho bạn một hoạt ảnh trong một thời hạn nhất định; vì vậy bạn chỉ cần gói nó vào một phương thức và gọi nó (ví dụ: từ viewDidLoad); bạn cần sau đó cung cấp một cơ chế để nó được lặp lại sau 'duration' giây; cho rằng bạn có thể sử dụng bộ hẹn giờ hoặc sử dụng khối 'hoàn thành' cho hoạt ảnh. Tôi đã mở rộng câu trả lời của mình để tính đến điều này. – sergio

+1

Mã này, khi được triển khai như bạn đã nói có một số lỗi: Sử dụng số nhận dạng không khai báo, topColor; Thuộc tính 'giới hạn' không được tìm thấy trên loại đối tượng "Xem trình điều khiển *" chẳng hạn. –

13

Ví dụ đơn giản làm việc:

tập tin .h

@property (strong, nonatomic) CAGradientLayer *gradient; 

tập tin .m

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear: animated]; 

    self.gradient = [CAGradientLayer layer]; 
    self.gradient.frame = self.view.bounds; 
    self.gradient.colors = @[(id)[UIColor purpleColor].CGColor, 
          (id)[UIColor redColor].CGColor]; 

    [self.view.layer insertSublayer:self.gradient atIndex:0]; 

    [self animateLayer]; 
} 

-(void)animateLayer 
{ 

    NSArray *fromColors = self.gradient.colors; 
    NSArray *toColors = @[(id)[UIColor redColor].CGColor, 
          (id)[UIColor orangeColor].CGColor]; 

    [self.gradient setColors:toColors]; 

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"colors"]; 

    animation.fromValue    = fromColors; 
    animation.toValue    = toColors; 
    animation.duration    = 3.00; 
    animation.removedOnCompletion = YES; 
    animation.fillMode    = kCAFillModeForwards; 
    animation.timingFunction  = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; 
    animation.delegate    = self; 

    // Add the animation to our layer 

    [self.gradient addAnimation:animation forKey:@"animateGradient"]; 
} 

Bạn có thể muốn thực hiện một phương pháp bổ sung để chuyển màu sắc, và sau đó reanimate những thay đổi . Nhưng điều này sẽ giúp bạn đạt được điều đó.

+0

Tôi đã có thể áp dụng điều này một cách nhanh chóng, tuy nhiên khi hoạt ảnh được hoàn thành, nó sẽ thay đổi về màu đầu tiên. Làm cách nào để chuyển đổi dòng này trong [set.gifient setColors: toColors] nhanh chóng? thanks – DrPatience

+2

Đơn giản: 'self.gradient.colors = toColors' – TheTiger

+0

Nó cũng là một thực hành tốt để bao gồm một cuộc gọi đến' super' trong 'viewDidAppear' của bạn. – smaili

Các vấn đề liên quan