본문 바로가기

프로그래밍221

[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.
[Android] 카카오 로그인(v1) 버튼 UI 변경하기 카카오 로그인 라이브러리 v1은 LoginButton 클래스를 이용해서 로그인하는 예제만 나와있다. (내가 못 본 것이라면 정말 정말 찾기 쉽지 않음) LoginButton UI가 이상하게 생겨서 UI는 직접 구현하고 로직을 처리하려고 문서를 찾아봤지만 v2 버전 말고는 없다. 보통 복잡한 로그인 플로우 처리를 설명하고, 그것들을 쓰기 편리하게 UI 클래스 하나로 선물하는데, 카카오 로그인 v1은 선물만 존재해서 확장성이 부족해 보인다.어째든, 그래서 레이아웃을 새로 만들고 LoginButton 을 확장해서 UI를 변경했다. 일부러 이렇게 사용하란 것처럼 함수들이 외부로 노출되어 있어서 다행이다.class KakaoLoginButton @JvmOverloads constructor(context: Con.. 2020. 6. 23.
안드로이드 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.
[swift] 미지원 API처리를 위한 @available 사용법 작성한 Swift 함수의 미지원(deprecated)나 없어졌음(obsoleted) 상태를 Xcode 에 힌트를 주기 위해, @available 을 사용하게 된다. 라이브러리를 개발 중이라면 꼭 알아야 함! deprecated + message : 미지원 함수 + 내용 표시 @available(*, deprecated, message: "더 이상 지원하지 않는 함수입니다.") func convertData() { } deprecated + renamed : 함수명이 바뀜 @available(*, deprecated, renamed: "convertWith") func convertData() { } obsoleted + renamed : 함수가 없어지고, 새로 생김 @available(swift, obs.. 2019. 12. 26.
[Android] ACTION_CREATE_DOCUMENT 로 파일 만들기 ref: FileCreateActivity.java package com.finc.strageframewok; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.view.View; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.Outpu.. 2019. 10. 11.