может ли конкретный прямоугольник UIview иметь другую альфу?

Я не хочу, чтобы изображение было полупрозрачным в других частях и полностью прозрачным в середине. См. это изображение.. введите описание изображения здесь

мне удалось это сделать, но это не лучший способ .. могу ли я иметь только прямоугольник внутри желтых линий прозрачным ...?

EDIT: можно ли изменить альфа-канал определенного прямоугольника представления...?


person Ankit Srivastava    schedule 03.08.2012    source источник
comment
@Leena, конечно, это возможно... посмотрите приложение камеры по умолчанию на iPhone и отредактируйте изображение, как только оно будет нажато... вы увидите ту же самую функцию...   -  person Ankit Srivastava    schedule 03.08.2012
comment
я создал похожие функции, подобные этой, когда я реализовал функциональность обрезки в своем приложении, но не использовал одно представление.   -  person Leena    schedule 03.08.2012
comment
так вы можете подтвердить, что у определенного прямоугольника может быть разная альфа?? По-моему, он должен делать что-то другое, но не совсем альфа.   -  person Tarun    schedule 03.08.2012
comment
я указал, что с одним представлением это невозможно, я использовал два изображения и одно представление с низкой альфой   -  person Leena    schedule 03.08.2012
comment
Изменяется ли размер этого прямоугольника/перетаскивается, как функция кадрирования ImagePicker?   -  person Eric Genet    schedule 28.01.2013
comment
нет .. это должно было быть исправлено в моем требовании.   -  person Ankit Srivastava    schedule 28.01.2013


Ответы (6)


Поместите пользовательский 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 в этом представлении.

person Gopal R    schedule 01.02.2013
comment
Отлично... Я всегда знал, что должен быть лучший подход... Это слишком хорошо. Я должен войти в CoreGraphics сейчас.. - person Ankit Srivastava; 01.02.2013
comment
Не забудьте установить self.opaque = NO; - person Hemang; 05.07.2014

После долгих усилий я нашел решение.

Вот код для него!!

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

Просто логика здесь имела значение!!

person Bharath    schedule 28.01.2013

Почему бы вам не сделать это только так:

  1. Создайте изображение, установите его альфа-канал, чтобы сделать его полупрозрачным.
  2. Затем просто обрежьте часть изображения, которую вы хотите сделать полностью прозрачной, и создайте новое изображение с альфа = 1 и установите в нем это обрезанное изображение только над полупрозрачным изображением :)
person Bhupendra    schedule 29.01.2013
comment
Я хочу, чтобы полностью прозрачный вид был расширен, т. Е. Похож на редактируемое изображение приложения камеры по умолчанию. - person Bharath; 29.01.2013

ss

Я думаю, вы, возможно, сможете изменить внешнюю сторону выбранного прямоугольника. Что касается изображения ниже, вам нужно 4 альфа-канала из 4 прямоугольников. Например, сначала вы устанавливаете белый цвет фона окна, затем 4 альпы прямоугольников устанавливаете на 0,5.

Я думаю, вам лучше использовать CALayer вместо UIView.

Я хочу, чтобы мой совет помог вам немного.

person Feel Physics    schedule 03.08.2012
comment
это именно то, что я сделал, но я искал гораздо лучший и оптимальный способ. - person Ankit Srivastava; 03.08.2012

Я думаю, вы можете использовать CGContext

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

см. ссылку ниже ссылка на CGContext или Ссылка на CGGradient

person Sathe_Nagaraja    schedule 28.01.2013
comment
Не могли бы вы вкратце объяснить, как этого добиться? Просто предоставить справочный документ недостаточно. Я до сих пор не понимаю, как использовать приведенную выше ссылку для достижения вышеуказанной функции. - person Bharath; 28.01.2013

Простой метод

   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.
person Justin Mathews    schedule 29.01.2013
comment
@steve.. Пожалуйста, прочитайте вопрос полностью, прежде чем отвечать!! Тут дело не в фотошопе и прочем. Мы хотим добиться этого во время выполнения. Это возможно, и я этого не сделал! - person Bharath; 29.01.2013