наскільки мені відомо, якщо вам також потрібно замаскувати підпрограми, ви можете використати CALayer
маскування. Є 2 способи зробити це. Перший трохи елегантніший, другий - обхідний шлях :-) але це також швидко. Обидва засновані на CALayer
маскуванні. Минулого року я використовував обидва методи у кількох проектах, то, сподіваюся, ви знайдете щось корисне.
Рішення 1
Перш за все, я створив цю функцію для створення маски зображення на льоту ( UIImage
) із закругленим кутом, який мені потрібен. Ця функція, по суті, потребує 5 параметрів: межі зображення та 4 радіуси кута (верхній лівий, верхній правий, нижній лівий та нижній правий).
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;
}
Тепер вам потрібно лише кілька рядків коду. Я поклав речі в моєму ViewController viewDidLoad
метод , тому що це швидше , але ви можете використовувати його також в призначених для користувача UIView
з layoutSubviews
методом прикладу.
- (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];
}
Рішення 2
Це рішення трохи більш "брудне". По суті, ви могли б створити шар маски із закругленим кутом, який вам потрібен (усі кути). Потім слід збільшити висоту шару маски на значення радіуса кута. Таким чином, нижній закруглений кут прихований, і ви можете бачити лише верхній закруглений кут. Я поставив код тільки в viewDidLoad
методі , тому що це швидше , але ви можете використовувати його також в призначеному для користувача UIView
з layoutSubviews
методом прикладу.
- (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];
}
Сподіваюся, це допомагає. Цао!