본문 바로가기

전체 글649

[Android] 카카오 로그인(v1) 버튼 변경하기 카카오 로그인 라이브러리 v1은 LoginButton 클래스를 이용해서 로그인하는 예제만 나와있다. (내가 못 본 것이라면 정말 정말 찾기 쉽지 않음) LoginButton UI가 이상하게 생겨서 UI는 직접 구현하고 로직을 처리하려고 문서를 찾아봤지만 v2 버전 말고는 없다. 보통 복잡한 로그인 플로우 처리를 설명하고, 그것들을 쓰기 편리하게 UI 클래스 하나로 선물하는데, 카카오 로그인 v1은 선물만 존재해서 확장성이 부족해 보인다. 어째든, 그래서 레이아웃을 새로 만들고 LoginButton 을 확장해서 UI를 변경했다. 일부러 이렇게 사용하란 것처럼 함수들이 외부로 노출되어 있어서 다행이다. class KakaoLoginButton @JvmOverloads constructor(context: C.. 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.
좋아하는 호랑이형님 픽셀레이팅 var face; var cells = []; var prevX = 0; var prevY = 0; function setup() { face = loadImage("barkhan.png"); createCanvas(640, 720); frameRate(20); colorMode(RGB, 255); } function draw() { var x; var y; const boxWidth = 10; const acptW = boxWidth + 2; const acptH = boxWidth + 2; if (cells.length < 100) { for (y = 0; y < face.height; y = y + acptW) { for (x = 0; x < face.width; x = x + acptH) { va.. 2019. 12. 16.
[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.
이모지 지원을 위한 DB Encoding 디비 인코딩 - utf-8mb4 2019. 9. 20.
2D 평면 물결 효과에 대한 이해 물결 효과에 대한 공부를 하면서 정리해본다. 세상에 얼마나 2D Water algorithm 이 존재하는지는 모른다. 구글에서 검색되는 Hugo Elias 의 사이트를 기준으로 이해했고 또 풀어보도록 해보겠다. 이 알고리즘은 2개의 배열이 필요한데, 하나는 현재의 물결 상태를, 다른 하나는 이전 물결 상태 정보를 저장하고 있다. 시간에 따라 변화하는 물결 상태 정보를 2개의 배열판으로 표현했다고 치면 되겠다. 위 그림에서 버퍼 1은 이전 프레임 버퍼 2과 그 이전 프레임 상태를 기억하는 버퍼 1(그림에는 보이지 않는)의 정보를 토대로 만들어진다. 마찬가지로, 가장 오른쪽에 있는 버퍼 2는 버퍼 1과 그 이전 버퍼 2의 상태를 조합하여 만들어진다. 이렇게 2개의 판을 사용해서 새로운 상태를 표시하기 위해 .. 2019. 9. 5.
[iOS] 현재 윈도우의 가장 상위 뷰컨트롤러 구하기 Get root ViewController from key window. var windowTopVc: UIViewController { if var root = UIApplication.shared.keyWindow?.rootViewController { while (root.presentedViewController != nil) { if root.presentedViewController != nil { root = root.presentedViewController! } } return root } return self } 2019. 8. 9.