Theo như tôi biết, nếu bạn cũng cần che các chế độ xem phụ, bạn có thể sử dụng tính năng tạo CALayer
mặt nạ. Có 2 cách để làm điều này. Cái đầu tiên thanh lịch hơn một chút, cái thứ hai là một giải pháp thay thế :-) nhưng nó cũng nhanh. Cả hai đều dựa trên CALayer
mặt nạ. Tôi đã sử dụng cả hai phương pháp trong một vài dự án vào năm ngoái và tôi hy vọng bạn có thể tìm thấy điều gì đó hữu ích.
Giải pháp 1
Trước hết, tôi tạo hàm này để tạo mặt nạ hình ảnh trên fly ( UIImage
) với góc tròn mà tôi cần. Chức năng này về cơ bản cần 5 tham số: giới hạn của hình ảnh và 4 bán kính góc (trên cùng bên trái, trên cùng bên phải, dưới cùng bên trái và dưới cùng bên phải).
static inline UIImage* MTDContextCreateRoundedMask( CGRect rect, CGFloat radius_tl, CGFloat radius_tr, CGFloat radius_bl, CGFloat radius_br ) {
CGContextRef context;
CGColorSpaceRef colorSpace;
colorSpace = CGColorSpaceCreateDeviceRGB();
context = CGBitmapContextCreate( NULL, rect.size.width, rect.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast );
CGColorSpaceRelease(colorSpace);
if ( context == NULL ) {
return NULL;
}
CGFloat minx = CGRectGetMinX( rect ), midx = CGRectGetMidX( rect ), maxx = CGRectGetMaxX( rect );
CGFloat miny = CGRectGetMinY( rect ), midy = CGRectGetMidY( rect ), maxy = CGRectGetMaxY( rect );
CGContextBeginPath( context );
CGContextSetGrayFillColor( context, 1.0, 0.0 );
CGContextAddRect( context, rect );
CGContextClosePath( context );
CGContextDrawPath( context, kCGPathFill );
CGContextSetGrayFillColor( context, 1.0, 1.0 );
CGContextBeginPath( context );
CGContextMoveToPoint( context, minx, midy );
CGContextAddArcToPoint( context, minx, miny, midx, miny, radius_bl );
CGContextAddArcToPoint( context, maxx, miny, maxx, midy, radius_br );
CGContextAddArcToPoint( context, maxx, maxy, midx, maxy, radius_tr );
CGContextAddArcToPoint( context, minx, maxy, minx, midy, radius_tl );
CGContextClosePath( context );
CGContextDrawPath( context, kCGPathFill );
CGImageRef bitmapContext = CGBitmapContextCreateImage( context );
CGContextRelease( context );
UIImage *theImage = [UIImage imageWithCGImage:bitmapContext];
CGImageRelease(bitmapContext);
return theImage;
}
Bây giờ bạn chỉ cần vài dòng mã. Tôi đặt nội dung trong viewDidLoad
phương thức viewController của mình vì nó nhanh hơn nhưng bạn cũng có thể sử dụng nó theo tùy chọn của mình UIView
với layoutSubviews
phương thức trong ví dụ.
- (void)viewDidLoad {
UIImage *mask = MTDContextCreateRoundedMask( self.view.bounds, 50.0, 50.0, 0.0, 0.0 );
CALayer *layerMask = [CALayer layer];
layerMask.frame = self.view.bounds;
layerMask.contents = (id)mask.CGImage;
self.view.layer.mask = layerMask;
self.view.backgroundColor = [UIColor redColor];
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake( 0.0, 0.0, 50.0, 50.0 )];
testView.backgroundColor = [UIColor blueColor];
[self.view addSubview:testView];
[testView release];
[super viewDidLoad];
}
Giải pháp 2
Dung dịch này "bẩn" hơn một chút. Về cơ bản, bạn có thể tạo một lớp mặt nạ với góc tròn mà bạn cần (tất cả các góc). Sau đó, bạn nên tăng chiều cao của lớp mặt nạ bằng giá trị của bán kính góc. Bằng cách này, các góc tròn dưới cùng bị ẩn và bạn chỉ có thể nhìn thấy góc tròn trên. Tôi chỉ đặt mã trong viewDidLoad
phương thức vì nó nhanh hơn nhưng bạn cũng có thể sử dụng nó theo tùy chỉnh của mình UIView
với layoutSubviews
phương thức trong ví dụ.
- (void)viewDidLoad {
CGFloat radius = 50.0;
CGRect maskFrame = self.view.bounds;
maskFrame.size.height += radius;
CALayer *maskLayer = [CALayer layer];
maskLayer.cornerRadius = radius;
maskLayer.backgroundColor = [UIColor blackColor].CGColor;
maskLayer.frame = maskFrame;
self.view.layer.mask = maskLayer;
self.view.backgroundColor = [UIColor redColor];
UIView *testView = [[UIView alloc] initWithFrame:CGRectMake( 0.0, 0.0, 50.0, 50.0 )];
testView.backgroundColor = [UIColor blueColor];
[self.view addSubview:testView];
[testView release];
[super viewDidLoad];
}
Hi vọng điêu nay co ich. Chào!