Tengo la posibilidad de arrastrar la vista que tiene una máscara de capa. La capa de máscara tiene un UIBezierPath en lo que hace que un área en la vista ver/transparente(el efecto que quiero). Mi objetivo final es cambiar la posición y el tamaño de la ruta(no el de la máscara de capa!) pasando un CGRect que se calcula sobre la base de la intersección de mi punto de vista y otro rectángulo(Básicamente quiero ocultar el área que se cruza).

1) ¿Cómo puedo crear mi máscara y la ruta de acceso(crea una ver-a través de rectángulo en mi punto de vista):

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) Mi problema es que yo no podía encontrar una manera de cambiar el tamaño/reposicionar sólo el camino. He buscado por internet pero no pude encontrar ninguna solución.

Este código no funciona, pero es lo que pude pensar:

//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];
 }

¿Cómo puedo manipular sólo el camino de la masklayer en mi función mover?
Gracias!

  • De donde sacas la variable path en el segundo fragmento? Donde se establece la ruta de acceso a la capa de máscara? ¿Por qué anexar el mismo rect a la ruta?
  • Estoy usando la misma variable de ruta de acceso desde el primer fragmento, un mundial de ruta var. I establecer la ruta de acceso en el primer fragmento de aquí(de sí mismo.maskLayer.ruta = ruta de acceso.CGPath;) Y estoy anexando auto.contentView.marco de la ruta, lo siento fue un error.
  • Sí, pero no veo donde se asigna la ruta de acceso actualizada en el método de mover.
  • -(void)mover{ CGRect intersectedRect = CGRectIntersection(auto.marco, yo.productView.frame); path = [UIBezierPath bezierPathWithRect:intersectedRect]; [ruta appendPath:[UIBezierPath bezierPathWithRect:auto.contentView.de la imagen]]; auto.maskLayer.ruta = ruta de acceso.CGPath; auto.maskLayer.fillRule = kCAFillRuleEvenOdd; auto.contentView.la capa.máscara = auto.maskLayer; }
  • Ahora su actualización, pero después de como 10 segundos. ¿Sabes por qué puede ser?
  • Mejor actualización que pregunta con el nuevo código. Hay muchos el retraso puede suceder. Compruebe primero que el movimiento se llama al método sin demora. ¿Llama usted a mover en el hilo principal?
  • El método move es ser llamado correctamente sin demora, porque tengo más de código en el interior que arrastra a la vista. Yo llame a moverse en el hilo principal, pero por dentro me puedes abrir otro hilo y me calcular intersecciones y cambiar la ruta de acceso. El camino de los cambios, pero después de 10 segundos
  • Abrir otra pregunta de este con código actualizado y detalles acerca de cómo y para qué se gira el nuevo hilo para el cálculo.
  • He encontrado el problema, yo estaba intentando actualizar la ruta de acceso en el hilo y no en el extremo de la rosca. Gracias por tratar de ayudarme.

InformationsquelleAutor Soc | 2013-12-05

5 Comentarios

  1. 2

    Deberá asignar la ruta de acceso actualizada a self.maskLayer.path en su método de mover.

  2. 17
    //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;
  3. 10

    Swift versión

    Aquí es @hfossli código 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

    Actualización

    Que me he encontrado en la práctica real que me acaba de valores iniciales diferentes a la hora de crear un UIBezierPath en lugar de su transformación posterior. Supongo que dependerá de la finalidad.

  4. 2

    Es en swift 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))
    }
  5. 1

    Swift 3 extensión (modificar con factorX, la fábrica si es necesario) :

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

Dejar respuesta

Please enter your comment!
Please enter your name here