我已经能够完成我想要完成的任务,那就是复制iOS内置的圆形照片裁剪器,用于内置的联系人应用程序.但是,我一直在试图让我的CAShapeLayers
制作正确.我正在尝试制作一个透明的320像素直径圆圈,其余部分则填充0.9 alpha黑色背景.圆形和矩形在正确的位置,但是,圆形并不像我需要的那样完全透明.
我迷失了如何解决这个问题.我感谢您的帮助!代码和截图:
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ([navigationController.viewControllers count] == 3) { CGRect screenRect = [[UIScreen mainScreen] bounds]; CGFloat screenHeight = screenRect.size.height; UIView *plCropOverlay = [[[viewController.view.subviews objectAtIndex:1]subviews] objectAtIndex:0]; plCropOverlay.hidden = YES; CAShapeLayer *circleLayer = [CAShapeLayer layer]; if (screenHeight == 568) { [circleLayer setPosition:CGPointMake(0.0f,124.0f)]; } else { [circleLayer setPosition:CGPointMake(0.0f,80.0f)]; } UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0f, 0.0f, 320.0f, 320.0f)]; [circleLayer setPath:[path CGPath]]; [circleLayer setFillColor:[[UIColor whiteColor] CGColor]]; circleLayer.opacity = 0.7f; // Set to 0.7f to show for screenshot purposes; setting to 0.0 would make it invisible and blend in with the below rectangleLayer. CAShapeLayer *rectangleLayer = [CAShapeLayer layer]; UIBezierPath *path2 = [UIBezierPath bezierPathWithRect:CGRectMake(0.0f, 0.0f, 320.0f, screenHeight - 72)]; [rectangleLayer setPath:[path2 CGPath]]; [rectangleLayer setFillColor:[[UIColor blackColor] CGColor]]; [rectangleLayer setOpacity:0.9f]; [rectangleLayer addSublayer:circleLayer]; [[viewController.view layer] addSublayer:rectangleLayer]; UILabel *moveLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 320, 50)]; [moveLabel setText:@"Move and Scale"]; [moveLabel setTextAlignment:NSTextAlignmentCenter]; [moveLabel setTextColor:[UIColor whiteColor]]; [viewController.view addSubview:moveLabel]; } }
已解决的代码:
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ([navigationController.viewControllers count] == 3) { CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height; UIView *plCropOverlay = [[[viewController.view.subviews objectAtIndex:1]subviews] objectAtIndex:0]; plCropOverlay.hidden = YES; int position = 0; if (screenHeight == 568) { position = 124; } else { position = 80; } CAShapeLayer *circleLayer = [CAShapeLayer layer]; UIBezierPath *path2 = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0f, position, 320.0f, 320.0f)]; [path2 setUsesEvenOddFillRule:YES]; [circleLayer setPath:[path2 CGPath]]; [circleLayer setFillColor:[[UIColor clearColor] CGColor]]; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 320, screenHeight-72) cornerRadius:0]; [path appendPath:path2]; [path setUsesEvenOddFillRule:YES]; CAShapeLayer *fillLayer = [CAShapeLayer layer]; fillLayer.path = path.CGPath; fillLayer.fillRule = kCAFillRuleEvenOdd; fillLayer.fillColor = [UIColor blackColor].CGColor; fillLayer.opacity = 0.8; [viewController.view.layer addSublayer:fillLayer]; UILabel *moveLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 10, 320, 50)]; [moveLabel setText:@"Move and Scale"]; [moveLabel setTextAlignment:NSTextAlignmentCenter]; [moveLabel setTextColor:[UIColor whiteColor]]; [viewController.view addSubview:moveLabel]; } }