2013-03-09 16 views
10

Tôi muốn thêm mặt nạ tròn vào UIImageVIew. Đây là chức năng đang sử dụng để thêm mặt nạ ..Cách thêm mặt nạ tròn vào UIImageview và thay đổi khung và trung tâm trong khi làm như vậy?

- (void) addMaskToBounds:(CGRect) maskBounds 
{ 
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init]; 

    CGPathRef maskPath = CGPathCreateWithEllipseInRect(maskBounds, NULL); 
    maskLayer.bounds = maskBounds; 
    [maskLayer setPath:maskPath]; 
    [maskLayer setFillColor:[[UIColor blackColor] CGColor]]; 
    maskLayer.position = CGPointMake(maskBounds.size.width/2, maskBounds.size.height/2); 

    [self.imageView.layer setMask:maskLayer]; 
} 

Có thể thêm mặt nạ nhưng vấn đề xảy ra vì đang thay đổi khung hình và trung tâm cùng với nó. Hình ảnh được mở rộng và tạo ra nhỏ dựa trên các hành động của người dùng. Do đó tôi sẽ phải thêm mặt nạ hai lần khi nhỏ và khi mở rộng. Vì vậy, kể từ khi hoạt hình thay đổi khung hình, trong khi hoạt hình hình ảnh trở nên méo mó, hoặc di dời. Làm cách nào để khắc phục điều này?

Tôi đoán giải thích tốt nhất của nó với dự án mẫu. Ở đây tôi đã tạo một dự án Demo https://github.com/akshaynhegde/MaskImage trên GitHub, chỉ cần chạy nó để xem vấn đề của tôi và cho tôi biết cách giải quyết vấn đề.

+0

này đã được hỏi trước: http://stackoverflow.com/questions/12564336/animation-of-masked-uiview-calayer –

Trả lời

4

Ok, vì vậy vì trung tâm trong trường hợp của tôi thay đổi, sử dụng mặt nạ không phải là ging để trợ giúp. Vì vậy, cách dễ dàng và sạch sẽ là có một UiImageView tùy chỉnh và clip đường dẫn vẽ.

Vì vậy, cho rằng, phân lớp UIView và vẽ hình ảnh bên trong và cắt đường dẫn. Dưới đây là overriden các drawRect chức năng,

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextAddEllipseInRect(context, self.bounds); 
    CGContextClip(context); 
    //The subclass of UIView has a UIImageview as property 
    [_image drawInRect:rect];  
} 

FYI, bạn không thể phân lớp UIImageView bản thân và ghi đè drawRect, coz nó sẽ không gọi drawRect,

Lớp UIImageView được tối ưu hóa để vẽ nó hình ảnh cho màn hình. UIImageView sẽ không gọi drawRect: một lớp con. Nếu lớp con của bạn cần mã vẽ tùy chỉnh, bạn nên sử dụng UIView làm lớp cơ sở .

+0

Các giải pháp tùy chỉnh UIImageView là gì Trước đây tôi đã sử dụng, vì vậy giải pháp này đã làm việc phù hợp với tôi. Nó cũng trông gần hơn với những gì iOS 7 làm – CVertex

+1

Bạn cũng có thể thay đổi trung tâm của lớp mặt nạ. – Mrug

+0

Lưu ý rằng nhận xét của bạn không hoàn toàn chính xác - lớp con này của UIView phải có * UIImage * làm thuộc tính chứ không phải * UIImageView * – RobP

21

Hy vọng điều này sẽ giúp

CAShapeLayer *circle = [CAShapeLayer layer]; 
    // Make a circular shape 
    UIBezierPath *circularPath=[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, _imgView.frame.size.width, _imgView.frame.size.height) cornerRadius:MAX(_imgView.frame.size.width, _imgView.frame.size.height)]; 

    circle.path = circularPath.CGPath; 

    // Configure the apperence of the circle 
    circle.fillColor = [UIColor blackColor].CGColor; 
    circle.strokeColor = [UIColor blackColor].CGColor; 
    circle.lineWidth = 0; 

    imgViewToClipCircular.layer.mask=circle; 
+0

Điều này không giải quyết được câu hỏi ban đầu về cách thay đổi khung hình thành 'UIImageView' khi nào sử dụng mặt nạ ở tất cả ... – Sam

+0

Tôi thấy mã này rất tiện dụng vì tôi cần một mặt nạ tròn ngoài trung tâm cho chế độ xem tôi đang tạo. Đầu tiên, tôi đã sử dụng layer.cornerRadius để làm cho khung nhìn trong giao diện Builder. Sau đó, tôi đã sử dụng mã này với giá trị Y âm trong đường dẫn Bezier để tạo mặt nạ cho nó. Hình dạng kết quả trông rất giống một bóng đá Mỹ, đó là những gì tôi cần. –

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