iOS 개발

    [SwiftUI] Swift UI에 대한 첫인상

    [SwiftUI] Swift UI에 대한 첫인상

    처음에 swiftUI를 접했을 때는 기존 UIKit에서 사용했던 viewcontroller가 없어서 처음에 정말 당황습니다. 아직 매우 기초적이지만ㅋㅋ 공부를 하면서 느낀 swift UI의 가장 큰 특징! 은 저장된 변수가 거의 없다는 것입니다. 그때 그때 원하는 매개변수를 struct에 넘겨 주어서 view를 구성한다는 것이 storyBoard와 가장 큰 차이인 것 같습니다. 즉, 기존에는 컨트롤러가 중앙에서 함수들을 관리하면서 변수들을 저장하고, 넘겨주고 이런 역할을 해주는데, swiftUI에서는 struct 하나가 view 하나의 레이아웃 구성과 함수들을 관리하기 때문에, view들이 독립적이라는 생각이 들었습니다. 이렇게 되면 데이터를 구조화하는게 매우 중요하고, sturct 구성을 깔끔하게 하는..

    [Watch OS] CFBundleVersion이 Info.plist에서 매칭하지 않는 오류 해결법

    [Watch OS] CFBundleVersion이 Info.plist에서 매칭하지 않는 오류 해결법

    The value of CFBundleVersion in your WatchKit app's Info.plist (1) does not match the value in your companion app's Info.plist (6). These values are required to match. 처음 생성하고 Watch App을 빌드하는데, 다음과 같은 오류가 발생했다. simulator에서는 잘 돌아가는데, 내 apple watch로 빌드를 하려고 하면 나타나는 문제여서 난감했다. 오류 문구를 읽어보니 WatchKit app info.plist의 CFBundleVersion이 짝이되는 iOS app의 info.plist와 일치하지 않기 때문이라고 한다. StackOverFlow에 검색해보니 여러가지..

    [Watch OS] 기존 iOS 프로젝트에 Watch App 추가 방법

    [Watch OS] 기존 iOS 프로젝트에 Watch App 추가 방법

    [참고] 애플개발자문서 - setting up a watchos project 기존에 iOS 단일 OS로 제작하던 앱에서, watch OS를 추가해야 해서 방법을 찾아보니 매우 간단했다. 간단하게 순서대로 설명해보겠다. 1. 프로젝트 메뉴에서 New -> Target 을 클릭한다. 2. Watch App for iOS App 을 선택한다. -> Next 3. watch 앱에 대한 설정을 진행한다. (나는 기존의 앱 이름 뒤에 Watch를 추가해주었다.) 4. 그러면 이렇게 scheme을 활성화 할거냐고 묻는데, 공식문서에서는 Activate 하라고 나와있다. 또한 우리가 Watch app을 추가하게 되면, notification schene이 default 값으로 포함되어 있는데 당장 사용하지 않더라도 ..

    [UITableVIew] automaticDimension 이 되지 않을때

    [UITableVIew] automaticDimension 이 되지 않을때

    cell custom 해서 사용하다 보면, content의 크기에 따라, cell 크기가 유동적으로 조정되어야 할 때가 있다. 이때 사용하는 것이 rowHeight를 UITableView.automaticDimension로 설정해주는 것이다. 하지만, 최근에 코드를 짜던 중, 저게 들어먹지를 않아서 고생했었다. 처음에는 rowHeight 를 정하는 시점이, 안에 content 들이 들어온 후가 되어야 된다고 착각해서, 함수 선언 위치도 바꿔보고, 이것저것 만져봤는데도 도저히 적용되지 않았다. 그러다가, 해결방법을 찾게 되었다. 바로 autoLayout을 설정해주어야 한다는 것이다!! 정말 간단한 문제인데 생각을 못했었다.. (사실 10분 만에 해결하긴 했다) 암튼! 요로코롬 오토레이아웃을 걸어주면, 내부..

    [UIView] view를 fade in, fade out 시키는 방법

    [UIView] view를 fade in, fade out 시키는 방법

    UIView의 alpha 값을 with duration 을 걸어둔 상태에서 alpha 값을 올리고 내리고 하는 animation을 걸어서 만들어졌다. UIView class에 extension 하는 식으로 선언해서, 계속 사용 가능하다. public extension UIView { func fadeIn(duration: TimeInterval = 1.0) { UIView.animate(withDuration: duration, animations: { self.alpha = 1.0 }) } func fadeOut(duration: TimeInterval = 1.0) { UIView.animate(withDuration: duration, animations: { self.alpha = 0.0 }) } }

    [Animation] animation play 중간에 값 변경하는 몇가지 방법

    [Animation] animation play 중간에 값 변경하는 몇가지 방법

    아무것도 모를때는 아래 방법을 썼지만, 조금 더 공부를 해보니 이 방법들을 쓰면 절대 안된다ㅋㅋㅋ 여유가 될 때, CoreAnimation과 UIProperty animation에 대해서 정리해보겠다. 애니메이션은 미리 완성된 형태를 재생하는 방식이다. 이에 대해서 사용자와의 상호작용이 이루어지긴 하지만, 한 애니메이션에서 여러가지 변수에 따라서 많은 것을 바꾸려면 수 많은 레이어가 필요하게 되고, 이는 결국 cpu와 메모리에 큰 부담으로 이어진다. 최근 내가 만들고 있는 애니메이션은, 물결 위에 도형이 둥둥 떠있는데, 공이 떠있는 애니메이션이 재생되면서, 동시에 사용자가 특정 행동을 했을때 도형의 색깔이나 모양이 바뀌는 애니메이션이다. 이를 위해서는 일단 공이 튀기는 애니메이션이 재생되어야 하고 사용자..

    [Swift] viewcontroller에서 앱이 background에서 foreground 변환 감지

    [Swift] viewcontroller에서 앱이 background에서 foreground 변환 감지

    private var observer: NSObjectProtocol? override func viewDidLoad() { observer = NotificationCenter.default.addObserver(forName: UIApplication.willEnterForegroundNotification, object: nil, queue: .main) { [unowned self] notification in // 감지되었을 때 수행하고 싶은 동작 } }

    [NavgiationController] 네비게이션바 투명하게 만들기

    [NavgiationController] 네비게이션바 투명하게 만들기

    네비게이션바는 StroyBoard를 통해서는 반투명하게(translucent) 만 가능하다. 하지만 이렇게 되면, 네비게이션바를 사용하는 앱들은 애니메이션이나 색변화 등을 화면 전체에 가득차게 만들 수가 없다. 이를 해결하기 위해서는 해당 View의 뷰컨트롤러에서 navigationBar을 다루어주면 된다. override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) navigationController?.navigationBar.shadowImage = UIImage() navi..

    [Core Data] Context를 이용해 Entity에 Attributes들을 추가, 삭제

    [Core Data] Context를 이용해 Entity에 Attributes들을 추가, 삭제

    4. CoreData Context를 이용해 Entity에 Attributes들을 추가하고, 삭제하기 지금까지 우리는 Entity와 Attribute를 만들고, 이를 Load 해서 tableViewCell 에서 보여지도록 해보았다. 그리고 Test를 위해 SQLite Editor을 통해 직접 DB를 수정해보았다. 먼저 이전 장에서 우리가 수동으로 추가했던 DB들은 다 지워주자. name부분만 추가한 거라서, 우리가 새롭게 값을 추가할 때 오류를 유발한다. 즉, 우리는 LoadCategories 함수를 이용해서 CRUD 에서 R(Read ) 를 완료했다. 그렇다면, 나머지 Create, Update, Destroy는 어떻게 할까? 천천히 알아보자. 먼저, Create를 해보자! StoryBoard에서 Ta..