你如何使UIScrollView溢出变暗?

时间:2012-07-12 23:55:09

标签: ios core-graphics

假设您想要实现相同功能iOS的相机'Zoom& amp;裁剪'有......在其中您可以滚动和裁剪图像。

图片中超出裁剪区域大小的任何部分都会变灰。 我正试着复制那个。如果标志'clipToBounds'设置为NO,则可以显示整个子视图。

但是,我发现UIScrollView的子视图溢出有点灰白。

你会如何实现? 提前谢谢!

2 个答案:

答案 0 :(得分:3)

您可以通过创建UIView的子类来实现此目的,该子类在溢出区域中是半透明的,在“裁剪”区域中是透明的,并将其放在UIScrollView上并将其扩展到覆盖范围溢出。

您需要实施的主要方法是initWithFrame

#define kIDZAlphaOverlayDefaultAlpha 0.75

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        mAlpha = kIDZAlphaOverlayDefaultAlpha;
        self.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:mAlpha];
        self.userInteractionEnabled = NO;
    }
    return self;
}

不要错过userInteractionEnabled = NO,否则滚动视图将不会看到事件。

drawRect

- (void)drawRect:(CGRect)rect
{    
    CGRect apertureRect = /* your crop rect */;
    CGContextRef context = UIGraphicsGetCurrentContext();
    /* draw the transparent rect */
    CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 0.0);
    CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGContextFillRect(context, apertureRect);
    /* draw a white border */
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
    CGContextStrokeRect(context, apertureRect);
}

这里重点是kCGBlendModeCopy这允许我们在半透明背景中绘制(或剪切)透明矩形。

如果你想使透明矩形成为圆角矩形,并包含裁剪图像的预览,最后会出现如下屏幕:

Screenshot of IDZAlphaOverlay in action

抱歉,我不能分享屏幕截图的所有代码。它来自客户项目: - (

答案 1 :(得分:0)

我已经通过......解决了这个问题:

  • 使用以下代码添加新的辅助类“ApertureOverlay”(UIView的子类):

      
        
    • (无效)的drawRect:(的CGRect)RECT   {

           

      if(CGRectEqualToRect(_apertureRect,CGRectZero)==否)

           

      {

      CGContextRef context = UIGraphicsGetCurrentContext();
      
      CGContextSetShouldAntialias(context, false);
      
      CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f);
      CGContextFillRect(context, _apertureRect);
      
      CGContextSetShouldAntialias(context, true);
      
           

      }

    •   
         

    }

  • ApertureOverlay的背景,字母字节设置为50%。

    [self setBackgroundColor:[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:0.5f]];

到目前为止......我们得到的是一个透明背景的视图和一个白色矩形(用_apertureRect位置+大小绘制)。

实现这个类之后,我设置了ScrollView的'mask'属性,其中包含里面的图像。

[[self layer] setMask:[_apertureOverlayView layer]];

就是这样!如果您更新ApertureOverlay的'_apertureRect'属性,则需要调用'setNeedsDisplay',以便重新绘制它。

还有一件事。通过将antialias设置为false(ApertureOverlay)......事情非常顺利。