如何在 UIView 中剪切路径?
Posted
技术标签:
【中文标题】如何在 UIView 中剪切路径?【英文标题】:How to cut a path in UIView? 【发布时间】:2016-01-02 05:37:49 【问题描述】:我想知道如何在 UIView 中剪出一条路径。
这是我的问题的简要描述 -
我有两个UIView
s,一个是红色的,另一个是绿色的。
绿色的在红色的上面。
因此,如果用户在绿色的UIView
上触摸并移动手指,他的触摸位置应该从那个UIView
中删除,并且从那个区域应该可以看到红色的UIView
。
这是一张可以轻松描述问题的图片 - Visual description
我知道如何获取用户的手指触摸位置,但不知道如何从UIView
切出路径。
请帮忙。
【问题讨论】:
只需将接触点设置为红色即可。 不能这样做,因为视图中的红色和绿色只是为了更好地理解,实际视图会有不同的子视图。 【参考方案1】:我只使用 1 个视图。你也可以这样做。
斯威夫特:
import UIKit
class PanView: UIView
override init(frame: CGRect)
super.init(frame: frame)
_init()
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
_init()
func _init()
layer.backgroundColor = UIColor.greenColor().CGColor
let green = CALayer()
green.frame = layer.bounds
green.backgroundColor = UIColor.redColor().CGColor
layer.addSublayer(green)
let mask = CAShapeLayer()
mask.frame = green.bounds
mask.strokeColor = UIColor.whiteColor().CGColor
mask.fillColor = UIColor.clearColor().CGColor
mask.lineWidth = 10
mask.lineJoin = kCALineJoinRound
let path = UIBezierPath()
mask.path = path.CGPath
green.mask = mask
let pan = UIPanGestureRecognizer(target: self, action: "pan:")
addGestureRecognizer(pan)
func pan(pan: UIPanGestureRecognizer)
let p = pan.locationInView(self)
if let mask = layer.sublayers?.first?.mask as? CAShapeLayer, path = mask.path
let path = UIBezierPath(CGPath: path)
if pan.state == UIGestureRecognizerState.Began
path.moveToPoint(p)
else
path.addLineToPoint(p)
mask.path = path.CGPath
目标-C:
#import "PanView.h"
@implementation PanView
- (instancetype)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
[self _init];
return self;
- (instancetype)initWithCoder:(NSCoder *)coder
self = [super initWithCoder:coder];
if (self)
[self _init];
return self;
- (void)_init
self.layer.backgroundColor = [UIColor greenColor].CGColor;
CALayer *green = [CALayer layer];
green.frame = self.layer.bounds;
green.backgroundColor = [UIColor redColor].CGColor;
[self.layer addSublayer:green];
CAShapeLayer *mask = [CAShapeLayer layer];
mask.frame = green.bounds;
mask.strokeColor = [UIColor whiteColor].CGColor;
mask.fillColor = [UIColor clearColor].CGColor;
mask.lineWidth = 10;
mask.lineJoin = kCALineJoinRound;
UIBezierPath *path = [UIBezierPath bezierPath];
mask.path = path.CGPath;
green.mask = mask;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
[self addGestureRecognizer:pan];
- (void)pan:(UIPanGestureRecognizer *)pan
CGPoint p = [pan locationInView:self];
CALayer *green = (id)self.layer.sublayers.firstObject;
CAShapeLayer *mask = (id)green.mask;
UIBezierPath *path = [UIBezierPath bezierPathWithCGPath:mask.path];
if (pan.state == UIGestureRecognizerStateBegan)
[path moveToPoint:p];
else
[path addLineToPoint:p];
mask.path = path.CGPath;
@end
【讨论】:
你能给我这段代码的客观 c 版本吗?以上是关于如何在 UIView 中剪切路径?的主要内容,如果未能解决你的问题,请参考以下文章
在 FabricJS 中调整窗口大小时如何始终将剪切区域居中?