2012-04-06 7 views
14

Tôi đã sử dụng tốt này tutorial để tạo một lớp UIPopoverBackgroundView tùy chỉnh.Tùy chỉnh UIPopoverBackgroundView: không có bóng đổ

Nó hoạt động tốt. Vấn đề duy nhất là tôi không nhận được bóng đổ UIPopoverController điển hình và tôi muốn nó. Tôi đã cố gắng xác định nó trên lớp của UIPopoverBackgroundView dụ của tôi mà không thành công. Ví dụ của tôi về UIPopoverController dường như không có chế độ xem công khai để thao tác. Thêm nó vào nội dung popover cũng không hoạt động.

Có lẽ thực sự đơn giản: làm cách nào để thêm bóng thả khi sử dụng lớp UIPopoverBackgroundView tùy chỉnh?

// UIPopoverBackgroundView.m

-(id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]]; 

     _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]]; 

     [self addSubview:_borderImageView]; 
     [self addSubview:_arrowView]; 

     self.layer.shadowOffset = CGSizeMake(50, 50); 
     self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    } 

    return self; 
} 

Trả lời

14

Ok, figured it out. Tôi cần thêm bóng thả vào borderImageView, chứ không phải dạng xem của thể hiện cửa sổ bật lên.

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) { 
     _borderImageView = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"bg-popover.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(CAP_INSET,CAP_INSET,CAP_INSET,CAP_INSET)]]; 

     _arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bg-popover-arrow.png"]]; 

     [self addSubview:_borderImageView]; 
     [self addSubview:_arrowView]; 

     _borderImageView.layer.cornerRadius = 5.0f; 
     _borderImageView.layer.masksToBounds = NO; 
     _borderImageView.layer.borderWidth = 1.0f; 
     _borderImageView.layer.borderColor = [UIColor blackColor].CGColor; 

     _borderImageView.layer.shadowColor = [UIColor blackColor].CGColor; 
     _borderImageView.layer.shadowOpacity = 0.8; 
     _borderImageView.layer.shadowRadius = 50; 
     _borderImageView.layer.shadowOffset = CGSizeMake(-10.0f, 10.0f); 
    } 

    return self; 
} 
+0

Cảm ơn bạn rất nhiều cho việc này! –

+1

Chỉ cần nghĩ rằng tôi muốn thêm rằng điều này làm việc cho tôi, nhưng tôi đã có vấn đề hiệu suất. Rasterizing lớp nền đã giúp vô cùng: 'backgroundImageView.layer.shouldRasterize = YES;' – Maurizio

+0

Thú vị - Tôi đã không nhận thấy bất kỳ độ trễ đáng kể nào (trên iPad 2) nhưng tốt để biết. –

19

Bạn không cần thêm bóng của riêng mình. Các cơ sở UIPopoverBackgroundView sẽ làm điều đó cho bạn. Chỉ cần đảm bảo gọi siêu trong triển khai layoutSubviews của bạn.

EDIT: bình luận của tôi áp dụng cho các ứng dụng iOS nhắm mục tiêu 6.

+0

+1 Đúng. Tôi đến đây sau khi ngạc nhiên khi cửa sổ bật lên tùy chỉnh của tôi bắt đầu đổ bóng sau khi chạy trên iOS 6 – Mazyod

+0

Cảm ơn bạn đã thêm bản cập nhật @ iOS6 - Tôi đã quay lại kiểm tra dưới iOS5 sau khi xem nhận xét của bạn và gọi siêu trên 'layoutSubviews' không thêm cái bóng. –

+0

Tôi đang ở iOS 6 và UIPopoverBackgroundView của tôi không hiển thị bóng: ( –