본문 바로가기

분류 전체보기

(340)
HiBy R5S 다크모드 적용하기 (Android 8.x 다크모드) 서론 HiBy R5S 개봉 및 6개월 사용기 서론 지난여름 애플뮤직이 무손실 지원을 시작했다. 해외 음원을 주로 듣던 내게 적당한 가격의 애플뮤직은 꽤나 구미가 당기는 딜이었다. 음악을 항상 듣기도 하고, 자주 듣기도 하지만 가장 chillog.page 이전 개봉기 및 사용기에서 못 다 다룬 장점이 있다. 우선, M3X는 안드로이드 7.0을 사용하고, R5S는 안드로이드 8.1을 사용한다. 배경화면도 기본을 사용하고, Hiby 플레이어 자체도 검은색 베이스로 튜닝하는 등 UI도 어두울 것 같지만 전혀 그렇지 않다. 요즘은 당연시 생각되는 다크 모드는 Android는 10부터, iOS는 13부터 지원하는 상당히 상위 버전의 기능이다. 취침 전 침대에서 사용하는 내게 이런 밝은 UI는 섬광탄 수준으로 아주 ..
HiBy R5S 개봉 및 6개월 사용기 지난여름 애플뮤직이 무손실 지원을 시작했다. 해외 음원을 주로 듣던 내게 적당한 가격의 애플뮤직은 꽤나 구미가 당기는 딜이었다. 음악을 항상 듣기도 하고, 자주 듣기도 하지만 가장 집중해서 듣는 시간은 바로 자기 전 침대 안이다. 핸드폰과 대부분의 전자기기는 책상에 올려 둔 상태로 아무런 방해 없이 오롯이 한 가지에 집중할 수 있다. 그런 시간에 조금 더 섬세한 음악을 들을 수 있다니, 리시버와 재생기기에 신경이 안 쓰일 리가 없다. 다만 무손실 재생이 iOS 15 이상의 기기를 요구했기에 아쉽게도 내가 가진 5s는 더 이상 그 역할을 하지 못하는 상황에 이르렀다. 이럴 줄 알았으면 SE를 남기고 너를 처분할 걸... 하는 아쉬움과 조금 더 음악을 즐겨보자는 욕심이 생긴 것도 이때였다. 개봉기 그럼 그의..
168. Debugging Auto Layout Debugging Auto Layout Auto Layout에서 오류가 발생하는 이유는 필요한 제약이 추가되지 않은 경우 필요 이상의 제약이 중복돼 있는 경우 처럼 명확하다. 필요한 제약만 올바르게 추가한다면 문제가 발생하는 경우는 없다. 하지만 코드를 사용해 제약을 추가하는 경우 앱을 실행할 때까지 결과를 확인할 수 없으므로, 이러한 규칙을 지키기 어려울 때도 있다. Missing Constraints 예시는 위와 같다. leading 제약만 추가돼있고, Indicator가 붉은 색으로 표시된다. Interface Builder에서는 여러 방식으로 오류를 표현한다. Design Time Visual Indicator Scene에서 해당 제약을 붉게 표현한다. Constraint Issue Indicat..
167. Constraints with Code #5 Constraints with Code #5 Constraint animation 제약에 Animation을 추가해 본다. // // AnimatingLayoutChangesViewController.swift // Constraints with Code Practice // // Created by Martin.Q on 2021/12/20. // import UIKit class AnimatingLayoutChangesViewController: UIViewController { @IBOutlet weak var pinkView: UIView! @IBOutlet weak var heightConstraint: NSLayoutConstraint! @IBOutlet weak var widthConstrai..
166. Constraints with Code #4 Constraints with Code #4 Align Center 사용할 Scene은 위와 같다. Label을 중앙에 배치하고, 파란색 View를 아래에 배치한다. 단, Label은 Intrinsic Size를 사용하도록 크기 제약은 추가하지 않는다. Label과 파란색 View의 간격은 10pt, 파란색 View의 높이는 5pt, 파란색 View의 너비는 Label의 너비와 같도록 제약을 추가한다. 추가된 모습은 위와 같다. NSLayoutConstraint로 제약 추가하기 func layoutWithInitializer() { label.translatesAutoresizingMaskIntoConstraints = false tealView.translatesAutoresizingMaskIntoCo..
165. Constraints with Code #3 Constraints with Code #3 Custom Header View 화면 상단에 View를 배치하고, 너비는 margin에 관계없이 모두 채울 수 있도록 제약을 추가한다. 높이는 100pt로 고정한다. Scene은 위와 같다. 추가되는 제약은 위와 같다. 이때 추가하는 대상은 Safe Area가 아닌 View로 설정해야 하고, Constrain to margins 속성은 비활성화해야 한다. 이렇게 추가하면 System UI의 영역까지 덮게 된다. 만약 System UI를 침범하지 않게 하려면 Safe Area를 기준으로 추가하면 된다. 변경하면 위와 같은 모습이 된다. // // CustomHeaderViewController.swift // Constraints with Code Practi..
트루유틸리티 TU590 서론 올해 초부터 멀티툴, 공구에 대해 관심리 조금 생겼다. 아마 본가로 다시 합치게 되면서 공간 창출에 대한 관심이 생기고, DIY와 사진 촬영에 관심이 늘면서 자연스럽게 가볍게 들고 다닐만 한 휴대용 제품들에 눈길을 두던 와중 늘 그렇듯 잘 쓰던 커터칼이 사라졌다. 사용하던 칼은 위처럼 30도 날을 사용하는 얊은 커터칼이었다. 아무래도 힘을 줘서 사용하기엔 조금 무리가 있어서 날을 흑날로 바꿔볼까 고민하던 차에 그냥 사라져 버린 거다. 본론 구입한 제품은 트루유틸리티의 휴대용 유틸리티나이프 TU590이다. 패키지의 그림에서 볼 수 있듯 커버가 열려 손잡이의 역할을 하는 그런 제품이다. 가격은 13000원 대에, 배송비 3000원을 포함해 16000원이다. 뒷면에는 교체해서 사용할 수 있는 여분날이 들..
164. Constraints with code #2 Constraints with code #2 top, leading, trailing, bottom // // FillParentViewController.swift // Constraints with Code Practice // // Created by Martin.Q on 2021/12/17. // import UIKit class FillParentViewController: UIViewController { @IBOutlet weak var bottomContainer: UIView! @IBOutlet weak var orangeView: UIView! override func viewDidLoad() { super.viewDidLoad() layoutWithInitializer() } } ex..
Xcode의 Vary for traits는 어디로 갔을까? 서론 161. Adaptive Layout Adaptive Layout Adaptive Layout은 모든 기기와 실행 환경에서 동작할 수 있는 하나의 UI를 개발하는 방법. 혹은 이에 필요한 기술이다. iOS 8의 등장과 함께 Adaptive Layout이 등장했다. 이전에는 Storyboard가.. chillog.page 최근 Adaptive Layout을 공부하며 강의와는 좀 많이 달라진 부분이 있어 기록을 남긴다. 본론 강의에서 Adaptive Layout을 사용하기 위해 Device Configuration Bar의 오른쪽에 위치하는 Vary for Traits 버튼을 누르고 Varying 모드로 진입하는 부분이 존재한다. 하지만 해당 테크닉은 편집을 마치고 Done Varying을 눌러야만 변..
163. Constraints with Code #1 Constraints with Code #1 제약을 코드를 통해 적용하는 법에 대해 정리한다. 제약은 NSLayoutConstraint 클래스로 구현돼있고, 해당 클래스의 멤버를 통해 제약을 활용할 수 있다. Interface Builder를 통해 제약을 추가하는 것보다 어렵고 많은 코드를 입력해야 하지만, 동적으로 적용되는 제약을 자유롭게 적용할 수 있다. 제약을 추가하는 데에는 두 개의 멤버가 제공된다. constraints(withVisualFormat:) 메서드는 Visual Format Language를 통해 제약을 생성할 때 사용된다. init(item:) 메서드는 가장 기본적인 제약을 생성할 때 사용된다. item1.attr = multiplier * item 2.attr + constant..