본문 바로가기

개발/ios15

SwiftUI TextField 에서 placeholder color 변경하기 안녕하세요 오랜만에 글을 올립니다~ 그동안 나이만 먹고 살림살이는 나아지지 않아 슬프지만.. 오늘도 저처럼 힘겨운 날을 보내고 계실 개발자분들을 위해 조금이라도 힘내시라고 작은 지식 하나 공유해 봅니다 이번 포스팅은 SwiftUI TextField 에서 겪은 삽질? 에서 비롯되었는데요.. 문자를 입력하기 전 디폴트로 뜨는 희미한 도움말인 placeholder 의 글자색이 변경이 안되는 겁니다!! UIKit에선 오래전부터 알려진 방식으로 손쉽게 할수 있었는데, SwitfUI 이넘은 아직 생긴지 얼마 안되서 그런지 구글신의 힘도 미약하고, 잘 안되서... SwiftUI의 특성을 최대한 이용해 아래와 같이 만들어 봤습니다. textfield costom 뷰... import SwiftUI struct Plac.. 2022. 7. 29.
스레드에서 반복문으로 UI를 변경할때 주의할점 내가 만든 스레드에서 UI를 바꿀수 없다는것은 누구나 알것이다. 물론 젖먹이 개발자 시절에 난 몰랐다... 어잿든 내 스레드에서 UI를 바꿀려면 메인스레드를 호출해야 한다. ios 에서는 DispatchQueue.main.async 이 그 역활을 한다. 짐작했겠지만 메인스레드는 새로 만들어지는게 아니므로 당연히 동기적으로 움직인다. 최근까지도 이 사실을 자주 망각했다. 바로 반복문에서 메인스레드를 호출할때였다. 내 스레드에서 메인스레드를 반복문으로 돌릴때는 서로가 따로 놀기 때문에 (내 스레드와 메인스레드가 서로 비동기라서) 메인스레드에서 UI가 아직 변경되지도 않았는데 내 스레드에서 또 호출해 버린다. 이렇게 되면 버벅거리는 현상이 발생한다. 테스트할때서야 버벅거림을 발견하고 짜증내다 아... 하고 숙.. 2018. 7. 30.
UIEdgeInsets 없이 UILabel에 여백 넣기 UILabel에 여백을 넣는 방법은 다양하다. 그 중 NSLayoutConstraint를 이용하는 법을 다뤄보자! class FitLabel: UILabel { //상하좌우 여백 storyboard 입력값 @IBInspectable var edge: CGSize = CGSize(width: 0, height: 0) //너비, 높이가 적용될 Constraint private var mWidthConstraint, mHeightConstraint: NSLayoutConstraint? //좌우 여백값 var edgeAllWidth: CGFloat { return edge.width * 2 } //상하 여백값 var edgeAllHeight: CGFloat { return edge.height * 2 } ove.. 2018. 5. 8.
손쉽게 아이폰 앱을 새로 실행 시키는 코드 한줄 안드로이드에서는 메인 activity를 종료하고 다시 호출하면 바로 재시작이 된다. 하지만 아이폰에서는 그렇게 할수가 없었다. 혹시나 하는 마음에 재시작 시키는 함수를 찾아봤지만 이 또한 없었다. 나의 구글링 실력이 부족해서 못찾은거일수도 있지만... 좌절하고 있는 순간... 정말 우연하게 방법을 알아냈다. 사실 실수로 코드를 잘못 넣었는데... 재시작이 되는것이다... 아! 실수로 찍은 로또나 될것이지.. 어쨋든 기분은 좋다. 불로소득같은 느낌이다. 방법은 진짜 간단하다. AppDelegate 의 applicationWillEnterForeground 에서 exit(0)를 호출해주면 된다. 아마도 잠에서 깨어나기 직전에 종료를 해주면 깨어나는 작업이 중단되지 않고 계속 진행되면서 재시작되는 효과가 나오.. 2018. 3. 26.
UIView의 원 테두리가 얇거나 작아보일때... 가끔 우리는 아주 사소한 차이로 고민할 때가 있다. 이거 왜이러니? 기분탓인가? 한번 살펴볼까? 귀찮다 이정도쯤이야 뭐.. 하고 지나친적이 있지 않은가ㅎ 나는 많다ㅎㅎ 최근에도 그랬다. UIView에서 StrokeEllipse 를 이용해 rect 크기 만큼 원 테두리를 그릴수 있다. 하지만 그려 놓고 나니 왠지 생각보다 작아보였고, 안에 색깔있는 원을 넣으니 테두리 굵기마저 얇아 보였다.. 뭐지??? 처음엔 그냥 지나쳤다가 똥싸고 손안씻은것처럼 찝찝해서 한번 살펴보았다. 바보같았다... 왜 몰랐을까? 테두리 굵기는 양쪽으로 넓어진다는 사실을... 그래서 한쪽 굵기만큼 반이 얇아지고 작게 보이는 것이었다. 아래와 같이 하면 금방 해결된다.. 혹시나 귀찮아서 그냥 지나칠 분들을 위해 글을 남긴다. @IBIn.. 2018. 1. 29.
NSString을 마치 UILabel인 양 사용하기 UILabel을 추가하면 간단하게 글자를 넣을 수 있다. 하지만 sub view가 많아지면 어플이 무거워 질 수 있는데 이럴때에는 NSString을 써주면 좋다. 그렇다면 NSString를 UILabel처럼 배경색을 넣어서 마치 view인듯 사용해 보자~ 먼저, NSString이 들어있는 클래스를 하나 만들자! NSString를 상속받아 확장해도 좋다. 나는 그냥 했다. TextBox라고 명명하겠다. class TextBox { //정렬키 상수 static let CENTER = 0 static let LEFT = 8 static let RIGHT = 16 static let TOP = 1 static let BOTTOM = 2 var mText: NSString var mAlign: Int var mF.. 2017. 11. 20.
UIButton 이미지를 손쉽게 정렬하자~ 아이폰 Swift에서 UIButton 안의 이미지를 원하는 위치에 두려면 Edge Inset을 이용하여 좌우상하에 여백을 줘야 한다 여간 귀찮고 불편한 일이 아닐 수 없다 그래서 좀 더 편하게 이미지를 옮기는 방법을 소개한다 원리는 무지 간단하다 Edge Inset를 가로,세로 기준으로 이미지 크기와 함께 각각 계산해 주면 된다 왼쪽 정렬 (L: 왼쪽 여백, R: 오른쪽 여백, M: 여백, IW: 이미지 너비, BW: 버튼 너비) 가운데 정렬 이 두가지 경우만 이용하면 나머지 정렬도 모두 가능하다 코딩하면 다음과 같다 class ImageButton: UIButton { //가로 정렬 기준 (-1: 왼쪽, 0: 가운데, 1: 오른쪽) @IBInspectable var horizontal: Int = 0 .. 2017. 5. 30.
UIView에 동적으로 버튼을 넣을때 크기를 같게 맞출려면? 안드로이드에서는 layout_weight 로 쉽게 하위 뷰들의 크기를 맞출 수 있다 예를 들어 버튼을 넣는다면 버튼에 layout_weight=1 속성을 추가한 후 LinearLayout에 넣기만 하면 된다 또한 버튼 사이 간격은 layout_margin 로 조절한다 그렇다면 iso의 swift에선 어떻게 하면 될까? 약간 손이 더 가긴 하지만 어렵지 않다 편하게 사용하기 위해 UIView를 커스텀해서 만들어 보았다 버튼 크기를 맞춰주는 동시에 사이 간격, 여백도 줄것이다 class ButtonsView: UIView { private var mGap: CGFloat! private var mPadding: (left: CGFloat, top: CGFloat, right: CGFloat, bottom: .. 2017. 4. 25.
기준점을 중앙으로 Scale UIView 애니메이션 하기 swift 에서는 간단하게 뷰 애니메이션을 구현할 수 있다. 그런데 크기를 변경시키는 애니메이션에서는 주의 해야 할 점이 있다 바로 기준점이다 다음을 보자 let width = frame.width let height = frame.height frame.size.width = width * 0.2 frame.size.height = height * 0.2 UIView.animateWithDuration(1, delay: 0, options: [.CurveEaseInOut], animations: { self.frame.size.width = width self.frame.size.height = height }, completion: nil) 20% 작은 크기에서 원래 크기로 애니메이션 효과를 주었다 .. 2017. 3. 21.
이미지를 회전시키고 재사용하는 꿀팁 프로그램 안에서 같은 이미지를 여러곳에 사용할때! 그것도 회전시켜 사용할때! 원본 이미지의 회전된 이미지를 테이블안에 넣어 사용하면 간편하고 빠르다. 물론 메모리를 좀 차지하고, 요즘 디바이스도 워낙 좋아져 속도도 별반 차이 없겠지만 그래도 엄청 많은 곳에 엄청 빈번하게 회전 이미지를 사용할때는 유용하다ㅋ class RotateImageTable { let mSrcImage: UIImage let mUnit: CGFloat var mImages: [Int: UIImage] init(srcName: String, unit: CGFloat) { mSrcImage = UIImage(named: srcName)! //원본 이미지 mImages = [Int: UIImage]() //이미지 테이블 mUnit = u.. 2017. 2. 22.