Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

can a particular rect of UIview have different alpha..?

I wan't a imageview which is semi-transparent in other parts and completely transparent in the middle .. see this image.. enter image description here

i have managed to do it but it is not the best of ways.. can I only have a rect inside yellow lines transparent ...?

EDIT: Is it possible to change the alpha of a certain rect of a view..?

like image 561
Ankit Srivastava Avatar asked Aug 03 '12 09:08

Ankit Srivastava


People also ask

What is a UIView?

The UIView class is a concrete class that you can instantiate and use to display a fixed background color. You can also subclass it to draw more sophisticated content.

What is opaque view in Swift?

An opaque view is expected to fill its bounds with entirely opaque content—that is, the content should have an alpha value of 1. 0 . If the view is opaque and either does not fill its bounds or contains wholly or partially transparent content, the results are unpredictable.


2 Answers

Place a custom UIView over the view showing the image, size and position it to exactly overlap. In the custom view's drawRect method

- (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);
}

where maskRect is the rectangle to be shown transparent. Do ensure that the background color of the custom view is set to 'clearColor'

You can write any additional logic required to change the maskRect and call 'setNeedsDisplay' on this view.

like image 107
Gopal R Avatar answered Sep 26 '22 22:09

Gopal R


After lots of effort, I have found the solution.

Here is the code for it!!

-(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];
}

Just, logic mattered here!!

like image 23
Bharath Avatar answered Sep 23 '22 22:09

Bharath