본문 바로가기

개발64

SwiftUI TextField 에서 placeholder color 변경하기 안녕하세요 오랜만에 글을 올립니다~ 그동안 나이만 먹고 살림살이는 나아지지 않아 슬프지만.. 오늘도 저처럼 힘겨운 날을 보내고 계실 개발자분들을 위해 조금이라도 힘내시라고 작은 지식 하나 공유해 봅니다 이번 포스팅은 SwiftUI TextField 에서 겪은 삽질? 에서 비롯되었는데요.. 문자를 입력하기 전 디폴트로 뜨는 희미한 도움말인 placeholder 의 글자색이 변경이 안되는 겁니다!! UIKit에선 오래전부터 알려진 방식으로 손쉽게 할수 있었는데, SwitfUI 이넘은 아직 생긴지 얼마 안되서 그런지 구글신의 힘도 미약하고, 잘 안되서... SwiftUI의 특성을 최대한 이용해 아래와 같이 만들어 봤습니다. textfield costom 뷰... import SwiftUI struct Plac.. 2022. 7. 29.
View를 서서히 나오고 사라지게 하는 간단 방법 Activity를 전환할때 서서히 나오고 사라지는 등의 애니메이션을 넣을 수 있다 당연히 Activity가 아닌 일반 View 도 가능하다 하지만 View 에서는 한가지 주의할 점이 있다. Activity는 전환 애니메이션을 마치면 자동으로 생성되거나 없어지지만 View는 그렇지 않다는 것이다. 즉, 애니메이션이 시작 또는 끝날때 View를 부모뷰에서 빼고 넣거나 보이게 또는 보이지 않게 처리 해주어야 한다. 애니메이션을 불러와 시작하는 코드 //나오기 fun startAnimationWithShow(context: Context, view: View, id: Int) { view.visibility = View.VISIBLE //애니메이션 전에 뷰를 보이게 한다 view.startAnimation(An.. 2022. 3. 13.
seekbar로 만든 진행바에 터치가 안되게 하기 진행바를 seekbar로 만드는 경우, 터치 했을때 바가 움직여 버린다. 다음과 같이 간단히 막아버리자 class TouchlessSeekBar: SeekBar { private var seek: Int constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet) : super(context, attrs) constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) init { seek = 0 thumb = ColorDrawable(Color.TRANSPARENT) //터치아.. 2020. 3. 24.
날짜 텍스트에 일수를 더해보자 우리는 종종 string형 날짜에 int형 일수를 더하는 작업을 하게 된다. 이때, 다음과 같이 간단한 함수를 하나 만들어 사용하자 코틀린으로 작성했다. fun afterDate(date: String, day: Int, pattern: String = "yyyy-MM-dd"): String { val format = SimpleDateFormat(pattern, Locale.getDefault()) val calendar = Calendar.getInstance() format.parse(date)?.let { calendar.time = it } calendar.add(Calendar.DAY_OF_YEAR, day) return format.format(calendar.time) } date에 날짜 .. 2020. 1. 31.
Int 난수 함수로 Float 난수 깔끔하게 발생시키기 php 에는 float 난수를 발생시키는 함수가 따로 없다. 그래서 int 난수 함수인 rand() 함수를 이용해 float로 변환해야 한다. 다음은 float 변수형의 최소, 최댓값을 인수로 받아 float 난수를 반환하는 함수이다. 자주 사용할것 같아 만들어 보았다. function randOnFloat($min, $max) { //최소,최대값중에 소수점 자리수가 더 큰쪽을 선택 $radix_min = radix($min); $radix_max = radix($max); $radix = $radix_min[front] > $radix_max[front] ? $radix_min : $radix_max; //입력된 float값을 int값으로 변환후 int난수를 발생시키고 다시 float로 변환한다 ret.. 2019. 12. 26.
삼각 분포로 난수 발생시키기 가우시안 분포 즉, 정규분포로 난수를 발생시켜야 하는 경우가 종종 있다. 하지만 우리가 흔히 사용하는 rand() 함수는 균일 분포로 난수를 가져오므로 따로 구현해야 한다. 다행히 정규분포 난수 발생 소스는 인터넷상에서 쉽게 구할수 있기 때문에 별 문제 될 건 없다. 한 가지 딴지를 걸자면 정규분포는 피 적분이 안되기 때문에 반복문을 사용해 난수를 만들어야 한다. 만약, 아주 많은 난수를 한꺼번에 발생시킨다면, 부하가 걸릴 수 있다는 말이다. 물론, 아주 쓸데없는 걱정이다. 그정도로 21세기의 컴퓨터는 나약하지 않다ㅎㅎ 어쨌거나 반복문이 없는 확률 밀도 기반 난수를 쓰고 싶다는 어리석은 생각에 다음과 같은 삼각 분포 난수 함수를 만들어 보았다. 삼각형 그래프는 정적분이 쉬워서 면적을 비율 삼아 난수를 발.. 2019. 10. 28.
삼각행렬로 연립방정식 단번에 구하기 학창 시절.. 행렬이 수학책의 첫 단원이라 본의 아니게 공부했던 기억이 있다. 아마 나만 그랬던 건 아닐 것이다ㅎㅎ 어잿든 십수 년 코딩을 해오면서도 이제야 왜 행렬이 첫 번째인지 그 깊은 뜻이 헤아려진다. 머리가 나빠서 이론은 건너뛰고 실전코딩부터 했던터라 지금까지 해 오던 것이 선형대수학의 내용인지조차 몰랐었다. 왜 필요한지도 모른채 행렬부터 공부하다 보니 연결이 어려웠던 걸까.. 주입식 교육의 폐해다ㅎㅎ 뒤늦게 다시 선형대수학을 공부하며 하나하나 정리해 가고 있는데.. 삼각행렬로 연립방정식을 구하는 손쉬운 방법을 소스로 만들어 보았다. php로 짰지만 다른 언어로도 쉽게 변경 가능하다. //삼각행렬 function triangularMatrix(&$matrix) { $j_count = count($.. 2019. 8. 19.
drawText의 문자가 밑으로 삐져나오지 않게 하기 커스텀 뷰를 만들어 쓸때 drawText로 문자를 출력한다. 그런데 문자 위치가 살짝 밑으로 치우쳐 있는 느낌을 받곤 한다. 처음엔 기분탓이라고 생각했지만... 계속된 찝찝함에 확인해 보니... 아주 미세하게 아래로 내려와 있다는 사실을 깨달았다. 한 예이다. override fun onDraw(canvas: Canvas) { super.onDraw(canvas) val rect = RectF(100f, 100f, 300f, 300f) val rectPaint = TextPaint().apply { flags = Paint.ANTI_ALIAS_FLAG color = Color.LTGRAY } val text = "Test" val textPaint = TextPaint().apply { flags = P.. 2019. 6. 24.
FragmentPaper에서 ListView가 매번 초기화되지 않도록 하기 대부분의 앱은 탭과 리스트로 구성된다. 많은 정보를 간편하면서도 체계적으로 보여줄수 있기 때문이다. Android에서 이러한 구조는 보통 FragmentPaper에 ListView를 넣어 구현한다. FragmentPaper는 메모리 관리를 위해 사용자가 보고 있는 페이지과 양옆의 페이지만 유지하고 나머지는 죽이는데 내 경험상 완전히 죽이는것이 아니라 Fragment의 생명주기만 끝내는것 같다. 결과적으로, 페이지를 옮길때마다 Fragment가 초기화되어 그 안의 ListView 내용도 다 지워진다. 이를 방지하는 방법이 따로 있을지도 모르겠지만 나는 다음과 같이 onCreateView()에 몇줄을 코딩해 해결하곤 한다. Fragment의 생명주기는 다시 시작되지만 Class 자체의 객체변수들은 그대로 남.. 2019. 5. 23.
객체 속도가 빠를수록 충돌검사가 부정확해진다면 충돌검사는 기본적으로 두 객체의 좌표가 겹쳐있느냐를 보는것이다. 하지만 간혹 검사가 제대로 안될때가 있다. 객체의 좌표 이동거리가 자신의 크기보다 더 클때 그렇다. 다음과 같이 말이다. 게임은 프레임별로 동작하기 때문에 그림1에서는 Frame2와 Frame3에서 두 객체는 겹치지만 그림2에서는 Frame2와 Frame3에서 서로를 지나쳐 간다. 만약 프레임이 중간에 하나가 더 있었다면 충돌값은 참이었겠지만 거짓이 되었다. 이렇듯 이동거리가 자신보다 크면 프레임 사이에 공간이 생겨 원하는 결과를 얻지 못한다. 원인은 프레임이 현실세계에서처럼 한없이 짧을수는 없어 빠르게 움직이는 객체는 좌표의 이동값을 크게 잡아서 표현해야 하기 때문이다. 그래서 겹침과 함께 이동경로의 교점도 확인해야 한다. 교점은 두 객체.. 2019. 4. 2.