2017-10-21 20 views
1

그래서 UILabel이 그라데이션 이미지 (즉, UIImageView) 위에 그려집니다. 그것은 다음과 같이 그렇다고 같습니다Swift에서 draw (_ rect : CGRect)에서 다른 혼합 모드로 UILabel을 그리는 방법

enter image description here

나는 그것이 softLight 혼합 모드와 배경 레이블하지만 혼합을 그립니다 있도록 UILabeldraw(_ rect: CGRect) 기능의 그래픽 문맥의 blendMode을 변경하기 위해 노력하고있어 .

override func draw(_ rect: CGRect) { 
    // Drawing code 
    if let context = UIGraphicsGetCurrentContext() { 
     context.setBlendMode(.softLight) 
     self.textColor.set() 
     self.drawText(in: rect) 
    } 
} 

이 코드는 바로 위에 사진을 렌더링하지 :

여기 enter image description here

내가 draw(_ rect: CGRect) 기능에이 코드입니다 : 여기

내가 그것을 같이 할 것입니다 혼합 된 버전. 이것은 내가 시도한 전부는 아니며, 나는 많은 것을 시도했지만, 특히 CGContextdraw 기능을 이해하지 못한다.

SO에 대한 대부분의 답변은 오래된 목표 -C 중 하나이며 더 이상 사용되지 않거나 손상되었거나 신속하고 복잡합니다 (예 : 금속 사용). 난 그냥 내가 가진 컨텍스트에서 텍스트를 그려 소프트 라이트에 컨텍스트의 블렌딩 모드를 설정하고 싶다. 쉬운 방법이 있어야합니다!

이 문제를 해결하는 방법에 대한 도움을 주시면 감사하겠습니다. 감사!

답변

1

이렇게하면보기를 혼합 할 수 없습니다. 그들은 독립적으로 해결되는 별도의 계층 구조를 가지고 있습니다. 그라디언트와 텍스트를 CALayer 개체 위로 이동하고 이들을 혼합합니다 (또는 같은보기 내에서 손으로 그립니다). 예를 들어 :

class MyView: UIView { 
    let gradientLayer: CAGradientLayer = { 
     let gradientLayer = CAGradientLayer() 
     gradientLayer.colors = [UIColor.red.cgColor, 
           UIColor.blue.cgColor] 
     gradientLayer.startPoint = CGPoint(x: 0, y: 0) 
     gradientLayer.endPoint = CGPoint(x: 1, y: 1) 
     return gradientLayer 
    }() 

    let textLayer: CATextLayer = { 
     let textLayer = CATextLayer() 
     let astring = NSAttributedString(string: "Text Example", 
             attributes: [.font: UIFont(name: "MarkerFelt-Wide", size: 60)!]) 
     textLayer.string = astring 
     textLayer.alignmentMode = kCAAlignmentCenter 
     textLayer.bounds = astring.boundingRect(with: CGSize(width: .max, height: .max), 
               options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil) 
     return textLayer 
    }() 

    override func draw(_ rect: CGRect) { 
     if let context = UIGraphicsGetCurrentContext() { 
      gradientLayer.bounds = bounds 
      gradientLayer.render(in: context) 

      context.saveGState() 
      context.setBlendMode(.softLight) 

      context.translateBy(x: center.x - textLayer.bounds.width/2, 
           y: center.y - textLayer.bounds.height/2) 

      textLayer.position = center 
      textLayer.render(in: context) 
      context.restoreGState() 
     } 
    } 
} 

enter image description here

+0

답변 해 주셔서 감사합니다. 당신은 이해하고 내가 원하는 것을 제게 줄 수있는 유일한 사람인 것 같습니다. 불행히도 내 레이블이 움직이기 때문에 모든 단계에서 "색상 혼합"을 업데이트하고 싶습니다. 그렇게 할 방법이 있습니까? – QuantumHoneybees

+0

그건 그냥 애니메이션입니다. 텍스트의 위치를 ​​나타내는 속성이 필요합니다. 해당 속성을 수정하려면'animate (withDuration : animations :)'를 사용하고 변경된 경우에는'setNeedsDisplay'를 호출하기 위해 해당 속성에 대한'didSet'을 추가하십시오. (원칙적으로 더 많은 접근 방식이 있지만 복잡하기 때문에 심각한 성능 문제가 발생하지 않는 한 걱정하지 않아도됩니다. Core Graphics 및 Core Animation은 이미 이러한 작업을 매우 쉽게 수행 할 수 있습니다. 경로 및 가장 단순한 시도로 시스템을 최적화하고 악화시킬 수 있습니다.) –

+0

이 작업은 모두 'UIView'보다는 'CALayer'를 사용하여 수행 할 수 있지만 'CALayer'의 사용자 정의 속성을 애니메이션화하면 그것이 들리는 것보다 약간 까다 롭다.그것은 어렵지 않지만, 사람들이 필요로하지 않는 한 보통 사람들에게 추천하지는 않는다. –

0

텍스트가 실제로 라벨 인 경우 일반 라벨과 같이 불투명도를 변경하여 시도해 볼 수 있습니다. 알파에 라벨을 붙이는 것에 익숙하다고 가정합니다. 레이블에 대한 알파를 설정 한 예를 검색 :이 레이블이 아니라면

label.textColor = UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.25) 

는 나에게 힌트를주세요 - 다음은 더 복잡해야한다.

+0

그것은 레이블입니다,하지만 난 불투명도를 변경하지 않는, 내가 특별히 부드러운 빛 (또는 다른 모드)로 혼합 모드를 변경하고 싶습니다. – QuantumHoneybees