2016-01-02 3 views
2

Я хочу знать, как я могу вырезать путь в UIView.Как проложить путь в UIView?

Вот краткое описание моей проблемы -

У меня есть два UIView с, один с красным и другой с зеленым цветом фона. Зеленый один на вершине красного. Так что, если пользователь прикасается и передвигает палец по зеленому UIView, то положение его касания должно быть вырезано из этого UIView, а красный UIView должен быть виден из этой области.

Вот изображение, которое можно описать проблему легко - Visual description

Я знаю, как получить позицию прикосновения пальцев пользователя, но не знаю, как вырезать путь от UIView.

Пожалуйста, помогите.

+0

Просто установите точки касания, как красный цвет. – sourav

+0

Не могу этого сделать, потому что красный и зеленый цвета в представлениях предназначены только для лучшего понимания, фактические представления будут иметь разные подзаголовки и все. –

ответ

-1

Я использую только 1 вид. Вы можете сделать то же самое.

Swift:

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 
    } 
    } 
} 

Objective-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 
+0

что-то пошло не так? –

+0

Не могли бы вы дать мне объективную версию этого кода? –

+0

easy, wait me 5 ' –

Смежные вопросы