2013-03-22 15 views
13

Tôi đang thêm CAGradientLayer vào chế độ xem. Khi chế độ xem được tự động thay đổi kích thước (chẳng hạn như sau khi xoay vòng), lớp gradient không được thay đổi kích thước. Gradient có thể được đặt thành tự động thay đổi kích thước giống như chế độ xem không? Cũng lưu ý rằng tôi đang sử dụng các ràng buộc bố cục tự động trong khung nhìn.Làm thế nào để thay đổi kích thước một CAGradientLayer sau khi quay?

Đây là những gì tôi đang làm:

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
    gradientLayer.frame = CGRectMake(0.0, 0.0, frame.size.width, frame.size.height); 
    gradientLayer.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:255.0/255.0f green:255.0/255.0f blue:255.0/255.0f alpha:1.0f] CGColor], 
         (id)[[UIColor colorWithRed:233.0/255.0f green:233.0/255.0f blue:233.0/255.0f alpha:1.0f] CGColor], nil]; 

    [self.layer insertSublayer:gradientLayer atIndex:0]; 
+0

có thể trùng lặp của [CALayer autoresizingMask không dành cho iOS SDK?] (Http://stackoverflow.com/questions/8600826/calayer-autoresizingmask-not-for-ios-sdk) – CodaFi

+0

@CodaFi Câu hỏi hơi khác. Ngoài ra, mặc dù có một câu trả lời được chấp nhận cho câu hỏi đó dường như vô dụng đối với trường hợp này. – memmons

+2

Bạn nói đúng, câu trả lời đó là vô giá trị. Ghi đè '-layoutSubviews' và gán khung của bạn trong đó. – CodaFi

Trả lời

24

Dưới đây là hai cách khác nhau để khắc phục vấn đề của bạn.

  1. Làm gradientLayer biến mẫu thay vì biến cục bộ. Sau đó, ghi đè layoutSubviews trong lớp nhìn của bạn để thiết lập khung của lớp gradient:

    - (void)layoutSubviews { 
        [super layoutSubviews]; 
        _gradientLayer.frame = self.bounds; 
    } 
    
  2. Tạo một lớp con của UIView tên GradientView, và ghi đè phương pháp của nó +layerClass trở [CAGradientLayer class]. Sử dụng chế độ xem này để vẽ gradient của bạn thay vì sử dụng trực tiếp lớp. Sau đó đặt chế độ xem của autoresizingMask của chế độ xem gradient (hoặc thêm các ràng buộc cho chế độ xem nếu bạn đang sử dụng bố cục tự động). See this answer để biết ví dụ.

Tạo lớp GradientView cũng sẽ thực hiện thay đổi kích thước hoạt động chính xác trong khi quay, vì vậy tôi đề xuất giải pháp đó.

+0

♡ câu trả lời được liên kết. Giải thích tuyệt vời về vấn đề (với gif động!) Và giải pháp. Làm tốt. – memmons

+0

Liên kết đi kèm đã đưa ra giải thích siêu đơn giản! Cảm ơn Rob! –

2

tôi thay đổi kích thước giới hạn của lớp bằng tay bằng cách ghi đè các phương pháp setFrame: về quan điểm:

-(void)setFrame:(CGRect)frame 
{ 
    [super setFrame:frame]; 
    _gradientLayer.bounds = CGRectMake(0, 0, CGRectGetWidth(frame), CGRectGetHeight(frame)); 
} 
+0

'setFrame: 'tiếc là không được gọi trong các sự kiện như xoay vòng, do đó, điều này sẽ không hoạt động. – memmons