첫번째 원그리기.
원을 그릴 커스텀 뷰를 아래 코드처럼 생성한다. 여기서 원으로 만들어줄
self.layer.cornerRadius = self.frame.width / 2 코드를 init 메소드에 넣어도 안되고, draw 에 넣어도 반영이 안된다.
layoutSubviews 가 호출되는 시점에 코드를 넣어주면 된다.
참고로
init - > layoutSubviews -> draw
RedView 객체를 코드로 생성하면 위의 순서로 호출되는데 draw 호출될때 layoutSubviews 에서 그렸던 뷰 사라짐.
import UIKit
class RedView: UIView {
/// 코드로 작성
override init(frame: CGRect) {
super.init(frame: frame)
print("init - ")
backgroundColor = .red
translatesAutoresizingMaskIntoConstraints = false
//2.둥글게 변경 - > 안됨..
//self.layer.cornerRadius = self.frame.width / 2
}
required init?(coder: NSCoder) {
fatalError("ddd")
}
/// 프레임과 뷰를 다시 계산해야 될때만사용
/// 재정의 할때 명시적으로 호출 금지
override func layoutSubviews() {
super.layoutSubviews()
print("layoutSubviews - ")
//MARK: 레이아웃 변경됨
//3.둥글게 변경 - > 됨..
self.layer.cornerRadius = self.frame.width / 2
//
// self.layer.shadowRadius = 9
// layer.shadowOpacity = 0.3
// layer.shadowOffset = CGSize(width: 5, height: 8)
// self.clipsToBounds = false
}
/*
init -
layoutSubviews -
draw -
순서로 호출되는데 draw 호출하면 layoutSubviews 에서 그렸던 뷰 사라짐.
*/
//MARK:
//사용자 정의 그리기를 수행하는 경우에만 draw()를 재정의합니다.
// 빈 구현은 애니메이션 중 성능에 부정적인 영향을 미칩니다.
// override func draw(_ rect: CGRect) {
// print("draw - ")
// }
}
RedView를 만드는 ViewController 에서는 viewDidLayoutSubviews 에 넣어줘야지 원을 그리는 코드가 작동된다.
//
// ViewController.swift
// eee
//
// Created by k2 on 2021/07/22.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var height: NSLayoutConstraint!
let redView = RedView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(redView)
redView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
redView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
redView.heightAnchor.constraint(equalToConstant: 100).isActive = true
redView.widthAnchor.constraint(equalToConstant: 100).isActive = true
//1.둥글게 변경 - > 안됨..
//self.redView.layer.cornerRadius = redView.frame.width / 2
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
//MARK: 레이아웃 변경됨
//4.둥글게 변경 - > 됨..
//self.redView.layer.cornerRadius = self.redView.frame.width / 2
}
@IBAction func buttonTap(_ sender: Any) {
//view.layoutIfNeeded()
UIView.animate(withDuration: 2) {
self.height.constant = 250 //애니메이션 적용 안됨
self.view.layoutIfNeeded() //이메소드 호출 하면 적용됨
//self.redView.center = CGPoint(x: 0, y: 0) //애니메이션 적용됨
}
}
//바인딩된 자식뷰 모두에대해서 업데이트
///view.layoutIfNeeded()
}
'아이폰 개발 > Swift' 카테고리의 다른 글
swift autolayout - 그래프를 통한 오토레이아웃의 동적 컨트롤 (0) | 2021.07.24 |
---|---|
swift stackView 튜토리얼 (0) | 2021.07.22 |
swift layoutIfNeeded 예제 1 (0) | 2021.07.22 |
swift - Xcode 설정 (0) | 2021.06.26 |
swift - custom collectionview cell 주의 (0) | 2021.06.26 |