我正在使用 Bartosz 提出的此代码向 UIImageView 添加蒙版。它工作正常。
#import <QuartzCore/QuartzCore.h>
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage];
mask.frame = CGRectMake(0, 0, 320.0, 100.0);
yourImageView.layer.mask = mask;
yourImageView.layer.masksToBounds = YES;
另外,我想为蒙版设置动画,例如向右滑动蒙版,这样在动画结束时,蒙版不再应用于 UIImageView。
在我的特定情况下,蒙版使用完全透明的图像,因此 UIImageView 在初始状态下不可见(工作正常),但预计在动画结束时会如此。但是,如果需要对蒙版进行动画处理,则该想法可以重用于任何其他用例。
这个想法是操纵掩码框架的 x 原点部分。所以,我想出了这个代码:
[UIView animateWithDuration: 0.2
delay: 0
options: UIViewAnimationCurveEaseInOut
animations:^{
CGRect maskFrame = yourImageView.layer.mask.frame;
maskFrame.origin.x = 320.0;
yourImageView.layer.mask.frame = maskFrame;
}
completion:^(BOOL finished){}];
不幸的是,掩码随时都应用于整个 UIImageView,它不会向右滑动。
更新 1:
这是我实际使用的设置视图和掩码的代码:它是一个 UITableViewCell。
APPCell.m(APPCell.h“扩展”UITableViewCell)
#import "APPCell.h"
#import <QuartzCore/QuartzCore.h>
@interface APPCell()
@property (strong, nonatomic) UIImageView *menu;
@property (strong, nonatomic) CALayer *menuMask;
...
@end
@implementation APPCell
...
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self.menu = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 88.0)];
[self.menu setBackgroundColor:[UIColor clearColor]];
[self.menu setImage:[UIImage imageNamed:@"cell_back"]];
[self addSubview:self.menu];
self.menuMask = [CALayer layer];
self.menuMask.contents = (id)[[UIImage imageNamed:@"cell_mask"] CGImage];
self.menuMask.frame = CGRectMake(0, 0, 320.0, 88.0);
self.menu.layer.mask = self.menuMask;
self.menu.layer.masksToBounds = YES;
}
...
我现在不是在 UIKit 的帮助下制作动画,而是使用 CoreAnimation 的隐式动画来移动遮罩层:
APPCell.m
...
- (void)swipeLeft
{
self.menuMask.position = CGPointMake(-320.0, 0.0);
}
...
我可以确认调用了 swipeLeft。我希望面具“消失”并看到[UIImage imageNamed:@"cell_back"]] ,当我取消注释self.menu.layer.mask = self.menuMask时我会这样做。
解决方案:
我没有在 CALayer 上设置内容,而是将背景颜色设置为白色。这是我正在使用的代码:
self.menuSubMenuMask = [CALayer layer];
self.menuSubMenuMask.backgroundColor = [[UIColor whiteColor] CGColor];
self.menuSubMenuMask.frame = CGRectMake(320.0, 0.0, 320.0, 88.0);
self.tableCellSubMenu.layer.mask = self.menuSubMenuMask;
self.tableCellSubMenu.layer.masksToBounds = YES;
为了显示应用了 CALayer 的 UIImageView,CALayer 不能位于 UIImageView 的“上方”。