2013-12-05 1 views
8

У меня есть перетаскиваемый вид, на котором есть слой маски. На слое маски есть UIBezierPath, который делает область просмотра прозрачной/прозрачной (эффект, который я хочу). Моя конечная цель - изменить положение и размер пути (а не слой маски!), Передав CGRect, который вычисляется на основе пересечения моего представления и другого прямоугольника (в основном я хочу скрыть область, которая пересекает).Reposition/resize UIBezierPath

1) Как создать маску и путь (создает сквозной прямоугольник на мой взгляд):

self.maskLayer = [CAShapeLayer layer]; 
self.maskLayer.frame = self.contentView.bounds; 

//default path rect 
CGRect const rect = CGRectMake(CGRectGetMidX(self.contentView.bounds) , 
            CGRectGetMidY(self.contentView.bounds), 
            50,50); 


path = [UIBezierPath bezierPathWithRect:rect]; 

[path appendPath:[UIBezierPath bezierPathWithRect:self.contentView.frame]]; 

self.maskLayer.path = path.CGPath; 

self.maskLayer.fillRule = kCAFillRuleEvenOdd; 

self.contentView.layer.mask = self.maskLayer; 

2) Моя проблема заключается в том, что я не мог найти способ, чтобы изменить размер/репозицию только путь. Я искал в Интернете, но не нашел решения.

Этот код не работает, но это то, что я мог думать:

//runs while the view is being dragged(using UIPanGestureRecognizer) 
-(void)move{ 
CGRect intersectedRect = CGRectIntersection(self.frame, self.productView.frame); 
path = [UIBezierPath bezierPathWithRect:intersectedRect]; 
[path appendPath:[UIBezierPath bezierPathWithRect:intersectedRect]]; 
[self.maskLayer setNeedsDisplay]; 
} 

Как я могу управлять только путем masklayer в моей функции двигаться? Спасибо!

+0

Где вы получаете переменную пути во втором фрагменте? Где вы устанавливаете путь к слою маски? Почему вы добавляете тот же самый путь к пути? – yurish

+0

Я использую ту же переменную пути из первого фрагмента, глобального пути var. Я устанавливаю путь в первом фрагменте здесь (self.maskLayer.path = path.CGPath;) И я добавляю self.contentView.frame к пути, извините, это была ошибка типа. – Soc

+0

Да, но я не вижу, где вы назначили обновленный путь в методе перемещения. – yurish

ответ

2

Вам необходимо назначить обновленный путь self.maskLayer.path в вашем методе перемещения.

16
// example path 
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100) cornerRadius:4]; 

// scale it 
CGFloat scale = 0.9; 
[path applyTransform:CGAffineTransformMakeScale(scale, scale)]; 

// move it 
CGSize translation = CGSizeMake(10, 5); 
[path applyTransform:CGAffineTransformMakeTranslation(translation.width, 
                 translation.height)]; 

// apply it 
self.myLayer.path = path; 
7

Swift версия

Вот @ код hfossli для Swift:

// example path 
let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: 100, height: 100), cornerRadius: 4) 

// scale it 
let scale = CGFloat(0.9) 
path.applyTransform(CGAffineTransformMakeScale(scale, scale)) 

// move it 
let translation = CGSize(width: 10, height: 5) 
path.applyTransform(CGAffineTransformMakeTranslation(translation.width, 
    translation.height)) 

// apply it 
self.myLayer.path = path 

Update

я нашел в реальной практике, что я просто просто разные первоначальный при создании UIBezierPath вместо того, чтобы преобразовывать его позже. Думаю, это будет зависеть от цели.

0

Это в быстром 3

func move(path: UIBezierPath, fromPoint: CGPoint, toPoint: CGPoint) { 
    let moveX = toPoint.x - fromPoint.x 
    let moveY = toPoint.y - fromPoint.y 
    path.apply(CGAffineTransform(translationX: moveX, y: moveY)) 
} 

func scale(path: UIBezierPath, fromSize: CGSize, toSize: CGSize) { 
    if fromSize.width == 0 || fromSize.height == 0 { 
     return 
    } 
    let scaleWidth = toSize.width/fromSize.width 
    let scaleHeight = toSize.height/fromSize.height 
    path.apply(CGAffineTransform(scaleX: scaleWidth, y: scaleHeight)) 
} 
0

Swift 3 расширения (изменить его factorX, фабричные, если это необходимо):

extension UIBezierPath 
{ 

    func scaleAroundCenter(factor: CGFloat) 
    { 
     let beforeCenter = self.bounds.getCenter() 

     // SCALE path by factor 
     let scaleTransform = CGAffineTransform(scaleX: factor, y: factor) 
     self.apply(scaleTransform) 

     let afterCenter = self.bounds.getCenter() 
     let diff = CGPoint(
      x: beforeCenter.x - afterCenter.x, 
      y: beforeCenter.y - afterCenter.y) 

     let translateTransform = CGAffineTransform(translationX: diff.x, y: diff.y) 
     self.apply(translateTransform) 
    } 

}