UIkit- 11

김정현·2023년 6월 24일
0

UIKit

목록 보기
13/14
post-thumbnail

Custom Button

버튼을 클릭하면 회전하는 버튼을 만들겠다.

우선 버튼에 대한 함수를 일괄적으로 처리할 클래스를 하나 만들어야한다.
Rotate Button 이라하고, UIButton으로 만든다.

enum Rotatetype {
    case up
    case down
}

열거형으로 업일때, 다운일때를 구분해준다.

class RotateButton: UIButton {
    
    init() {
        super.init(frame: .zero)             //이니셜라이저 다시 공부
        configure()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    var isUP = Rotatetype.down {
        didSet{
            changeDesign()
        }
    }
    
    private func configure() {
        self.addTarget(self, action: #selector(selectButton), for: .touchUpInside)
    }
    
    @objc private func selectButton(){       //외부에서 접근할 필요가 없어서
        if isUP == .up {
            isUP = .down
        }else{
            isUP = .up
        }
    }

그리고 클래스 안에 우선 up일때 버튼을 클릭할 경우 down으로
down일 경우 up으로 변경해주는 것들을 설정해준다.
강의를 들으며 느낀점인데, 이니셜라이저에 대한 감이 잘 오지않는다. 이 부분에 대해서 다시 한번 되돌아 봐야겠다.

위에나온 changeDesign 함수는 아래처럼 정의해준다.

 private func changeDesign() {
        
        UIView.animate(withDuration: 1) {      //돌아가는 속도 지연
            if self.isUP == .up {
            self.imageView?.transform = CGAffineTransform(rotationAngle: CGFloat.pi)  //CGFloat 타입추론 생략가능
            self.backgroundColor = self.backgroundColor?.withAlphaComponent(0.3)
        }else{
            self.imageView?.transform = .identity         //원래의 설정으로 돌아감
            self.backgroundColor = self.backgroundColor?.withAlphaComponent(1)
        }
        }
    }

}

눌렀을때 생각을 변경하고 회전하게끔한다.

UIView.animate(withDuration: 1)

이 부분은 화살이 돌아가는 회전 속도를 정의할 수 있다.

그리고

최종적으로 메인 뷰 컨트롤러 호출 및 크기 및 디자인만 지정만 해주면 된다.

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
            let myButton = RotateButton()

            self.view.addSubview(myButton)


            myButton.translatesAutoresizingMaskIntoConstraints = false
            
            myButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
            myButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true

           // myButton.widthAnchor.constraint(equalToConstant: 2000).isActive = true
            myButton.heightAnchor.constraint(equalToConstant: 40).isActive = true

            myButton.backgroundColor = UIColor.orange
            myButton.setTitle("my custom Button", for: .normal)
            myButton.setImage(UIImage(systemName: "arrowtriangle.down"), for: .normal)
    }


}


여기서 중요한점은 main 스토리보드를 건드린다면 쉽게 fatal error가 발생해버린다는 점이다.

다음은 스토리보드를 이용한 제작 방법이다.

우선 메인 뷰 컨트롤러 쪽을 모두 주석처리한다.
command+/하면 드래그한 부분이 모두 주석처리 된다.

그리고 fatal error를 제거하기 위해

required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

required init?(coder: NSCoder) {
        super.init(coder: coder)
        cofigure()
    }

로 바꿔준다.

이미 함수를 모두 구현해둔 상태에서 해서 그런진 몰라도 스토리보드 작업이 훨씬 간단하고 눈에 인터페이스가 보이는 상태로 작업하다보니 원하는 결과물을 얻기 훨씬 쉬운 거 같다.

0개의 댓글