जहाँ तक मुझे पता है, अगर आपको भी सबव्यू का मास्क लगाने की आवश्यकता है, तो आप 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];
}
समाधान २
यह समाधान थोड़ा और "गंदा" है। अनिवार्य रूप से आप गोल कोने के साथ एक मुखौटा परत बना सकते हैं जिसकी आपको आवश्यकता है (सभी कोनों)। फिर आपको कोने की त्रिज्या के मूल्य से मुखौटा परत की ऊंचाई बढ़ानी चाहिए। इस तरह नीचे के गोल कोने छिपे हुए हैं और आप केवल ऊपरी गोल कोने को देख सकते हैं। मैं बस में कोड डाल 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];
}
उम्मीद है की यह मदद करेगा। Ciao!