2010-09-09 26 views
21

Tôi đang cố gắng tạo một lớp con UIView ("GradientView") sẽ tự lấp đầy bằng một dải màu khác nhau. Tôi đã thực hiện nó bằng cách thêm một CAGradientLayer như là một lớp con của lớp UIView.Tự động trả lời bài hát trên iPhone/iPad: Làm cách nào?

Có vẻ tốt, nhưng khi màn hình được xoay, nó không thay đổi kích thước của lớp gradient. Không có may mắn tìm thấy một tài sản BOOL trên lớp để chuyển đổi, tôi overrode layoutSubviews trong GradientView.

-(void)layoutSubviews { 
    self.gradientLayer.frame = self.bounds; 
} 

Tác phẩm này, nhưng nội dung đằng sau GradientView vẫn hiển thị trong khi xoay vòng thiết bị. Cách dễ nhất để 'autoresize' mà CAGradientLayer để phù hợp với giới hạn của lớp cha mẹ của nó để các hình ảnh động là mịn (như cho UIView autoresizing) là gì?

Trả lời

29

Bạn có lẽ có thể nhận được ngay với việc xác định phương pháp + layerClass trên một UIView tùy chỉnh ...

@implementation MyGradientView 
+(Class) layerClass { 
    return [CAGradientLayer class]; 
} 
@end 

Bạn có thể khởi tạo các lớp trong của bộ điều khiển của bạn viewDidLoad() (hoặc bất cứ nơi nào), một cái gì đó như ...

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    [(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil]; 
} 
+0

Có xung quanh để thử nghiệm này, nó hoạt động. – l8nite

+2

+1 Hoạt động tốt. Kích thước lớp được quản lý bởi phụ huynh UIView và được tự động thay đổi kích thước. – Adolfo

+7

Câu trả lời này không rõ ràng.Tôi đã thử nhiều giờ nhưng không làm việc – DavidNg

4

tôi sẽ:

  1. Tăng kích thước của tầm nhìn của bạn đến tối đa của mỗi chiều trong mã willRotateToInterfaceOrientation. (Ví dụ: đối với iPhone 320x480 - đặt độ mờ thành 480x480).

  2. Đặt các giới hạn theo chế độ xem mới xoay trong hàm didRotateFromInterfaceOrientation.

Điều này sẽ làm cho màn hình đủ rộng để bất kể nó được định hướng trong khi hoạt ảnh như thế nào, nó sẽ bao phủ toàn bộ màn hình. Nó sẽ không được "mịn" - bởi vì gradient sẽ phải được xoay, nhưng ít nhất bạn sẽ không thấy phía sau lớp ở giữa vòng quay.

+1

đây là một lận lúc tốt nhất –

+1

Được rồi - có một ý tưởng tốt hơn? Tôi sử dụng tequnique này trong các chương trình ánh xạ, nơi tôi phải xoay từ 320x480 đến 480x320 và muốn nó xuất hiện liền mạch. – Brad

+0

Vui lòng xem tiêu chí để downvoting: http://stackoverflow.com/privileges/vote-down – Brad

2
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 

    CGRect b; 

    if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320); 
    else b = CGRectMake(0, 0, 320, 480);  

    [CATransaction begin]; 
    [CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration]; 
    [self.view.layer setBounds:b]; 
    [CATransaction commit]; 

} 
+0

Tại sao bạn nghĩ rằng chúng ta rõ ràng phải thay đổi giới hạn của lớp? Lớp sẽ được tự động thay đổi kích thước khi khung của khung nhìn được liên kết bị thay đổi, phải không? –

1

Lưu ý rằng việc trả lại CAGradientLayer làm lớp lớp chỉ hoạt động nếu bạn đặt màu nền xem thành trong suốt. Bạn sẽ cần đặt màu nền của lớp nếu bạn cần một màu khác với màu trong suốt.

0

trong trường hợp của tôi làm việc này:

[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds]; 
+0

Tôi thêm mã của bạn trong '(void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration: (NSTimeInterval) duration'. Khi tôi xoay, lớp cũ vẫn thoát. Lớp mới trong chế độ nằm ngang vẫn xuất hiện. Làm ơn giúp tôi – DavidNg

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