我有两个UIImageViews占据了整个屏幕,这意味着它们的帧是:(0,0,320,480)imageView2imageView1之上。

它们都使用CAShapeLayer应用于蒙版。我做了一个功能

-(void)addMask:(CGRect)rect toView:(UIImageView*)imageView

如下
//Function
-(void)addMask:(CGRect)rect toView:(UIImageView*)imageView {

CAShapeLayer * shapeLayer = [[CAShapeLayer alloc] init];

CGPathRef path = CGPathCreateWithRect(rect, NULL);
shapeLayer.path = path;
CGPathRelease(path);

imageView.layer.mask=shapeLayer;
imageView.layer.masksToBounds=YES;

}

我正在使用以下UIImageViewsviewDidAppear中的CGRects上应用掩码:
//In view did Appear
[self addMask:CGRectMake(0,0,160,480) toView:self.imageView];
[self addMask:CGRectMake(160,0,160,480) toView:self.imageView2];

因此,结果是屏幕被拆分成一半,左侧显示了一半imageView1,右侧显示了一半imageView2

我有一个与IBAction(buttonPressed:)关联的按钮。

我想要实现的是,当按下按钮时,增加imageView1的掩码,同时减小UIImageView2的掩码:这样,左侧的imageView1占据屏幕的75%,而右侧的imageView2占据屏幕的25% 。我现在想做的是在下面的代码中,但是没有得到预期的结果:
//In IBAction
CGRect tmpRect ;
tmpRect = imageView1.layer.frame;
NSLog(@"Rect1  : %@",NSStringFromCGRect(tmpRect));
tmpRect.size.width+=20.0;
[self addMask:tmpRect toView:self.imageView];

tmpRect= imageView2.layer.frame;
NSLog(@"Rect2 : %@",NSStringFromCGRect(tmpRect));
tmpRect.origin.x+=20.0;
tmpRect.size.width-=20.0;
[self addMask:tmpRect toView:self.imageView2];

输出是
2013-08-26 13:15:41.753 imageMasking[16191:c07] Rect1  : {{0, 0}, {320, 460}}
2013-08-26 13:15:41.754 imageMasking[16191:c07] Rect2 : {{0, 0}, {320, 460}}

这是我要实现的目标的图片视图。

另外,稍后我想使用panGesture移动蒙版。那么,使用此功能拖动手指一千次时使用口罩是个好主意吗?
除了我尝试实现的目标之外,还有其他选择吗?

谢谢

最佳答案

问题在于,在按下按钮时,您总是会转到layer.frame,即图像视图的完整帧,而不是要遮罩的当前帧。您应该在属性中存储分割线的位置,就像CGFloat一样,并且要修改遮罩时,请先更新此属性,然后使用它来计算新的遮罩路径。

除非有理由,否则您不必担心性能。即使用/测试告诉您您需要进行更改。然后,您应该进行概要分析以找出导致问题的原因,然后进行解决。

也就是说,您不必每次都需要创建一个新的形状图层,只需更新路径即可。

10-05 20:23