假设您想要实现相同功能iOS的相机'Zoom& amp;裁剪'有......在其中您可以滚动和裁剪图像。
图片中超出裁剪区域大小的任何部分都会变灰。 我正试着复制那个。如果标志'clipToBounds'设置为NO,则可以显示整个子视图。
但是,我发现UIScrollView的子视图溢出有点灰白。
你会如何实现? 提前谢谢!
答案 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
这允许我们在半透明背景中绘制(或剪切)透明矩形。
如果你想使透明矩形成为圆角矩形,并包含裁剪图像的预览,最后会出现如下屏幕:
抱歉,我不能分享屏幕截图的所有代码。它来自客户项目: - (
答案 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)......事情非常顺利。