可以一个特定的UIview的矩形有不同的阿尔法..?

我不想在其他部分半透明,在中间完全透明的ImageView ..看到这个图像.. 在这里输入图像说明

我已经设法做到这一点,但它不是最好的方法..我可以只有在黄线内透明… …?

编辑 :是否有可能改变视图的某个矩形的阿尔法..?

将一个自定义的UIView放置在显示图像,大小和位置的视图上,使其完全重叠。 在自定义视图的drawRect方法中

- (void)drawRect:(CGRect)rect { // Drawing code CGRect rBounds = self.bounds; CGContextRef context = UIGraphicsGetCurrentContext(); // Fill background with 80% white CGContextSetFillColorWithColor(context, [[[UIColor whiteColor] colorWithAlphaComponent:0.8] CGColor]); CGContextFillRect(context, rBounds); // Draw the window 'frame' CGContextSetStrokeColorWithColor(context, [[UIColor orangeColor] CGColor]); CGContextSetLineWidth(context, 10); CGContextStrokeRect(context, self.maskRect); // make the window transparent CGContextSetBlendMode(context, kCGBlendModeClear); CGContextFillRect(context, self.maskRect); } 

其中maskRect是要显示为透明的矩形。 请确保自定义视图的背景颜色设置为“clearColor”

您可以编写任何额外的逻辑来更改maskRect并在此视图上调用“setNeedsDisplay”。

经过很多努力,我find了解决办法。

这是它的代码!

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [screenShotButton setHidden:YES]; UITouch *touch = [touches anyObject]; CGPoint pnt =[touch locationInView:self.view]; CGRect viewFrame=changeView.frame; CGFloat x1Diff,y1Diff,x2Diff,y2Diff; x1Diff=ABS(viewFrame.origin.x-pnt.x); y1Diff=ABS(viewFrame.origin.y-pnt.y); x2Diff=ABS(viewFrame.origin.x+viewFrame.size.width-pnt.x); y2Diff=ABS(viewFrame.origin.y+viewFrame.size.height-pnt.y); if (x1Diff<=10) { left=YES; shouldExpand=YES; } if (y1Diff<10) { top=YES; shouldExpand=YES; } if (x2Diff<=10) { right=YES; shouldExpand=YES; } if (y2Diff<=10) { bottom=YES; shouldExpand=YES; } if(CGRectContainsPoint(changeView.frame, pnt)) { shouldChange=YES; fromPoint=pnt; } else { shouldChange=NO; } } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if (!shouldChange) { return; } if (shouldExpand) { UITouch *touch = [touches anyObject]; CGPoint pnt =[touch locationInView:self.view]; CGRect preFram =changeView.frame; CGRect modifiedFrame=preFram; if (left) { modifiedFrame.origin.x=preFram.origin.x-(fromPoint.x-pnt.x); modifiedFrame.size.width=preFram.size.width+fromPoint.x-pnt.x; fromPoint.x=pnt.x; } if (right) { modifiedFrame.size.width=preFram.size.width+pnt.x-fromPoint.x; fromPoint.x=pnt.x; } if (top) { modifiedFrame.origin.y=preFram.origin.y-(fromPoint.y-pnt.y); modifiedFrame.size.height=preFram.size.height+fromPoint.y-pnt.y; fromPoint.y=pnt.y; } if (bottom) { modifiedFrame.size.height=preFram.size.height+pnt.y-fromPoint.y; fromPoint.y=pnt.y; } changeView.frame=modifiedFrame; [clearImage setBounds:CGRectMake(0-modifiedFrame.origin.x, 0-modifiedFrame.origin.y, clearImage.frame.size.width, clearImage.frame.size.height)]; } else { UITouch *touch = [touches anyObject]; CGPoint pnt =[touch locationInView:self.view]; changeView.center=CGPointMake(changeView.center.x-fromPoint.x+pnt.x, changeView.center.y-fromPoint.y+pnt.y); [clearImage setBounds:CGRectMake(0-changeView.frame.origin.x, 0-changeView.frame.origin.y, clearImage.frame.size.width, clearImage.frame.size.height)]; fromPoint=pnt; } } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [screenShotButton setHidden:NO]; left=top=right=bottom=NO; shouldExpand=NO; fromPoint=CGPointZero; toPoint=CGPointZero; shouldChange=NO; } - (IBAction)takeScreenShot:(id)sender { [screenShotButton setHidden:YES]; UIGraphicsBeginImageContext(self.view.frame.size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextScaleCTM(context, 1.0, 1.0); [self.view.layer renderInContext:context]; UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *filePath = [NSString stringWithFormat:@"%@/1.png",docPath]; CGRect cutRect = changeView.frame; CGImageRef imgRef = CGImageCreateWithImageInRect([img CGImage], cutRect); CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:filePath]; CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL); CGImageDestinationAddImage(destination, imgRef, nil); CFRelease(imgRef); if (!CGImageDestinationFinalize(destination)) { NSLog(@"Failed to write image to %@", filePath); } img=nil; imgRef=nil; CFRelease(destination); [screenShotButton setHidden:NO]; [changeView setHidden:NO]; } 

只是,这里的逻辑很重要!

你为什么不这样做呢?

  1. 创build一个imageview设置其alpha,使其半透明
  2. 然后只剪裁想要完全透明的图像部分,并创build一个alpha = 1的新图像视图,并将其中的裁剪图像设置在半透明图像视图上方:)

SS

我想你也许能够改变所选矩形的外部。 至于下面的图片,你应该4个矩形的4个阿尔法。 例如,首先设置白色窗口的背景颜色,然后设置为0.5的四个矩形区域。

我想你会更好地使用CALayer而不是UIView。

我希望我的build议可以帮助你。

我想你可以使用CGContext

 void CGContextDrawRadialGradient( CGContextRef context, CGGradientRef gradient, CGPoint startCenter, CGFloat startRadius, CGPoint endCenter, CGFloat endRadius, CGGradientDrawingOptions options ); 

请参阅下面的CGContext参考或CGGradient参考链接

一个简单的方法

  1:Create a image in photoshop with the alpha values which you have specified. 2:Place the new imageview over your image . 3:If you want to move the transparent box ,change the image frame. 4:If you want to expand you just change the size of upper image.