iyOmSd/Title: SwiftUI 30

[SwiftUI] Animation과 Transition

어느땐 애니메이션이 동작하고 어느땐 동작하지않는 그런 현상들이 많아서 정리하려고해요 우선 애니메이션을 줄 수 있는 방법으론 2가지가 있어요 withAnimation - 명시적인 애니메이션 animation - 암시적인 애니메이션 withAnimation은 안에 넣은 코드를 통해 변경사항이 있는 뷰에 변화를 일으켜요 즉, 애니메이션을 발생시키는 곳이죠 transition을 사용할 수 있어요 주의할 점으론 withAnimation안에 animation을 사용해서는 안돼요 animation은 뷰의 속성중 하나가 변경되면 자동으로 그 속성이 변경될때마다 애니메이션을 적용해요 주의할 점으론 컨테이너뷰에 애니메이션을 넣으면안된다는거에요 전체가 적용되는 현상이 있기때문에 최소단위로 실행하는것을 권장해요 그럼 tran..

[SwiftUI] Namespace + matchedGeometryEffect(feat. 상단탭바 UI)

SwiftUI로 위와같은 UI기능을 만드려고 하면서 알게 된 Namespace에 대해 간단하게 정리해보려고해요 먼저 개념을 둘러보면 프로퍼티를 포함하는 객체(뷰)의 영구 id로 정의된 네임스페이스에 접근할 수 있는 동적 속성 타입 객체의 정보를 id로 다른 뷰와 공유할 수 있는거에요 이 속성과 같이 사용하는게 View.matchedGeometryEffect(id: in:) 함수구요 동일한 키를 가진 다른 뷰가 새로운 뷰를 삽입하는 경우 시스템은 이전 위치에서 새로운 위치로 이동하는 하나의 뷰처럼 보이도록 window공간에 frame 사각형을 합칩니다. 일반적인 전환 메커니즘은 전환중 두 뷰가 각각 렌더링 되는 방식을 정의하며, 뷰의 렌더링이아닌 연결될 geometry에만 정렬합니다. 사용은 간단해요 상단..

[SwiftUI] Button CornerRadius 효과주기 border, stroke, strokeBorder

