본문 바로가기

swift

(16)
[viewDidLayoutSubviews] 뷰 크기가 결정된 후에 레이아웃 조정이 필요할 때 override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() customView.frame = someCalculatedFrame}viewDidLayoutSubviews는 뷰의 하위 뷰들이 모두 배치된 직후에 호출된다.UIViewController의 생명 주기 중에 하나이다.뷰와 모든 서브뷰의 크기나 위치가 계산되어 배치된 직후 호출된다.viewDidLoad()나 viewWillAppear보다 늦고 viewDidAppear보다 빠르다.
스택 뷰로 다이나믹하게 뷰 height 늘렸다 줄이는 법 self.moreAnswerStackView.chain.addView(to: self.moreWrapView) .top(equalTo: self.moreQuestionLabel.bottomAnchor, constant: 11) .left(equalTo: self.moreWrapView.leadingAnchor, constant: leftMargin) .right(equalTo: self.moreWrapView, constant: rightMargin) .bottom(equalTo: self.moreWrapView.bottomAnchor, constant: -15)// .height(constant: opti..
Codable 활용하여 함수 만들기 static func readFile(fileUrl:URL, decodeData: T.Type) -> T? { do { let data = try Data(contentsOf: fileUrl) let decoder = JSONDecoder() let result = try decoder.decode(T.self, from: data) return result } catch { print("JSON : \(error.localizedDescription)") return nil } }let bundleJson = MyFileM..
[tapGesture.cancelsTouchesInView = false] <- 이게 뭔데 private func textfieldSetting() { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) tapGesture.cancelsTouchesInView = false // 텍스트필드 터치도 살아있게 view.addGestureRecognizer(tapGesture)} @objc func dismissKeyboard() { view.endEditing(true)} 위의 코드는 텍스트 필드의 키보드를 내릴 때 사용할 때 사용된다.바깥 뷰를 클릭하여 키보드를 내릴 때 사용한다. 그런데 이 코드에서 아래 부분이 이해가 안된다.tapGesture.cancelsTouche..
[Swift] Codable 이해하기 enum Block: Codable { case text(TextBlock) case image(ImageBlock) case video(VideoBlock) enum CodingKeys: String, CodingKey { case type } enum BlockType: String, Codable { case text case image case video } init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) let type = try container...
UIView의 draw(_:)는 그림을 그리는 함수이다. override func draw(_ rect: CGRect) { // 여기에 직접 선, 도형, 텍스트 등 그릴 수 있음} UIView의 draw(_:) 뷰가 화면에 표시될 때 직접 그림을 그리고 싶을 때 사용하는 함수호출 시점처음 화면에 뷰가 그려질 때setNeedsDisplay()를 호출했을 때용도동그라미, 그래프, 손글씨, 막대기등 직접 그리고 싶을 때애니메이션 : 그림이 변해야하는 경우마다 다시 setNeedsDisplay() 호출하여 애니메이션 느낌 내기종이에 낙서하는 느낌, 비트맵 기반 그림등의 복잡한 효과주의draw(_:) 안에서는 절대 addSubview 같은걸 하면 안됨그림을 그리는 함수임! 뷰트리 다루는 함수가 아님오직 CGContext를 통한 드로잉만 사용
[Swift] Combine 1. Combine 공식문서Customize handling of asynchronous events by combining event-processing operators.이벤트 처리 연산자를 결합하여 비동기 이벤트를 사용자 지정 방식으로 처리하세요.iOS 13.0+iOS 13.0 이상iPadOS 13.0+iPadOS 13.0 이상Overview개요The Combine framework provides a declarative Swift API for processing values over time.Combine 프레임워크는 시간에 따라 변하는 값을 처리하기 위한 선언형 Swift API를 제공합니다.These values can represent many kinds of asynchronous ev..
[Swift] map, flatMap, compactMap, reduce 1.map1. normalfunc map(_ transform: (Self.Element) -> T) -> [T]Self.Element를 T로 변환하여 새로운 배열을 반환하는 역할을 한다.즉, 배열의 원소를 원하는 타입으로 변환하여 새로운 배열을 만드는 것let numbers = [1, 2, 3, 4]let strings = numbers.map { "\($0)" }print(strings) // ["1", "2", "3", "4"] 2. error handlingfunc map(_ transform: (Self.Element) throws(E) -> T) throws(E) -> [T] where E : Error일반적인 map과 달리 Error를 던질 수 있다.transform 클로져에서 Error를 ..
[iOS] super.init(nibName: nil, bundle: nil) 이해하기 class VC: UIViewcontroller { var frog = "" var dog = "" required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(frog:String, dog:String) { this.frog = frog this.dog = dog /* nibName이 nil 이더라도 xib 파일이 존재할 경우, xib 파일을 자동으로 로드한다. */ super.init(nibName: nil, bundle: nil) } nibName이 nil일 때 해당 뷰컨트롤러와 같..
[iOS] NSCoder 생성 방법 init?(viewModel: MovieListViewModel, coder: NSCoder) { self.viewModel = viewModel super.init(coder: coder) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }window?.rootViewController = storyboard.instantiateViewController(identifier: "MovieListViewController", creator: { creater in let viewModel = MovieListViewModel(defa..