2

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

4

3 に答える 3

2

UIViewsのUIKitを使用したアニメーションは、CoreAnimationを直接使用するよりもはるかに制限されています。特に、アニメーション化しようとしているのは、UIViewのアニメーション化可能なプロパティの1つではありません。さらに、iOS用のViewプログラミングガイドで明確にされているように:

注:ビューがカスタムレイヤーオブジェクトをホストしている場合、つまり、ビューが関連付けられていないレイヤーオブジェクトの場合は、CoreAnimationを使用してそれらへの変更をアニメーション化する必要があります。

これはあなたの例の場合です。ビューにCALayerを追加したため、UIKitは結果をアニメーション化できなくなります。一方、Core Animationを直接使用して、マスクレイヤーの動きをアニメーション化することができます。Core Animationプログラミングガイドで説明されているように、暗黙のアニメーションを使用してこれを簡単に実行できるはずです。CALayerのアニメート可能なプロパティのリストから、そのフレームはアニメートできないことに注意してください。代わりにを使用する必要がありますposition

于 2012-11-17T03:46:48.037 に答える
2

CATransitionこれはあなたが望む解決策ではないかもしれませんが、あなたはを使用することによってあなたが望む何かを達成することができます:

1)最初に、あなたがしたのと同じようにあなたのレイヤーのマスクを設定します

2)マスクを削除して画像を表示する場合は、次のコードを使用します。

CATransition* transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
transition.duration = 1.0;
[mask addAnimation:transition forKey:kCATransition];
imageView.layer.mask.contents = [UIImage imageNamed:@"black.png"].CGImage;

ここでの主なトリック-マスクレイヤーのトランジションアニメーションを作成したので、このアニメーションは、マスクレイヤーのプロパティを変更したときに適用されます。次に、マスクのコンテンツを完全に黒の画像に設定して、マスキングを完全に削除します。これで、マスクされた画像が左に移動し、マスクされていない画像がその場所に配置されるスムーズなプッシュアニメーションが得られます。

于 2012-11-22T08:48:41.920 に答える
2

最も簡単な方法は、CoreAnimation自体を使用することです。

CGPoint fromPoint = mask.position;
CGPoint toPoint = CGPointMake(fromPoint.x*3.0, fromPoint.y);

mask.position = toPoint; // CoreAnimation animations do *not* persist

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.fromValue = [NSValue valueWithCGPoint:fromPoint];
animation.toValue = [NSValue valueWithCGPoint:toPoint];
animation.duration = 4.0f;

[mask addAnimation:animation forKey:@"position"];
于 2012-11-22T20:04:58.867 に答える