개발하면서 버튼에 라운드를 적용했고 테두리를 주려고하는데 짤림현상이 나타났어요 삽질좀 한 내용을 공유하려고해요 문제가된 코드입니다 func 문제코드() -> some View { Button { print("버튼 클릭!") } label: { Text("테두리 있는 버튼") .foregroundColor(.pink) .frame(width: 200, height: 60) } .background(.black) .border(.pink, width: 2) .cornerRadius(8) } 코드만 보면 전혀 문제가 없어보이지만 실제로 버튼을보면 모서리쪽에 어색한 부분이 있다는걸 느끼실거에요 이러한 문제가있어서 다른방법으로 border를 줘봤지만 다 실패했었어요 (얇은 테두리시 문제 현상 발생해요 두꺼우면 티..

[SwiftUI] Localization 다국어 적용하기

앱을 개발하면서 영어사용 국가에선 영어로 보여주고 대한민국에선 한글로 보여주도록 해주는 다국어 기능을 적용을 해보려고해요 Strings File을 하나 만들어요 이 때 이름은 Localizable.strings 으로 꼭 설정 해주세요 이 파일이름을 인식해서 로컬라이제이션을 적용시켜요 방금만든 파일에서 오른쪽 인스팩터창에서(커맨드 + 옵션 + 0) 로컬라이제이션을 눌러주고 프로젝트파일을 눌러서 이 밑에있는 로컬라이제이션에 +를 눌러주세요 Korean를 찾고 클릭! 이 로컬라이제이션파일을 다국어 처리할거기 때문에 클릭 설정도 됬고 파일도 생성되서 영어랑 한글이 지원되도록 적용됬어요 이제 설정은 끝났고 어떻게 사용하는지 해볼께요 우선 사용은 key = value; 형식으로 사용해요 해당 키에 맞는 스트링 값을..

[SwiftUI] 네비게이션 바 숨기기

잘 작동하고 있던 기능이 SwiftUI가 업데이트되면서 어떤 부분이 변경되서 그런가 적용되지 않게되는 이슈가 생겨서 수정하면서 글을 적어보려고해요 위와같은 그림에 네비게이션바를 보면 어색한게 보이죠?? 네 당연히 의도한게아니에요... 저부분도 딤처리된 뷰로 가려야하는데 저부분만 더 앞에 있게 되더라구여 그래서 원래 네비게이션바를 숨기는 로직을 적용했었는데 작동하지않아서 위 그림처럼 저런현상이 서비스에 노출되고 있었어요 ㅠ 네비게이션바을 숨기는 방법으로는 1.네비게이션바를 히든처리한다 2.뷰로 네비게이션을 덮는다 이렇게 있겠죠 2번인 경우엔 뷰로 덮어지지않았어요 위처럼 네비게이션바가 뷰보다 항상 위에 있게되더라구요 뷰로 네비게이션을 덮기보단 화면으로 덮어야해요 fullScreenCover를 이용해서 아예덮..

[SwiftUI] Widget 위젯만들기

한번 만들어봐야지 생각만하고 해보지못했던 위젯을 드디어 만들어 보려고합니다~~ 평소에 iOS프로젝트 생성하듯이 빈프로젝트를 만들고 Target을 선택하면 ~~Extension이 많이보여요 그중에서 이번에 할 것은 위젯이니까 찾아서 클릭! 위젯이름 넣어주고 만들면 Active하겠냐고 묻는거 확인누르고! 이제 위젯이 만들어졌어요! 빌드하면 제가 방금만든 위젯이 보일거에요 위젯에는 3가지 요소가 중요해요 WidgetConfiguration: 위젯 식별 및 위젯의 Content표시 Provider: 시간에 따른 위젯 업데이트 로직 EntryView: 위젯을 표시하는 View 처음으로 구현되어있는 코드를보면 Widget코드! @main struct NSWidget: Widget { let kind: String ..

[SwiftUI] 뷰 상태변경 @State @Binding @ObservedObject @StateObject

SwiftUI를 사용한다면 꼭 알아야할 Property Wrapper중 상태변화에 대한것을 알아보려고해요 @State UIKit에선 Property Observer를 통해서 변화가 일어나면 뷰를 업데이트시키는 방식을 사용했지만 SwiftUI에선 @State라는 프로퍼티 래퍼를 통해서 같은 일을 할 수 있어요 @State로 선언된 변수의 값이 변할 때 View를 다시 계산해서 그려줘요 주의사항으로는 View의 body에서만 @State변수에 접근해야해요 즉, private 선언이 따라오는것을 권장하고 외부에서 이 변수에 접근하면 안돼요 경고문, 텍스트필드, 편집모드같이 현재화면의상태를 잠깐 나타내거나 간단한 View의 상태를 나타낼 변수를 선언하는데 적합하죠 SwiftUI에서 View는 struct형태로 ..

[SwiftUI] HStack, VStack, ZStack 기본 레이아웃

레이아웃을 잡을줄 알아야 디자인을 원하는데로 넣어 볼 수도 있을거에요 SwiftUI가 아직 발전중이기도하고 비슷한 컴포넌트들이 되게많아서 여러 방법으로 구현할 수 있다는점 알아두시구요! HStack, VStack, ZStack..? H, V, Z 가 앞에 붙어있는 스택이네요 Horizontal Vertical Z .. 음 어떤 풀네임인진 잘모르겠지만 Depth를 나타내죠! HStack의 생성자에요 하나씩 보면 파리미터1: 정렬 파라미터2: 간격 파라미터3: 무엇인가넣어주는 클로저네요? @ViewBuilder..?! -> 나중에 다뤄보도록할게요 우선 뷰를 넣어줄 수 있는 클로저라고 생각하면되요! 처음 프로젝트를 만들면 some View 반환형을 볼 수 있어요 Opaque Type이라고 불리구요 어떤 뷰를 ..

[SwiftUI] Published, ObservableObject

SwiftUI를 공부하다보면 @Published 라는 키워드를 보게될거에요 이와 같이 언급되는게 ObservableObject죠 ObservableObject는 필수구현을 필요로 하지않는 프로토콜이에요 Combine에 속한 기능이구요 클래스에서만 사용가능하고 ObservableObject를 준수한 클래스는 objectWillChange라는 프로퍼티를 사용할 수 있어요(ObservableObjectPublisher타입) objectWillChange.send()를 이용하기위함이죠 이 send()함수는 변경된 사항이 있다고 알려주는 거에요 Combine?!!? RxSwift같이 쓰는거잖아요..!! 어렵잖아요..! 라고 생각할수 잇지만 스유를 공부하다보면 자연스레 접할수있어요 ㅎㅎ Combine도 따로 공부하..