2012-11-07 29 views
26

Tôi phải thêm UIImageView làm chế độ xem phụ của MapView. Để làm điều này, tôi đã tạo một lớp phía trên MapView. Trong lớp này, tôi muốn đặt hình ảnh của tôi, nhưng tôi nhận được một hình chữ nhật màu trắng và không có gì khác. Hình ảnh của tôi không hiển thị.thêm UIImage vào CALayer

Đây là mã:

- (void)viewDidLoad 
{ 
    //...... 

    CALayer *layer = [CALayer layer]; 
    layer.backgroundColor = [[UIColor whiteColor] CGColor]; 

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) 
    { 
     layer.bounds = CGRectMake(self.mapView.bounds.origin.x, 
            self.mapView.bounds.origin.y, 80, 300); 
    } 
    else 
    { 
     layer.bounds = CGRectMake(self.mapView.frame.origin.x, 
            self.mapView.frame.origin.y, 150, 700); 
    } 

    layer.contents = (id)[UIImage imageNamed:@"myImage.png"]; 
    //the name is correct but in the output the image is not visible 

    [[self.mapView layer] addSublayer:layer]; 
    [layer setNeedsDisplay]; 
} 

Trả lời

6

Tôi đã gỡ bỏ

[layer setNeedsDisplay]; 

Tôi không biết tại sao, nhưng nó hoạt động!

+2

Tôi đoán setNeedsDisplay đã tạo lớp để vẽ lại nội dung và do đó xóa hình ảnh. – Bastian

+0

Điều này cũng giúp tôi. cảm ơn Adriana. –

41

nó phải được

layer.contents = (id)[UIImage imageNamed:@"myImage.png"].CGImage; 

Bạn chỉ có thể đặt một CGImage thành một lớp, không phải là một UIImage trực tiếp.

3

Bạn cần đặt khung của CALayer đúng cách, vì mặc định là CGRectZero.

77

Đây là câu trả lời chung vì lợi ích của người xem trong tương lai. Nó dựa trên tiêu đề câu hỏi chứ không phải chi tiết của câu hỏi gốc.

Làm thế nào để thêm một UIImage đến một CALayer

Bạn có thể thêm hình ảnh vào một điểm của layer chỉ đơn giản bằng cách sử dụng contents tài sản của mình:

myView.layer.contents = UIImage(named: "star")?.cgImage 
  • Lưu ý rằng UIImage cần phải được chuyển đổi sang a CGImage.

Nếu bạn muốn thêm hình ảnh trong lớp của mình, bạn có thể làm điều đó như thế này:

let myLayer = CALayer() 
let myImage = UIImage(named: "star")?.cgImage 
myLayer.frame = myView.bounds 
myLayer.contents = myImage 
myView.layer.addSublayer(myLayer) 

Sửa đổi sự xuất hiện

Đoạn mã trên tạo ra một cái nhìn như thế này. Màu xanh dương nhạt là UIView và ngôi sao màu xanh đậm là UIImage.

enter image description here

Như bạn có thể thấy, mặc dù, nó có vẻ pixelated. Điều này là do UIImage nhỏ hơn UIView do đó nó đang được thu nhỏ để lấp đầy chế độ xem, đây là mặc định mà bạn không chỉ định bất kỳ điều gì khác.

Ví dụ bên dưới hiển thị các biến thể trên thuộc tính contentsGravity của lớp. Mã này trông như thế này:

myView.layer.contents = UIImage(named: "star")?.cgImage 
myView.layer.contentsGravity = kCAGravityTop 
myView.layer.isGeometryFlipped = true 

Trong iOS, bạn có thể muốn thiết lập các isGeometryFlipped property để true nếu bạn đang làm bất cứ điều gì với đầu hoặc trọng lực dưới, nếu không nó sẽ là ngược với những gì bạn mong đợi. (Chỉ có lực hấp dẫn là lộn theo chiều dọc, chứ không phải vẽ nội dung. Nếu bạn đang gặp rắc rối với nội dung đang được lật, xem this answer.)

Có hai UIView ví dụ dưới đây cho mỗi thiết lập contentsGravity, một cái nhìn lớn hơn UIImage và cái còn lại nhỏ hơn.Bằng cách này bạn có thể thấy được ảnh hưởng của việc mở rộng và trọng lực.

kCAGravityResize

Đây là mặc định.

enter image description here

kCAGravityResizeAspect

enter image description here

kCAGravityResizeAspectFill

enter image description here

kCAGravityCenter

enter image description here

kCAGravityTop

enter image description here

kCAGravityBottom

enter image description here

kCAGravityLeft

enter image description here

kCAGravityRight

enter image description here

kCAGravityTopLeft

enter image description here

kCAGravityTopRight

enter image description here

kCAGravityBottomLeft

enter image description here

kCAGravityBottomRight

enter image description here

liên quan

+0

Câu trả lời hay. Nhưng làm thế nào để bạn thực hiện kCAGravityResizeAspectFill và kCAGravityTop cùng một lúc? – tcurdt

+1

điều chỉnh nội dungVề tỷ lệ phù hợp thực hiện thủ thuật. Một tùy chọn khác là sử dụng UIImageView làm mặt nạ UIView. – tcurdt

0

myView.layer.contents = UIImage (tên là: "sao") ?.cgImage

+2

Vui lòng cung cấp thêm chi tiết trong câu trả lời của bạn. Ngay cả khi câu trả lời của bạn là một giải pháp hoàn chỉnh, người hỏi sẽ tìm hiểu thêm nếu bạn dành thời gian để giải thích mã của bạn làm gì và cách bạn nghĩ ra nó. – Jolta

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