Bildiğim kadarıyla alt görünümleri de CALayer
maskelemeniz 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 CALayer
maskelemeye 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, UIImage
ihtiyacı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 viewDidLoad
daha da hızlı ancak özel de kullanabilirsiniz, çünkü yöntemle UIView
birlikte 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 viewDidLoad
daha hızlı olduğu için yöntemin ancak özel de kullanabilirsiniz UIView
ile 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!