본문 바로가기
아이폰 개발/Swift

swift layoutIfNeeded 예제 2

by 인생여희 2021. 7. 22.

 

첫번째 원그리기.

 

원을 그릴 커스텀 뷰를 아래 코드처럼 생성한다.  여기서 원으로 만들어줄

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()
    
    
}

 

 

eee.zip
0.04MB