[iOS] UIImageView && Custom View
by Roel DowneyApple 문서: UIImageView
UIImageView에 이미지를 추가하기
- 첫 번째 방법 :
- 1. 프로젝트에 .png파일이나 .jpg파일 추가
- 2. Main.storyboard 를 클릭
- 3. UIImageView를 선택
- 4. attributes inspector 선택 후 Image: 에서 넣고 싶은 이미지 파일 선택
- 두 번째 방법
- 코드 설정하는 방법
-
- 프로젝트에 .png파일이나 .jpg파일 추가 ( IBOutlet 연결 해줘야 한다.)
@IBOutlet weak var banana: UIImageView?
override func viewDidLoad() {
super.viewDidLoad()
banana?.image = UIImage(named: "Banana.jpg")
}
Custom View 만들기
나의 문제 :
여러개의 ImageView를 수정하고 싶다. ViewController에 ImageView 수정하는 코드를 작성하였다.
이렇게 특정 뷰의 속성을 모두 바꾸는 코드를 꼭 ViewController가 갖고 있어야 할까요? ViewController가 비효율적으로 길어지네요!
서브뷰를 만들어서 상속을 해서 더 구체적인 동작을 하는 뷰 객체를 만드는 방법이 좋겠다.
- UIImageView를 상속받는 Cocoa Touch Class 만든다.
- 내가 원하는 속성을 지정 해준다.
- 추가할 서브뷰들의 타입을 Custom View 타입으로 지정 해준다.
예) Custom View를 상속 받은 모든 UIImageView에 둥근 모서리(cornerRadius)속성을 부여하고 싶다! 한번 해보자!
code로 추가한 view에 속성을 적용하기 위해서는 init(frame:)에 속성을 지정 해줘야한다. 다만, init(frame:)에는 무조건 frame값을 넣어 줘야하기 때문에, 아래 예시코드와 같은 방법으로 convenience init에 임시 frame값을 넣어줘도 된다.
이 방법을 사용하면 원하는 frame값은 상위모듈에서 바꿔 줘야한다.
override init(frame: CGRect) { // by code
super.init(frame: frame)
self.layer.cornerRadius = 5.0
self.clipsToBounds = true
}
convenience init() {
self.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
}
인터페이스 빌더에서 서브뷰를 추가했을 때
인터페이스 빌더에서 custom Class로 지정한 View는 required init?(coder aDecoder:)가 호출된다. (storyboard에서 ViewController가 가진 View의 타입을 오른쪽 탭 custom class에서 내가 추가한 custom View class 이름 입력하여 연결)
만약에 어디서 호출될지 모르면 awakeFromNib과 두 convenience init에 설정하는 코드를 넣어주면 된다. 는 꼼수아닌 꼼수도 있다.
override func awakeFromNib() {
// config setting code
super.awakeFromNib()
}
required init?(coder aDecoder: NSCoder) {
// config setting code
fatalError("init(coder:) has not been implemented")
}
UIView의 생성자
서브뷰를 추가하는 방법에 따라 (뷰를 생성되는 방법에 따라) 호출되는 UIView의 초기화 함수가 결정되기 때문에, Custom View의 어디에 속성설정 코드를 넣어야 하는지가 중요하다
UIView는 두개의 필수 생성자가 있다. init(coder: NSCoder), init(frame: CGRect) 이다.
-
init(coder: NSCoder) 는 storyboard에서 UIView를 만들 때 호출되는 생성자 이다. View를 storyboard에서 드래그해서 만들었는데,앱이 실행될때 storyboard가 재구성되면 이 생성자가 호출되면서 UIView가 만들어진다.
-
init(frame: CGRect) 는 코드로 UIView를 만들 때 호출되는 생성자 이다. 반드시 CGRect타입으로 프레임을 정해주고, UIView를 생성한다.
let rect = CGRect(x: 10, y: 10, width: 100, height: 100)
let myView = UIView(frame: rect)
'iOS' 카테고리의 다른 글
[iOS] CocoaPods 설치하고 Xcode 나의 프로젝트에 적용하기 (0) | 2019.08.28 |
---|---|
[iOS] SwiftLint Xcode 나의 프로젝트에 적용하기 (0) | 2019.08.28 |
[iOS] UIApplicationMain 과 UIApplication 학습 (0) | 2019.08.28 |
[iOS] MVC (0) | 2019.08.28 |
[iOS] IBAction과 IBOutlet 정리 (0) | 2019.08.28 |
블로그의 정보
What doing?
Roel Downey