2013-07-09 13 views
12

yapmak için birden çok CGPath'i birleştirin Birkaç CGR ve Elips kullanarak karmaşık bir şekil yapıyorum. Oluşturulduktan sonra bu yolu inmek istiyorum. Yolu hareket ettirdiğimde, her şekli okşadı. Her şekli tek bir yolla birleştirebilmem için bir yol var mı, inme kesişmiyor mu?Bir yolu

enter image description here

int thirds = self.height/3; 

CGPathRef aPath = CGPathCreateMutable(); 

CGRect rectangle = CGRectMake((58 - 10)/2, 46, 10, self.height - 58); 
CGPathAddRect(aPath, nil, rectangle); 

CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, 0, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds * 2, 48, 48)); 
CGPathAddEllipseInRect(aPath, nil, CGRectMake(0, self.height - 58, 58, 58)); 
CGPathCloseSubpath(aPath); 
CGPathRef other = CGPathCreateCopy(aPath); 

CAShapeLayer *square = [CAShapeLayer layer]; 
square.fillColor = [UIColor colorWithRed:36/255.0f green:56/255.0f blue:82/255.0f alpha:1.0f].CGColor; 
square.strokeColor = [UIColor colorWithRed:50/255.0f green:70/255.0f blue:96/255.0f alpha:1.0f].CGColor; 
square.path = other; 
[self.layer addSublayer:square]; 

GÜNCELLEME

Birlikte yolları ekleyerek denedim ve sadece anahatlarını tanımlayan bir yolunu istiyorsanız Ben aynı sonucu

CGPathAddPath(aPath, nil, CGPathCreateWithRect(rectangle, nil)); 

CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, 0, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, thirds, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake((58 - 48)/2, thirds * 2, 48, 48), nil)); 
CGPathAddPath(aPath, nil, CGPathCreateWithEllipseInRect(CGRectMake(0, self.height - 58, 58, 58), nil)); 
+0

'CGPathAddPath (path1, NULL, yol2) için Thomas Zoechling cevabı dayanarak' – CodaFi

+0

@CodaFi Bu yüzden her şekil için yeni bir yol yarat ve 'CGPathAddPath'? – brenjt

cevap

20

var Yol kompozisyonunuzda, katılımcı şekillerde boole işlemleri yapmanız gerekir.
Orada bazı iyi eğiticiler var.
Ör: sadece bir taslak görünümünü elde etmek istiyorsanız http://losingfight.com/blog/2011/07/07/how-to-implement-boolean-operations-on-bezier-paths-part-1/

, size 2 şekil katmanları çizebilirdim: Bir CGPathCreateCopyByStrokingPath yoluyla elde yolu ve

  • tane doldurur

    • biri olduğunu Yayınladığınız koddan şekiller kullanarak

    tepesinde orijinal yolu doldurur:

    int thirds = self.height/3; 
    
    CGMutablePathRef aPath = CGPathCreateMutable(); 
    
    CGRect rectangle = CGRectMake((58 - 10)/2, 46, 10, self.height - 58); 
    CGPathAddRect(aPath, nil, rectangle); 
    
    CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, 0, 48, 48)); 
    CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds, 48, 48)); 
    CGPathAddEllipseInRect(aPath, nil, CGRectMake((58 - 48)/2, thirds * 2, 48, 48)); 
    CGPathAddEllipseInRect(aPath, nil, CGRectMake(0, self.height - 58, 58, 58)); 
    CGPathCloseSubpath(aPath); 
    
    CGPathRef other = CGPathCreateCopyByStrokingPath(aPath, NULL, 12.0, kCGLineCapRound, kCGLineJoinRound, 1.0); 
    CAShapeLayer *square = [CAShapeLayer layer]; 
    square.fillColor = [UIColor colorWithRed:36/255.0f green:56/255.0f blue:82/255.0f alpha:1.0f].CGColor; 
    square.path = other; 
    [self.view.layer addSublayer:square]; 
    
    CAShapeLayer *square2 = [CAShapeLayer layer]; 
    square2.fillColor = [UIColor colorWithRed:50/255.0f green:70/255.0f blue:96/255.0f alpha:1.0f].CGColor; 
    square2.path = aPath; 
    [self.view.layer addSublayer:square2]; 
    
    aşağıdaki şekil çizmek olacaktır

    :
    enter image description here

  • +0

    Siz bir deha ve bir bilgin vardır. Açıklama için teşekkürler. – brenjt

    +0

    Bir şey değil! –

    1

    swift3

    height = self.bounds.size.height 
    let thirds = self.height/3 
    
    let aPath: CGMutablePath = CGMutablePath() 
    let rect = CGRect(x: (58 - 10)/2, y: 46, width: 10, height: self.height - 58) 
    aPath.addRect(rect) 
    
    aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: 0, width: 48, height: 48)) 
    aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: thirds, width: 48, height: 48)) 
    aPath.addEllipse(in: CGRect(x: (58 - 48)/2, y: thirds * 2, width: 48, height: 48)) 
    aPath.addEllipse(in: CGRect(x: 0, y: self.height, width: 48, height: 48)) 
    aPath.closeSubpath() 
    
    let other: CGPath = aPath.copy(strokingWithWidth: 12, lineCap: .round, lineJoin: .round, miterLimit: 1.0) 
    let square = CAShapeLayer() 
    square.fillColor = UIColor(red: 36/255.0, green: 56/255.0, blue: 82/255.0, alpha: 1.0).cgColor 
    square.path = other 
    self.layer.addSublayer(square) 
    
    let square2 = CAShapeLayer() 
    square2.fillColor = UIColor(red: 50/255.0, green: 70/255.0, blue: 96/255.0, alpha: 1.0).cgColor 
    square2.path = aPath 
    self.layer.addSublayer(square2) 
    
    İlgili konular