Bildiğim kadarıyla alt görünümleri de CALayermaskelemeniz gerekiyorsa maskelemeyi kullanabilirsiniz . Bunu yapmanın 2 yolu var. İlki biraz daha zarif, ikincisi geçici bir çözüm :-) ama aynı zamanda hızlı. Her ikisi de CALayermaskelemeye dayanmaktadır . Geçen yıl birkaç projede her iki yöntemi de kullandım, umarım faydalı bir şeyler bulursunuz.
1.Çözüm
Öncelikle, UIImageihtiyacım olan yuvarlak köşeyle anında ( ) bir görüntü maskesi oluşturmak için bu işlevi yarattım . Bu fonksiyon temelde 5 parametreye ihtiyaç duyar: görüntünün sınırları ve 4 köşe yarıçapı (sol üst, sağ üst, sol alt ve sağ alt).
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;
}
Şimdi sadece birkaç satır koda ihtiyacınız var. Benim viewController şeyler koymak viewDidLoaddaha da hızlı ancak özel de kullanabilirsiniz, çünkü yöntemle UIViewbirlikte layoutSubviewsörnekteki yöntemle.
- (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.Çözüm
Bu çözüm biraz daha "kirli". Esasen ihtiyacınız olan yuvarlatılmış köşeye (tüm köşelere) sahip bir maske katmanı oluşturabilirsiniz. Daha sonra maske katmanının yüksekliğini köşe yarıçapının değeri kadar artırmalısınız. Bu şekilde alt yuvarlatılmış köşeler gizlenir ve yalnızca üst yuvarlatılmış köşeyi görebilirsiniz. Sadece kod koymak viewDidLoaddaha hızlı olduğu için yöntemin ancak özel de kullanabilirsiniz UIViewile layoutSubviewsörnekteki yöntemle.
- (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];
}
Bu yardımcı olur umarım. Ciao!