如何在 UIView 中剪切路径?

Posted

技术标签:

【中文标题】如何在 UIView 中剪切路径?【英文标题】:How to cut a path in UIView? 【发布时间】:2016-01-02 05:37:49 【问题描述】:

我想知道如何在 UIView 中剪出一条路径。

这是我的问题的简要描述 -

我有两个UIViews,一个是红色的,另一个是绿色的。 绿色的在红色的上面。 因此,如果用户在绿色的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 中剪切路径?的主要内容,如果未能解决你的问题,请参考以下文章

从子视图中的路径对象在 UIView 中构建剪辑区域

如何在Android中剪切矩形内的圆形路径

在 FabricJS 中调整窗口大小时如何始终将剪切区域居中?

如何告诉 Ghostscript 在从 eps 到 tiff 的转换中不要使用剪切路径?

如何将剪切路径应用于 DIV 容器

如何在织物画布中使用背景图像获取绘图路径中的图像?