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の「上」にある必要があります。