2017-01-24 3 views
0

Ich bin neu in die Programmierung und ich habe keine Ahnung, wie ich eine nicht definierte geometrische Form mit einem Farbverlauf füllen ... konnte ich so mit einer einfachen Farbe tun:Füllen undefinierte Formen mit Farbverlauf SWIFT

func fillRegion(pixelX: Int, pixelY: Int, withColor color: UIColor) { 

    var red: CGFloat = 0, green: CGFloat = 0, blue: CGFloat = 0, alpha: CGFloat = 0 
    color.getRed(&red, green: &green, blue: &blue, alpha: &alpha) 

    var newColor = (UInt32)(alpha*255)<<24 | (UInt32)(red*255)<<16 | (UInt32)(green*255)<<8 | (UInt32)(blue*255)<<0 

    let pixelColor = regionsData.advanced(by: (pixelY * imageHeight) + pixelX).pointee 

    if pixelColor == blackColor { return } 

    var pointerRegionsData: UnsafeMutablePointer<UInt32> = regionsData 
    var pointerImageData: UnsafeMutablePointer<UInt32> = imageData 

    var pixelsChanged = false 

    for i in 0...(imageHeight * imageHeight - 1) { 
     if pointerRegionsData.pointee == pixelColor { 
      pointerImageData = imageData.advanced(by: i) 
      if pointerImageData.pointee != newColor { 
//     newColor = newColor + 1 
       pointerImageData.pointee = newColor 
       pixelsChanged = true 
      } 
     } 
     pointerRegionsData = pointerRegionsData.successor() 
    } 

    if pixelsChanged { 
     self.image = UIImage(cgImage: imageContext.makeImage()!) 
     DispatchQueue.main.async { 
      CATransaction.setDisableActions(true) 
      self.layer.contents = self.image.cgImage 
      self.onImageDraw?(self.image) 
     } 
     self.playTapSound() 
    } 
} 

Pixel für Pixel füllen Sie die Farbe (ignorieren die schwarze Farbe) irgendwelche Ideen, wie man das mit Farbverlauf tun? Vielen Dank!

Antwort

1

Sie können eine Farbverlaufsebene erstellen und ein Bild oder eine Formebene als Maske anwenden. Hier ist ein Spielplatz.

import PlaygroundSupport 
    import UIKit 

    class V: UIView { 
     private lazy var gradientLayer: CAGradientLayer = { 
      let gradientLayer = CAGradientLayer() 
      gradientLayer.colors = [UIColor.red.cgColor, 
            UIColor.purple.cgColor, 
            UIColor.blue.cgColor, 
            UIColor.white.cgColor] 
      gradientLayer.locations = [0, 0.3, 0.9, 1] 
      gradientLayer.startPoint = CGPoint(x: 0, y: 0) 
      gradientLayer.endPoint = CGPoint(x: 0, y: 1) 
      gradientLayer.mask = self.strokeLayer 
      self.layer.addSublayer(gradientLayer) 
      return gradientLayer 
     }() 

     private lazy var strokeLayer: CAShapeLayer = { 
      let strokeLayer = CAShapeLayer() 
      strokeLayer.path = UIBezierPath(ovalIn: CGRect(x:0, y: 0, width: 100, height: 100)).cgPath 
      return strokeLayer 
     }() 

     override func layoutSubviews() { 
      super.layoutSubviews() 
      strokeLayer.path = UIBezierPath(ovalIn: bounds).cgPath 
      gradientLayer.frame = bounds 

      layer.addSublayer(gradientLayer) 
     } 
    } 
    let v = V(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
    PlaygroundPage.current.liveView = v 
0

Ich bin nicht 100% sicher, dass ich die Frage verstehe, aber es scheint wie Sie möchten, um irgendeine alte Form mit einem Farbverlauf zu füllen, richtig? Wenn dies der Fall ist, gibt es mehrere Möglichkeiten, dies zu tun. Am einfachsten ist es jedoch, einen Verlauf zu erstellen, der die gleiche Größe wie der Rand der Form hat, und ihn dann als Farbe anzuwenden. Ich schreibe dies auf meinem PC so bin ich sicher, dass es Syntaxfehler, aber hier geht ...

let size = CGSize(width, height) 
UIGraphicsRenderer(size, false, 0) // I KNOW I have this one wrong 
let colors = [tColour.cgColor, bColour.cgColor] as CFArray 
let colorSpace = CGColorSpaceCreateDeviceRGB() 
let gradient = CGGradient(colorsSpace: colorSpace, colors: colors , locations: nil) 

die Farben Array Set je nach Bedarf und dann, dass in den UIImage senden. Sie können Orte verwenden: um die Ausrichtung zu ändern.