2016-10-20 47 views
0

我想繪製一個扇形數組和一個圖像在每個切片中心的餅圖,我繪製了餅圖,但無法將圖像添加到cashapelayer我提到了以下帖子Swift: Add image to CAShapeLayer,但它沒有解決我的問題。將圖像添加到CAShapeLayer Swift 3

這是我試過的。

override func draw(_ rect: CGRect) { 
     //let context = UIGraphicsGetCurrentContext() 
     let radius = min(frame.size.width,frame.size.height) * 0.5; 
     let viewCenter = CGPoint(x: frame.size.width * 0.5, y: frame.size.height * 0.5) 
     let valueCount = segments.reduce(0){ $0 + $1.value} 
     var startAngle = -CGFloat(M_PI/2) 

     for segment in segments { 
      let endAngle = startAngle + CGFloat(M_PI * 2) * (segment.value)/valueCount 

      /*context?.move(to: CGPoint(x: viewCenter.x, y: viewCenter.y)) 
      context?.setFillColor(segment.color.cgColor) 
      context?.setStrokeColor(UIColor.black.cgColor) 
      context?.setLineWidth(3.0) 
      context?.addArc(center: viewCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false) 
      context?.fillPath()*/ 

      let pieSliceLayer = CAShapeLayer() 
      let slicePath = UIBezierPath(arcCenter: viewCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: false) 
      pieSliceLayer.path = slicePath.cgPath 
      pieSliceLayer.fillColor = segment.color.cgColor 
      self.layer.addSublayer(pieSliceLayer) 

      let halfAngle = startAngle + (endAngle - startAngle) * 0.5; 
      let imagePositionValue = CGFloat(0.67) 
      let segmentCenter = CGPoint(x:viewCenter.x+radius*imagePositionValue*cos(halfAngle),y:viewCenter.y+radius*imagePositionValue*sin(halfAngle)) 

      //If image is associated , add the image to the section 
      let imageLayer = CAShapeLayer() 
      let image = UIImage(named: segment.imageName) 
      imageLayer.contents = image?.ciImage 
      imageLayer.frame = CGRect(x: segmentCenter.x - 20, y: segmentCenter.y - 20, width: 20, height: 20) 
      self.layer.addSublayer(imageLayer) 
      startAngle = endAngle 

     } 
    } 

我試圖在Objective-C類似的東西,它工作正常,

CALayer *imageLayer = (CALayer *)[[pieLayer sublayers] objectAtIndex:0]; 
    //Adding image 
    CALayer *layer = [CALayer layer]; 
    layer.backgroundColor = [[UIColor clearColor] CGColor]; 
    layer.bounds = CGRectMake(imageLayer.bounds.origin.x +20 , 
            imageLayer.bounds.origin.y + 20, 15, 15); 
    NSString *imageName = [NSString stringWithString:[[self.goalSettingsModel objectAtIndex:value] valueForKeyPath:@"imageName"]]; 
    layer.contents = (id)[UIImage imageNamed:imageName].CGImage; 
    [imageLayer addSublayer:layer]; 
    [imageLayer setNeedsDisplay]; 

我不知道,如果我錯過了CALayer的任何設置。

+0

您好曾試圖這樣做的方式爲目的相同 - Ç片斷,來計算弧的中心路徑我正在使用下面的代碼,我仍然看不到圖像,讓boundingBox = pieSliceLayer.path?.boundingBox let centerPoint = CGPoint(x:(boundingBox?.origin.x)!+(boundingBox?.size.width )!/ 2,y:(boundingBox?.origin.y)!+(boundingBox?.size.height)!/ 2) –

回答

1

設置所述層中的位置屬性後,適當地加入到該形狀層中的圖像,

let imageLayer = CALayer() 
     imageLayer.backgroundColor = UIColor.clear.cgColor 
     imageLayer.bounds = CGRect(x: centerPoint.x, y: centerPoint.y , width: 15, height: 15) 
     imageLayer.position = CGPoint(x:centerPoint.x ,y:centerPoint.y) 
      imageLayer.contents = UIImage(named:segment.imageName)?.cgImage 
     self.layer.addSublayer(pieSliceLayer) 
     self.layer.addSublayer(imageLayer) 
0

幾件事情:

首先,你只需要更新的形狀層時,圖更改(調用setNeedsDisplay),或者當你有一個佈局的變化(viewDidLayoutSubviews)。除非你真的要繪畫,否則你不需要實現drawRect。分層系統知道如何渲染形狀圖層,並根據需要進行渲染。

其次,CAShapeLayer用於形狀。實際上有一大堆CALayers,他們都繪製了不同的東西:https://www.raywenderlich.com/90919/great-calayer-tour-tech-talk-video。在一個普通的舊圖像的情況下,只要做你的目標C代碼正在做的事情,並使用一個單獨的CALayer來保存圖像,而不是CAShapeLayer。根據您的z順序首選項,將圖像圖層添加爲圖形形狀圖層頂部或後面的子圖層。

+0

感謝您的視頻鏈接,它非常有用。我通過設置CALayer的位置來解決問題。讓imageLayer = CALayer() imageLayer.backgroundColor = UIColor.clear.cgColor imageLayer.bounds = CGRect(x:centerPoint.x,y:centerPoint.y,width:15,height:15) imageLayer.position = CGPoint( x:centerPoint.x,y:centerPoint.y) imageLayer.contents = UIImage(named:segment.imageName)?. cgImage self.layer.addSublayer(pieSliceLayer) self.layer.addSublayer(imageLayer) –