2017-01-24 9 views
0

Я новичок в программировании и я не имею ни малейшего представления о том, как я могу заполнить неопределенную геометрическую форму с цветом градиента ... мне удалось сделать с помощью простого цвета, как, что:Заполнение неопределенные формы с градиентом цвета СВИФТ

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 by pixel заполняет цвет (игнорируя черный цвет) любые идеи, как это сделать с градиентом цвета? благодаря!

ответ

1

Вы можете сделать слой градиента и применить изображение или слой формы в качестве маски. Здесь есть детская площадка.

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

Я не уверен на 100%, я понимаю вопрос, но это кажется как вы хотите заполнить любую старую форму градиентом, не так ли? Если это так, есть несколько способов сделать это, но проще всего сделать градиент такого же размера, как и граница формы, а затем применить его как цвет. Я печатаю это на моем компьютере, так что я уверен, что есть синтаксические ошибки, но здесь идет ...

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) 

Установите массив цветов по мере необходимости, а затем отправить его в UIImage. Вы можете использовать местоположения: изменить ориентацию.