【问题标题】:multiple punch-out style mask?多重打孔式面具?
【发布时间】:2014-09-30 13:33:24
【问题描述】:

我以前做过简单的 CALayer 蒙版,但我想我对它们的作用感到困惑。我正在尝试使用几 (2) 个视图来产生打孔效果。

这是我目前所拥有的。我正在寻找一个带有打孔标签和图像的白色正方形(这样您就可以通过它看到棕色背景。我哪里出错了?

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor brownColor];

    self.viewToPunch = [[UIView alloc] initWithFrame:CGRectZero];
    [self.view addSubview:self.viewToPunch];
    self.viewToPunch.backgroundColor = [UIColor whiteColor];

    self.punchLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    self.punchLabel.textColor = [UIColor blackColor];
    self.punchLabel.font = [UIFont boldSystemFontOfSize:20.0];
    self.punchLabel.text = @"punch";
    self.punchLabel.textAlignment = NSTextAlignmentCenter;

    self.punchImage = [[UIImageView alloc] initWithImage:[[UIImage imageNamed:@"plus"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]];
    [self.punchImage setContentMode:UIViewContentModeCenter];

    self.viewsToPunch = @[self.punchLabel,self.punchImage];

    [self punch:self.viewToPunch withUIViews:self.viewsToPunch];
}

- (void)punch:(UIView *) viewToPunch withUIViews:(NSArray *)viewsToPunch
{
    CALayer *punchMask = [CALayer layer];
    punchMask.frame = viewToPunch.frame;

    NSMutableArray *sublayers = [[NSMutableArray alloc] init];
    for (UIView *views in viewsToPunch){
        [sublayers addObject:views.layer];
    }
    punchMask.sublayers = sublayers;
    punchMask.masksToBounds = YES;

    viewToPunch.layer.mask = punchMask;
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    self.viewToPunch.frame = CGRectMake(50, 50, 100, 100);
    self.punchLabel.frame = CGRectMake(0, 0, 100, 100);
    self.punchImage.frame = CGRectMake(0, 0, self.viewToPunch.frame.size.width, 40.);

    [self punch:self.viewToPunch withUIViews:self.viewsToPunch];
}

因此,不仅框架似乎已关闭,而且似乎与打孔相反。如何反转蒙版并修复框架?

非常感谢您的帮助!我把它放在了一个方法 push:withUIViews: 中,所以我希望可以在其他领域重用它。

【问题讨论】:

  • 你能在问题中写下你认为面具的作用和作用。另外,为什么要将框架设置为零矩形?
  • 这就是我编码的方式 - 所有帧都是 cgrectzero,我在 viewWillLAyoutSubviews 或 layoutSubviews 中调整大小(因此动画、帧更改等会自动处理。我认为 CALayer 蒙版的工作方式是像素它按像素检查遮罩上的 Alpha 通道,并通过遮罩上的 Alpha 值调整另一个视图上的 Alpha。

标签: ios calayer mask


【解决方案1】:

当您对CALayer 应用蒙版时,它只会在蒙版透明的部分绘制。但是您只是应用了一个空(透明)蒙版,坐标错误(这就是您的视图不完全透明的原因:蒙版没有完全覆盖视图;它应该是punchMask.frame = viewToPunch.bounds;

您可能想要查看CAShapeLayer 并为其指定路径。将其用作遮罩层。

例如,请参阅CAShapeLayer mask viewGetting Creative with CALayer Masks (cached blog post)

【讨论】:

  • 哦,好吧,看来这不是不可能的。如何反转蒙版,使其成为一种打孔效果,而不是我那里的效果?
  • 嗯,在重新阅读您想要实现的目标(带有文本剪切的实体视图)之后,我认为使用纯 CoreAnimation 很难做到这一点,因为您无法反转 alpha一个图层,您也不能使用带有CATextLayer 的透明文本颜色来动态创建必要的蒙版……通过自己绘制并使用kCGBlendModeDestinationOut 可能更容易做到这一点。另见Drawing a path with subtracted text using CoreGraphics
【解决方案2】:

我尝试将 CAGradationLayer 和 CAShapeLayer 的 mask 结合起来,是可以的。

https://stackoverflow.com/a/32220792/3276863

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2012-03-17
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2011-06-14
    • 2018-02-22
    • 2012-02-07
    相关资源
    最近更新 更多