Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 리펙터링
- MVVM
- Refactoring
- clean architecture
- Xcode
- map
- RxCocoa
- swiftUI
- ribs
- UICollectionView
- tableView
- combine
- Clean Code
- 클린 코드
- ios
- HIG
- uiscrollview
- uitableview
- 리팩토링
- swift documentation
- UITextView
- SWIFT
- Observable
- 애니메이션
- Protocol
- 리펙토링
- 스위프트
- Human interface guide
- collectionview
- rxswift
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] CAGradientLayer, layer.mask (+ 텍스트 gradient fade out 처리) 본문
iOS 응용 (swift)
[iOS - swift] CAGradientLayer, layer.mask (+ 텍스트 gradient fade out 처리)
jake-kim 2021. 3. 26. 02:21
CAGradientLayer이란?
- layer에 색 그라데이션을 입히는데 사용되는 객체
- 주로 UIView나 UILabel의 text에 그라데이션을 입히는데 사용
CAGradientLayer 사용 방법
- 객체 생성 후 frame 설정: frame은 적용될 view의 bounds로 설정
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
- 그라데이션에 들어갈 색상 추가(처음 ~ 마지막 순서대로 기입): 타입은 [CGColor] 타입
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor]
- gradientLayer의 속성을 모두 지정하였으므로 (적용될뷰.layer.addSublayer)로 layer 적용
myView.layer.addSublayer(gradientLayer)
- 전체 코드
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor]
myView.layer.addSublayer(gradientLayer)
CAGradientLayer의 속성
- 위의 예제는 색상을 균일하게 등분하여 orange와 red를 5:5로 그라데이션 효과를 적용
- locations속성: 0~1사이의 값을 순서대로 그라데이션이 종료되는 구간을 기입 (디폴트는 세로로 진행)
- 반드시 오름차순으로 기입
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor]
gradientLayer.locations = [0.7] // <- 추가
myView.layer.addSublayer(gradientLayer)
gradientLayer.locations = [0.3]
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor, UIColor.black.cgColor]
gradientLayer.locations = [0.3, 0.6]
- startPoint, endPoint 속성: 가로 또는 다양한 방향으로 그라데이션을 적용하고 싶은 경우 사용
- startPoint와 endPoint는 방향을 의미: ex) 가로로 적용하고 싶은 경우에 (0, 0.5) -> (1, 0.5)로 지정
// 가로 그라데이션
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myView.bounds
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor, UIColor.black.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5) // <- 추가
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5) // <- 추가
myView.layer.addSublayer(gradientLayer)
// 대각선 그라데이션
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 1)
텍스트에 그라데이션을 넣어서 텍스트 gradient fade out 처리 구현
- UIView의 layer.mask 속성: 텍스트에도 동일하게 CAGradientLayer()를 사용하면 되지만, 뷰가 아닌 글자에만 그라데이션을 입힐 경우 사용
- layer.mask속성을 사용하지 않을 경우 아래처럼 view자체에 그라데이션이 덮어지는 현상 발생
let gradientLayer = CAGradientLayer()
gradientLayer.frame = myLabel.bounds
gradientLayer.colors = [UIColor.orange.cgColor, UIColor.red.cgColor, UIColor.black.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1, y: 0.5)
myLabel.layer.addSublayer(gradientLayer)
- layer.mask속성을 사용하여 gradient fade out 적용
extension UILabel {
func fadeOutTail() {
let gradientLayer = CAGradientLayer()
gradientLayer.frame = bounds
gradientLayer.colors = [textColor.cgColor, UIColor.clear.cgColor]
gradientLayer.startPoint = CGPoint(x: 0.95, y: 0.5)
gradientLayer.endPoint = CGPoint(x: 1.0, y: 0.5)
layer.mask = gradientLayer
}
}
- 텍스트에서는 black, clear 컬러를 제외한 다른 컬러에서는 그라데이션이 적용이 안되는 경우가 존재하므로, image를 만들어 color로 표현해 주어야 가능
- UIGraphicsBeginImageContextOptions 관련 개념 참고: ios-development.tistory.com/manage/posts/
func gradientLayer(bounds : CGRect) -> CAGradientLayer{
let gradient = CAGradientLayer()
gradient.frame = bounds
gradient.colors = [UIColor.orange.cgColor, UIColor.red.cgColor]
gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
return gradient
}
func gradientColor(gradientLayer :CAGradientLayer) -> UIColor? {
UIGraphicsBeginImageContextWithOptions(gradientLayer.bounds.size, false, 0.0)
gradientLayer.render(in: UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return UIColor(patternImage: image!)
}
let gradient = gradientLayer(bounds: myLabel.bounds)
myLabel.textColor = gradientColor(gradientLayer: gradient)
* 참고
- developer.apple.com/documentation/quartzcore/cagradientlayer
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] PageControl, UIScrollView, 안내화면 (2) | 2021.03.30 |
---|---|
[iOS - swift] UIGraphicsBeginImageContextWithOptions, 그래픽 UIImage 생성 (0) | 2021.03.29 |
[iOS - swift] UIBezierPath, CAShapeLayer으로 말풍선 구현 (0) | 2021.03.25 |
[iOS - swift] custom view (xib) 내부 내용에 따라 동적으로 크기 조절 (0) | 2021.03.25 |
[iOS - swift] 빈 화면 탭 시 키보드 내리는 방법 (화면 터치 시 키보드 숨김처리) (0) | 2021.03.22 |
Comments