• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在覆盖 UIView 的右下角创建四分之一透明孔

[复制链接]
菜鸟教程小白 发表于 2022-12-13 11:54:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

您好,我想在覆盖 UIView 的右下角创建一个四分之一透明孔。

我可以使用下面的代码来解决它。但它看起来不正确,因为我在视野之外创建了一个矩形。

我尝试过的:

@implementation PartialTransparentView

- (id)initWithBottomRightCornerRadiusForViewUIView *)view   withRadiusCGFloat)radius
{
[self commonInitWithRect:CGRectMake(view.frame.size.width - radius,  view.frame.size.height - radius, radius*2, radius*2)];
self = [super initWithFrame:CGRectMake(0, 0, 5000, 5000)];//**it does not look right to me**
if (self) {
    // Initialization code
    self.opaque = NO;
}
return self;
}

-(void)commonInitWithRectCGRect)rect{
    backgroundColor = [UIColor colorWithWhite:1 alpha:0.75];
    rectToBeSurrounded = rect;
}
- (void)drawRectCGRect)rect {

    [backgroundColor setFill];
    UIRectFill(rect);



        CGFloat x = rectToBeSurrounded.origin.x;
        CGFloat y = rectToBeSurrounded.origin.y;

        CGFloat width = rectToBeSurrounded.size.width;
        CGFloat height = rectToBeSurrounded.size.height;

        //create outer square
        CGFloat outerX = (x - width/2);
        CGFloat outerY = y - height/2;
        CGFloat outerWidth = 2*width;
        CGFloat outerHeight = outerWidth;
        //create outer square

        CGRect outerRect = CGRectMake(outerX, outerY, outerWidth, outerHeight);

        CGRect holeRectIntersection = CGRectIntersection( outerRect, rect );

        CGContextRef context = UIGraphicsGetCurrentContext();

        if( CGRectIntersectsRect( holeRectIntersection, rect ) )
        {
            CGContextAddEllipseInRect(context, holeRectIntersection);
            CGContextClip(context);
            CGContextClearRect(context, holeRectIntersection);
            CGContextSetFillColorWithColor( context, [UIColor clearColor].CGColor );
            CGContextFillRect( context, holeRectIntersection);
        }
}

现在我将上面的代码用作:

PartialTransparentView *transparentView = [[PartialTransparentView alloc] initWithBottomRightCornerRadiusForView:self.view withRadius:50];
[self.view addSubview:transparentView];

结果如预期:

OUTPUT

我知道如果我必须实现相同的目标但在 View 的左上角,我的解决方案将会中断。 我正在寻找的只是提供圆的中心 (x, y) 和半径并获得所需的结果。

谢谢 基于T先生

UIView *transparentView = [[UIView alloc] initWithFrame:self.view.frame];
    [transparentView setBackgroundColor:[UIColor colorWithWhite:1 alpha:0.75]];
    [self.view addSubview:transparentView];

    circleView *acircleView = [[circleView alloc] initWithFrame:CGRectMake(50, 50, 60, 60)];
    [acircleView setBackgroundColor:[UIColor grayColor]];
    [transparentView addSubview:acircleView];

和circleView.m

- (void)drawRectCGRect)rect {
    // Drawing code
    //// Oval Drawing
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(50, 50, 60, 60)];
    [UIColor.grayColor setFill];
    [ovalPath fill];
}

输出: dont get circle , instead i am getting square



Best Answer-推荐答案


我的建议是将透明 view 作为单独的 view 添加到您的 View Controller 上。这可以在 storyboard 上完成,这样您就可以设置背景颜色和 alpha 值以提供透明效果!!!

现在创建另一个 view 来制作圆形并将其添加到透明 view 中,并将这个 view 移动到透明 上查看根据你的需要!!!

使用bezier path创建圆:

circleView.m

 - (void)drawRectCGRect)frame {
    //// Oval Drawing
    UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(CGRectGetMinX(frame), CGRectGetMinY(frame), 60, 60)];
    [UIColor.grayColor setFill];
    [ovalPath fill];
}

出于测试目的,我在我的 IB 上创建了一个圆形 View ,并在我的 View Controller 中创建了一个 socket 属性。

这里是截图。

enter image description here

现在要移动圆圈,我可以在任何需要的地方更改圆圈view的框架。

例如,如果我想将它移到左上角,我只需这样做:

-(void)moveCircleViewwithXfloat) x withYfloat) y{

    _cView.frame=CGRectMake(x, y, _cView.frame.size.width, _cView.frame.size.height);


}

结果将是:

enter image description here

更新

把transparentView的drawRect方法如下:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect transparentPart = self.seeRect;           //this is the rect of the circle view
CGContextAddEllipseInRect(ctx,transparentPart);  //make the circle shape
CGContextClip(ctx);
CGContextClearRect(ctx, transparentPart);

在您的 View Controller 中:

当您想要应用蒙版时,即圆形和透明层的透明:

-(void)applyMask{

    [_cView setCircleColor:[UIColor clearColor]];   //circle view bezier path color
    [_cView setNeedsDisplay];
    [_tView setSeeRect:_cView.frame];    //set the transparency cut on transparency view
    [_tView setNeedsDisplay];


}

一旦你这样做了,你会得到透明 View !!!

你可以通过调用来移动圆圈

      [self moveCircleViewwithX:-30 withY:10];   //top left corner

您可以通过简单地调用来应用透明蒙版:

      [self applyMask];

所以,调用 applyMask 方法后的最终结果是:

enter image description here

关于ios - 在覆盖 UIView 的右下角创建四分之一透明孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33924229/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap