본문 바로가기

프로그래밍223

[SwiftUI] 뷰 페이저 만들기 (Paged scroll view) PagerView // 페이지 단위 뷰를 보여줌 struct PagerView: View { let pageCount: Int let content: Content @Binding var currentIndex: Int @State private var dragOffset: CGFloat = 0 @State private var pageOffset: CGFloat = 0 // 드래그 없이 처음 레이아웃의 오프셋을 계산하기 위한 조건 @State private var isFirstLayout = true init(pageCount: Int, currentIndex: Binding, @ViewBuilder content: () -> Content) { self.pageCount = pageCount self.. 2020. 9. 25.
[Android] 카카오 로그인(v1) 버튼 UI 변경하기 이글을 쓰고 두어달이 지난 후 바라던 대로 v2 로그인 라이브러리가 업데이트 되었다. 다행이다 라는 생각과 함께 글이 소용없게 되었다. ㅎㅎ ;; 그냥 v1, v2초기 버전이 이랬다 정도로 알고 넘어가요. --- 카카오 로그인 라이브러리 v1은 LoginButton 클래스를 이용해서 로그인하는 예제만 나와있다. (내가 못 본 것이라면 정말 정말 찾기 쉽지 않음) LoginButton UI가 이상하게 생겨서 UI는 직접 구현하고 로직을 처리하려고 문서를 찾아봤지만 v2 버전 말고는 없다. 보통 복잡한 로그인 플로우 처리를 설명하고, 그것들을 쓰기 편리하게 UI 클래스 하나로 선물하는데, 카카오 로그인 v1은 선물만 존재해서 확장성이 부족해 보인다. 어쨌든, 그래서 레이아웃을 새로 만들고 LoginButto.. 2020. 9. 9.
[Flutter] 다이어로그 내에서 State 적용하기 다이어로그에서 텍스트 입력을 바로 검증하여 버튼의 활성상태를 변경하고자 한다. 다이어로그의 Context가 다이어로그를 호출한 위젯의 Context와 다르기 때문에 별도로 State 가 관리되어야 한다. 이때 StatefulBuilder 로 content를 구성하면 커스텀 위젯 클래스를 새로 만들지 않고 간단히 구현할 수 있다. 요로케.. void _promptDeletion() async { bool confirmed = await _showConfirmDeletion(); print("_accountDeletion $confirmed"); } Future _showConfirmDeletion() async { bool confirm = await showDialog( context: context, .. 2020. 8. 13.
[SwiftUI] UIView 의 SwiftUI 랩핑 클래스 ref: Inline wrapping of UIKit or AppKit views within SwiftUI UIView를 스위프트UI로 활용하기 위해 UIViewRepresentable을 사용하는 데 템플릿 같은 구조를 매번 만들때마다 느낀 귀찮음이 있었다. 그 귀찮음을 덜어준 선델님의 랩핑 함수를 그대로 옮겨 저장한다. 알고보면 별거 아니지만, 왜 이걸 만들어볼 생각 안했을까.. // 와우!! 선델 짱. import UIKit import SwiftUI struct Wrap: UIViewRepresentable { typealias Updater = (Wrapped, Context) -> Void var makeView: () -> Wrapped var update: (Wrapped, Context).. 2020. 7. 27.
[Flutter] extension 사용하기 (확장 함수) Using extention methods in flutter 플러터에서 extension 함수를 사용하려면 다트 2.7 이상이 필요하다. pubspec.yaml 파일 # 확장 함수는 다트 2.7 부터 정식 포함 environment: sdk: ">=2.7.0 2020. 7. 18.
[SwiftUI] List 팁 List 간격 조정 Spacing between items of List in SwiftUI 리스트 아이템들의 간격을 조정하기 위해서 아이템뷰의 자체 생김새를 간격을 보이도록 작성하는 것도 방법이겠으나, 공식적인 함수 listRowInsets을 사용해서 간격을 조정하는 것이 뷰 관리에 좋다. listRowInsets은 ForEach안에서만 동작하는 점이 아쉽다. (Xcode 11.5, swiftUI 1.0) List { ForEach(feedItems, id: \.id) { item in FeedItemView(model: item) .listRowInsets(EdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20)) } }List 구분선 제거 Removi.. 2020. 7. 15.
[Swift] 숫자의 문자 변형 정수 자리수 고정시키기 String(format: "%03d", 10) // 010 String(format: "%05d", 10) // 00010 String(format: "%03d", 1234) // 1234 String(format: "%03d", 123456) // 123456소수점 자리수 고정시키기 String(format: "%.2f", 3.14159) // 3.14 String(format: "%.4f", 3.14159) // 3.1416 (반올림) String(format: "%.6f", 3.14159) // 3.14159016진수 문자로 변환 String(format: "%2X", 123456) // 1E240 String(format: "%2x", 123456) // 1e240 (소문자) 2020. 7. 9.
안드로이드 DB 컬럼 추가 (Upgrade) 방법 How to upgrade database version with adding new columns in android? 안드로이드 데이터베이스 (SQLite)를 이미 생성한 이후에 테이블에 컬럼을 추가하고자 할 때 참고. 아래와 같이 버전 1의 테이블 생성 내용이다. 여기에 컬럼하나를 끝에 추가하려고 한다. private static final String _ID = "idx"; private static final String KEY_ID = "_id"; private static final String KEY_TITLE = "title"; private static final String KEY_DESC = "desc"; private static final String KEY_BUDGET = "b.. 2020. 4. 2.
[Android] MutableLiveData를 LiveData로 간단히 은닉시켜보자 안드로이드의 LiveData를 뷰모델에서 사용하거나 앱 상태 관리할 때 사용하곤 한다.. 이때, 클래스의 완성도를 위해 외부에서 변경하지 못하도록 불변(immutable) 속성을 만들게 된다. 이런식. val notices: LiveData = MutableLiveData() 그리고 데이터를 변경해주려면, MutableLiveData로 타입을 변환시켜서 사용해야 한다. 그때마다 타입변환을 해야 하는 수고를 코틀린의 확장함수로 정의하면 편하더라구.. protected 또는 private로 클래스 안에 작성해야 클래스 외부에서 toMutable함수를 사용할 수 없다. protected fun LiveData.toMutable(): MutableLiveData? { return this as? MutableL.. 2020. 3. 19.
[SwiftUI] TabView와 UIViewController 같이 사용해보기 SwiftUI로 최근 앱을 만드는 동안 어려움은 있었지만, 빠르고 쉽게 UI를 만들고 테스트 할 수 있어서 좋았다. 여전히 잘 모르는 것들이 많이 있지만, Flutter와 함께 훌륭하다고 생각된다. 시간도 없고 아는 것도 없어서 어려웠는데, 특히 TabView의 한 Tab에 UIViewController를 붙이는 과정에서 이해해야 할 것들이 많았다. 앱의 기본 화면을 탭뷰로 구성했는데, 이런 식이다. ContentView struct ContentView: View { @State private var selection = 0 var body: some View { TabView(selection: $selection) { BusView().tabItem { VStack { Text("Tab1") }}... 2020. 2. 20.
[iOS, Swift] 웹뷰 전체화면 표시 Making WKWebView is fullscreen iOS의 웹뷰 (WKWebView)를 전체 화면으로 표시하려면, 웹뷰 클래스를 상속받아 safeAreaInsets를 변경해주어야 한다. 내용을 불러오기 전에 전체화면으로 적용하면 깔끔하지만, 내용이 로드된 이후에도 safeAreaInsets를 변경하고 레이아웃을 다시 그리도록 하면(setNeedsLayout) 언제든 변경할 수 있다. 예시로 요로케,, class CommonWebView: WKWebView { private var _isFull = false var isFullscreen: Bool { set { if _isFull != newValue { setNeedsLayout() } _isFull = newValue } get { return.. 2020. 1. 8.
[Android] 텍스트 밑줄 표시,제거(Paint Flag) 텍스트 뷰에 밑줄을 표시하려면, textView.setPaintFlags( task_text.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); 밑줄을 제거하려면, textView.setPaintFlags(Paint.ANTI_ALIAS_FLAG); 2020. 1. 6.