<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>BOID</title>
    <link>https://boidevelop.tistory.com/</link>
    <description>같이 성장하고 개인 발전을 위한 블로그 사이트 입니다 :) 기초부터 다시 천천히 포스팅하려고 해요</description>
    <language>ko</language>
    <pubDate>Fri, 24 Jul 2026 16:28:36 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>HoonIOS</managingEditor>
    <image>
      <title>BOID</title>
      <url>https://tistory1.daumcdn.net/tistory/4496717/attach/bd5ad6500e6e4b3f8781f518f920b841</url>
      <link>https://boidevelop.tistory.com</link>
    </image>
    <item>
      <title>[디자인 패턴] 상태 패턴이란? (2/2) (Swift)</title>
      <link>https://boidevelop.tistory.com/129</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;안녕하세요, HoonIOS입니다. :)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에는 간단하게 상태패턴에 대해 알아봤는데요, 이번에는 구조에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;상태패턴 구조&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-18 오후 7.52.19.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nazix/btskhcHDvhv/AbEDzFAXgnWijcmiN4kPTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nazix/btskhcHDvhv/AbEDzFAXgnWijcmiN4kPTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nazix/btskhcHDvhv/AbEDzFAXgnWijcmiN4kPTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnazix%2FbtskhcHDvhv%2FAbEDzFAXgnWijcmiN4kPTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;624&quot; height=&quot;462&quot; data-filename=&quot;스크린샷 2023-06-18 오후 7.52.19.png&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;콘텍스트&amp;nbsp;&lt;br /&gt;- 상태에 대한 참조를 저장하고 모든 상태별 작업을 하는 곳&lt;br /&gt;- 상태 인터페이스를 통해 상테 객체와 통신하며 새로운 상태 객체를 전달하기 위한 setter을 호출&lt;/li&gt;
&lt;li&gt;상태&lt;br /&gt;- 인터페이스로 상태별 메서드를 구현&lt;br /&gt;- 이 메서드는 모든 상태에 대해 유효한 메서드이어야 하는데 그 이유는 상태에 따라 호출될 일이 없는 메서드들를 인터페이스로 구분하면 사이드 이펙트가 나올 가능성이 있기 때문이다.&lt;/li&gt;
&lt;li&gt;구상 상태&lt;br /&gt;- 상태별 클래스로 상태 인터페이스에 따른 메서드들을 자체적인 구현을 제공합니다.&lt;br /&gt;- 여러 상태에서 유사한 코드의 중복을 피하기 위해 어떤 공통 행동을 캡슐화하는 중간 추상 클래스들을 제공할수 있습니다.&lt;br /&gt;- 상태에 따른 객체들은 콘텍스트에 대해 역참조할수 있고 이 참조를 통해 상태는 콘텍스트 객체에서 필요한 정보를 가지고 올수 있습니다&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;언제 적용할까요?&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 상태에 따라 다르게 행동하는 객체가 있고 상태가 많을때 사용하는게 좋고 상태별로 코드가 자주 변경될때 사용하면 좋아요,&lt;br /&gt;즉. 새로운 상태를 추가하거나 기존 상태들을 독립적으로 변경하는데 쉬워서 유지 관리하기도 좋습니다.&lt;/li&gt;
&lt;li&gt;하나의 값에 따라 클래스의 행동하는 방식을 변경하는 조건문 늪들이 있을떄 사용하는게 좋습니다.&lt;/li&gt;
&lt;li&gt;상태들에 따라 중복 코드 또는 조건문-기반 상태 머신의 천이가 많을때 사용하는게 좋습니다.&lt;/li&gt;
&lt;li&gt;거대한 상태 조건문들이 추가될려고 할때 해당 패턴을 적용하는게 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 상태패턴에 대해 알아봤는데요, 상태에 따라서 다르게 동작을 하도록 할때 적용하는게 좋을것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목2 시작--&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목2 끝--&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;</description>
      <category>디자인 패턴 (Swift)</category>
      <category>Swift</category>
      <category>공부중</category>
      <category>디자인패턴</category>
      <category>상태패턴</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/129</guid>
      <comments>https://boidevelop.tistory.com/129#entry129comment</comments>
      <pubDate>Sun, 18 Jun 2023 20:31:25 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] 상태 패턴이란? (1/2) (Swift)</title>
      <link>https://boidevelop.tistory.com/128</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;안녕하세요, HoonIOS입니다. :)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 패턴중에 하나인 상태패턴 공부한것에 대해 정리 할려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태패턴의 정의에 대해 먼저 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;상태패턴 정의&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;상태 패턴은 객체의 내부 상태가 변경 될때 해당 객체가 그 상태에 알맞는 행동을 할수 있도록 변경해주는게 행동 디자인 패턴입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예를들어 어느 한 책을 출판한다고 했을때 출판하기 까지 초안, 검토, 출판 이렇게 세가지 형태로 크게 나눈다고 한다고 하면 각 상태를 객체에서 상태에 따라 분류하여 동작하도록 처리해주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉 아래와 같은 방식을 살펴 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;상태 패턴 방식&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-18 오후 7.41.00.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/omK0D/btskhLQtWFr/by71cgp77Jj342qEpw2vDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/omK0D/btskhLQtWFr/by71cgp77Jj342qEpw2vDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/omK0D/btskhLQtWFr/by71cgp77Jj342qEpw2vDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FomK0D%2FbtskhLQtWFr%2Fby71cgp77Jj342qEpw2vDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;508&quot; data-filename=&quot;스크린샷 2023-06-18 오후 7.41.00.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 코드는 객체 내에서 자체적으로 상태에 따라 코드를 구현하는 대신 현재 상태를 나타내는 상태 객체중 하나에 대한 참조를 저장하고 모든 상태에 관련된 작업을 Document 객체에 위임하는것입니다.&lt;!--소제목1 끝--&gt;&lt;/li&gt;
&lt;li&gt;콘택스트의 상태를 전환하려면 호라성 상태 객체를 다른 객체로 바꿔야 합니다. 위 changeState에 새로운 객체를 위임한것처럼 바꾸는 방식입니다.&lt;/li&gt;
&lt;li&gt;이 방식의 가장 큰 장점은 각 상태들은 서로 인식하고 다른 상태로 천이 할수 있습니다.&lt;/li&gt;
&lt;li&gt;콘텍스트는 모든 상태별 작업을 위임하는곳입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 간단하게 상태 패턴이란 무엇인가에 대해 알아봤는데 다음에는 구조에 대해 좀더 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;</description>
      <category>디자인 패턴 (Swift)</category>
      <category>Swift</category>
      <category>디자인패턴</category>
      <category>상태패턴</category>
      <category>정리</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/128</guid>
      <comments>https://boidevelop.tistory.com/128#entry128comment</comments>
      <pubDate>Sat, 10 Jun 2023 19:58:26 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] 커맨드 패턴이란? (2/2) (swift)</title>
      <link>https://boidevelop.tistory.com/127</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;안녕하세요, HoonIOS입니다. :)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에 커맨드 패턴에 대해 구성 요소랑 커맨트 패턴의 장점에 대해 말씀 드렸습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 구조 및 관련 코드에 대해 말씀 드리려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;커맨드 패턴 구조&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-06-10 오후 7.43.13.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FKB96/btsjkadpy6O/FxvmfKHuKTv6w6wwe49KS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FKB96/btsjkadpy6O/FxvmfKHuKTv6w6wwe49KS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FKB96/btsjkadpy6O/FxvmfKHuKTv6w6wwe49KS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFKB96%2Fbtsjkadpy6O%2FFxvmfKHuKTv6w6wwe49KS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;481&quot; data-filename=&quot;스크린샷 2023-06-10 오후 7.43.13.png&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Client: Client에서 ConcreateCommand를 init하고 Receiver를 설정하는 역할&lt;/li&gt;
&lt;li&gt;Reciever: Clelient에서 Receiver를 설정하고 Receiver 객체를 각 Command의 생성자로 전달하여 처리, 수신자 역할로 실제로 요청을 처리&lt;/li&gt;
&lt;li&gt;ConcreateCommand: 각 Commadn 객체와 실행할 메서드를 연결시키는 역할&lt;/li&gt;
&lt;li&gt;Command: 실행 요청에 대한 인터페이스로 각 필요한 작업들이 있고 execute(실행 메서드)가 포함&lt;/li&gt;
&lt;li&gt;Invoker: Command 객체들을 관리하고 있는 저장하고 있는 클래스 각 커맨드를 시작 및 관리하는 역할&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>디자인 패턴 (Swift)</category>
      <category>Command</category>
      <category>Pattern</category>
      <category>Swift</category>
      <category>디자인패턴</category>
      <category>커맨드패턴</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/127</guid>
      <comments>https://boidevelop.tistory.com/127#entry127comment</comments>
      <pubDate>Sat, 10 Jun 2023 19:56:17 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] 커맨드 패턴이란? (1/2) (Swift)</title>
      <link>https://boidevelop.tistory.com/126</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;안녕하세요, HoonIOS입니다. :)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 회사에서 특정 앱을 구현하게 됐는데 구조에 대해 고민을 하면서 여러 패턴에 대해 찾아보던 중 커맨드 패턴 (Command Pattern)이 구현 목적에 어울리는 패턴이라고 생각해서 해당 패턴에 대해 정리를 해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 요구 사항을 아래와 같습니다.&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #fefeb8; padding: 10px; border: 1px solid #f3c534;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 각 테스트 케이스를 모듈화 할 수 있을 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 테스트 케이스를 순서대로 처리할수 있는 로직에 맞는 로직&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 테스트 케이스의 순서는 유동적으로 바뀔 수 있고 추가 및 삭제, 순서 변경이 될 수 있음&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt; &lt;span style=&quot;font-size: 21px;&quot;&gt;커맨드 패턴이란?&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;커맨드 패턴의 정의는 모든 정보가 포함된 &lt;u&gt;&lt;b&gt;독립 실행형 객체(캡슐화)로 변환하는 디자인 패턴&lt;/b&gt;&lt;/u&gt;입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이 패턴은 대기열에 넣을수도 있고 실행을 취소할 수도 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;또, 커맨드를 필요한 시점에 실행을 할수도 있는 게 장점입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 회사 앱에서는 여러 테스트 케이스를 커맨드화 해서 독립적으로 실행할 수 있도록 처리하면 각 테스트 케이스들끼리 연결 되어 있지 않고 모듈화 해서 처리를 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;구성 요소&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Command: 실행 요청에 대한 인터페이스를 정의한 클래스로 이 클래스 내부에는 excute(실행 메서드)가 포함 되어 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;ConcreateCommand: Command 인터페이스를 구현하는 클래스입니다. 각 객체와 실행할 메서드를 연결시키는 역할을 하므로 각 테스트 케이스 별로 인터페이스를 정의하면 됩니다.&lt;/li&gt;
&lt;li&gt;Invoker: 발송자 클래스로 요청들을 시작 및 관리하는 역할을 합니다. 이 클래스는 Command들을 Array로 관리를 하거나 저장을 합니다.&lt;/li&gt;
&lt;li&gt;Receiver: 수신자의 역할로 요청을 수신하고 실제로 요청을 처리하는 객체를 의미합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목2 시작--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt; &lt;span style=&quot;font-size: 21px;&quot;&gt;커맨드 패턴 장점&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유연성과 확장성을 제공하여 커맨드를 더 키울 수 있고 유연하게 시작 종료를 진행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;실행 취소, 다시 실행, 로깅과 같은 기능을 구현하는데 용이합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 간단하게 커맨드 패턴에 대해 알아봤는데요 다음에는 구조 및 코드로 살펴보도록 하겠습니다! 긴 글 읽어주셔서 감사합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목2 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>디자인 패턴 (Swift)</category>
      <category>Command</category>
      <category>Pattern</category>
      <category>Swift</category>
      <category>디자인패턴</category>
      <category>커맨드패턴</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/126</guid>
      <comments>https://boidevelop.tistory.com/126#entry126comment</comments>
      <pubDate>Tue, 30 May 2023 20:44:14 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] 리스트의 섹션(Section)이란?</title>
      <link>https://boidevelop.tistory.com/125</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트에는 섹션이라는 구조체가 존재 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섹션을 이용하면 데이터를 쉽게 그룹화 하는것도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 시작--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; margin-bottom: 5px; border-right-width: 0px; word-spacing: 3px; margin-top: 5px; border-bottom: #0404B4 2px solid; border-left: #0404B4 12px solid; letter-spacing: 1px; line-height: 1.5; border-top-width: 0px; margin-right: 0px; border-image: initial; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;섹션(Section)의 구조체 형태&lt;/h3&gt;
&lt;pre id=&quot;code_1670655994441&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;strcut Section&amp;lt;Parent, Content, Footer&amp;gt; {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섹션에는 헤더와 푸터를 생략할수도 있고 둘중 하나만 선택해서 사용을 할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 헤더, 푸터 모두 뷰여서 커스텀을 통해 원하는 뷰를 구성후 전달을 할수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;섹션의 header, footer를 구성하는 방법에 대해 한번 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&amp;nbsp;섹션(Section) 구성 예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1670656338858&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    let data1 = [&quot;데이터 1&quot;, &quot;데이터 2&quot;, &quot;데이터 3&quot;, &quot;데이터 4&quot;]
    let data2 = [&quot;데이터 5&quot;, &quot;데이터 6&quot;, &quot;데이터 7&quot;, &quot;데이터 8&quot;]

    var body: some View {
        let sectionHead = [&quot;섹션 1&quot;, &quot;섹션 2&quot;]
        let footerHead = [data1, data2]
        
        return List {
            ForEach(footerHead.indices) { index in
                Section(header: Text(sectionHead[index]).font(.title),
                        footer: HStack{ Spacer(); Text(&quot;\(footerHead[index].count)수&quot;) }
                )  {
                    ForEach(footerHead[index], id: \.self) {
                        Text($0)
                    }
                }
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-12-10 오후 4.27.12.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYupcj/btrTjGNT5HV/0tTwkkLJZzet6hiuKk0Bsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYupcj/btrTjGNT5HV/0tTwkkLJZzet6hiuKk0Bsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYupcj/btrTjGNT5HV/0tTwkkLJZzet6hiuKk0Bsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYupcj%2FbtrTjGNT5HV%2F0tTwkkLJZzet6hiuKk0Bsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;503&quot; data-filename=&quot;스크린샷 2022-12-10 오후 4.27.12.png&quot; data-origin-width=&quot;470&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두개의 섹션과 각 섹션 별 5개의 데이터를 구성하는 리스트뷰를 구성해봤습니다.&lt;/li&gt;
&lt;li&gt;이 예제의 핵심은 Section(header:, footer:)의 struct를 통해 header와 footer를 설정한것입니다.&lt;/li&gt;
&lt;li&gt;header는 sectionHead배열의 index를 섹션 주소로 설정했습니다.&lt;/li&gt;
&lt;li&gt;footer는 footerHead배열에 갯수만큼 설정해 주었습니다.&lt;/li&gt;
&lt;li&gt;UIKit으로 설정해줄때는 UITableViewDataSource프로토콜을 통해 헤더뷰와 푸터뷰를 등록 및 관리를 했지만 SwiftUI에서는 struct를 통해서 설정을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단하게 섹션 정의랑 표현 방법에 대해 포스팅했는데 다음에는 리스트를 커스텀하게 꾸미는 부분에 대해 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <category>section</category>
      <category>SwiftUI</category>
      <category>개발자</category>
      <category>개인공부</category>
      <category>섹션</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/125</guid>
      <comments>https://boidevelop.tistory.com/125#entry125comment</comments>
      <pubDate>Sat, 10 Dec 2022 16:40:55 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] SwiftUI에서 리스트(테이블 뷰) 만들기</title>
      <link>https://boidevelop.tistory.com/124</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스팅에는 UIKit에서 UITableVIew로 사용되는 List에 대해 사용법 및 설명에 대해 포스팅을 하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 시작--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; margin-bottom: 5px; border-right-width: 0px; word-spacing: 3px; margin-top: 5px; border-bottom: #0404B4 2px solid; border-left: #0404B4 12px solid; letter-spacing: 1px; line-height: 1.5; border-top-width: 0px; margin-right: 0px; border-image: initial; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;리스트란?(List)&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;List란 하나 이상의 행 및 뷰를 수직 방향의 목록 데이터로 여러 개의 행이 표현되는 UI를 구성해 여러 개의 데이터를 쉽게 나열할 수 있도록 구성된 뷰입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;UIKit의 UITableView와 다른점은 UITableView에서는 하나의 행을 셀이라고 표현을 한 반면 SwiftUI에서는 로우라고 표현합니다.&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SwiftUI인 새로운 프레임워크를 통해 리스트를 만들면 그만큼 장점도 있을 겁니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;장점으론 사용하기 편하다. 귀찮은 것들이 없어졌다입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;UITableView를 사용하려면 UITableViewDataSource, UITableViewDelegate를 구현하는 작업을 해야 했는데 List는 해당 작업 내용들을 사용하지 않고도 만들 수 있게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;&amp;nbsp;리스트 구현&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 Text가 있는 List를 구현해보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655291031254&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    List {
        Text(&quot;첫번째&quot;)
        Text(&quot;두번째&quot;)
        Text(&quot;세번째&quot;)
        Text(&quot;네번째&quot;)
        Text(&quot;다섯번째&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오후 8.03.18.png&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDu0bL/btrEQThVvN3/848XUM0wHJvdCPirjwYuy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDu0bL/btrEQThVvN3/848XUM0wHJvdCPirjwYuy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDu0bL/btrEQThVvN3/848XUM0wHJvdCPirjwYuy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDu0bL%2FbtrEQThVvN3%2F848XUM0wHJvdCPirjwYuy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;451&quot; data-filename=&quot;스크린샷 2022-06-15 오후 8.03.18.png&quot; data-origin-width=&quot;253&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;List로 만든 결과물을 확인해보면 테이블 뷰와 같은 모습으로 표현되는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;&amp;nbsp;정적 콘텐츠&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;List는 하나의 로우에 원하는 뷰를 담아서 전달을 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉 하나의 로우에 Text만 넣을 수 있는 것이 아니라 텍스트, 이미지, 모양 등 다양한 뷰들을 동시에 넣어서 표현을 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1655291415692&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    List {
        Text(&quot;첫번째&quot;)
        Image(systemName: &quot;trash&quot;)
        Rectangle().frame(width: 100, height: 100)
        Text(&quot;두번째&quot;)
        Color(.red).frame(width: 50, height: 50)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 끝--&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오후 8.11.17.png&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NAwKd/btrEQSpNfs7/Sa11EMpUKR2cZsvF3ZtJaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NAwKd/btrEQSpNfs7/Sa11EMpUKR2cZsvF3ZtJaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NAwKd/btrEQSpNfs7/Sa11EMpUKR2cZsvF3ZtJaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNAwKd%2FbtrEQSpNfs7%2FSa11EMpUKR2cZsvF3ZtJaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;445&quot; data-filename=&quot;스크린샷 2022-06-15 오후 8.11.17.png&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 예시처럼 만약 각 로우에 텍스트, 이미지, 모양을 지정해줘서 넣어주면 왼쪽과 같이 정적으로 미리 저장된 것을 그대로 표현할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;&amp;nbsp;동적 콘텐츠&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;당연하게 SwiftUI에서는 동적 콘텐츠를 통해 LIst를 만들어 줄 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;크게 서버에 있는 데이터를 받아서 가공하고 처리를 하는 방식을 사용하거나 데이터가 추가, 삭제가 될 수 있을 때 동적 콘텐츠 LIst를 많이 사용을 하게 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;동적 콘텐츠를 사용하는 방법은 크게 세 가지가 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Range &amp;lt;Int&amp;gt;&lt;/li&gt;
&lt;li&gt;RandomAccessCollection&lt;/li&gt;
&lt;li&gt;identifiable 프로토콜&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Range &amp;lt;Int&amp;gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 타입의 값을 넘겨주는 방식입니다 예를 들어 50개의 로우를 만들어 각 0부터 49까지 List를 만드는 코드를 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1655299820572&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    List(0..&amp;lt;50) {
        Text(&quot;\($0)&quot;)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오후 10.31.58.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;1468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVZ2PS/btrETnosne9/cCUW9QQmK6C3cXhbPUcg51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVZ2PS/btrETnosne9/cCUW9QQmK6C3cXhbPUcg51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVZ2PS/btrETnosne9/cCUW9QQmK6C3cXhbPUcg51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVZ2PS%2FbtrETnosne9%2FcCUW9QQmK6C3cXhbPUcg51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;1468&quot; data-filename=&quot;스크린샷 2022-06-15 오후 10.31.58.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;1468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 코드에서 봤듯이 0부터 49까지 찍히는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;여기서 Range &amp;lt;Int&amp;gt;에 범위 연산자를 사용하실 때는&lt;b&gt;A.. &amp;lt;B만 사용 가능하며&lt;/b&gt; &lt;b&gt;A... B, A...,... A Range 타입을 사용하면 오류가 발생&lt;/b&gt;하니 이 부분은 주의해주셔야 합니다!!!!!!&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RandomAccessCollection&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 RandomAccessCollection 프로토콜을 준수하는 데이터를 제공하는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 말씀드리면 그게 무슨 말이야 라고 말을 할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 차근차근 설명을 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #fefeb8; padding: 10px; border: 1px solid #f3c534;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RandomAccessCollection 프로토콜이란?&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오후 10.38.08.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pOEZ2/btrER2yTcVg/mucM2PHROj12kVxQuzRWIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pOEZ2/btrER2yTcVg/mucM2PHROj12kVxQuzRWIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pOEZ2/btrER2yTcVg/mucM2PHROj12kVxQuzRWIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpOEZ2%2FbtrER2yTcVg%2FmucM2PHROj12kVxQuzRWIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1412&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2022-06-15 오후 10.38.08.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;- 효율적인 랜덤 접근을 지원하는 컬랙션이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 좀 더 쉽게 말해 O(1)의 시간 복잡도 안에 인덱스 사이의 거리를 측정할 수 있다고 생각하고 넘어가면 편합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 구분을 식별할 수 있도록 하기 위해 아래 2가지 방법 중 하나를 택해서 id값을 제공해야 합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;id 식별자 지정&lt;br /&gt;- id로 사용할 값을 직접 인수로 제공하는 것으로, 각 로우 데이터마다 고유한 UUID를 생성해줘 고유 식별을 가능하게 하는 것입니다.&lt;br /&gt;- id 매개 변수에는 Hashable 프로토콜을 준수하는 프로퍼티를 지정할 수 있고 그 데이터 타입 자체가 Hashable 프로토콜을 준수하고 있다면 self라고 입력을 할수 있습니다.&lt;br /&gt;(이 경우는 Swift에서 대부분의 타입들은 Hashable 프로토콜을 준수하고 있어 프로포티를 지정하기보다는 self로 자신을 명시합니다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp; identifiable 프로토콜&amp;nbsp;&lt;br /&gt;- 이 방법은 Test의 데이터 구조체에 identifiable 프로토콜을 채택해서 List를 만들 때 id에 매개변수 id를 전달하지 않고 Test 구조체 자체에 UUID를 담을 id 프로퍼티를 만들고 이것을 식별자로 식별할 수 있도록 하는 역할입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1655337281595&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/** id 식별자 지정 **/
struct Test{ }

List ([Test(index: &quot;0&quot;), Test(index: &quot;1&quot;),Test(index: &quot;2&quot;), id: \.self) {...} 
-&amp;gt; 오류 발생 

List ([Test(index: &quot;0&quot;), Test(index: &quot;1&quot;),Test(index: &quot;2&quot;), id: \.name) {...} 
extension User: Hashable{}

-&amp;gt; 해결 방안 
1. 식별을 위한 프로토콜 지정
2. Hashable 프로토콜 채택&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1655351868146&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/** identifiable 프로토콜 **/
Struct Test: Identifiable {
	let id = UUID()
    ...
}

List([Test(index: &quot;0&quot;), Test(index: &quot;1&quot;)]) { ... }

1. Test 구조체에 Identifiable 프로토콜을 채택했고 안에 변수 자체에 UUID를 식별자로 삼아줬으므로 따로 id를 설정할 필요가 없습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 정적, 동적 리스트까지 살펴보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 동적 조합해서 사용하는 방법 등, 더 많은 내용들은 다음 포스팅에 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <category>ios</category>
      <category>list</category>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>UITableView</category>
      <category>개인 공부</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/124</guid>
      <comments>https://boidevelop.tistory.com/124#entry124comment</comments>
      <pubDate>Wed, 15 Jun 2022 23:06:11 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] NavigatonViewStyle에 대해 알아보기</title>
      <link>https://boidevelop.tistory.com/123</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에는 NavigationView에 대해 알아봤는데 이번에는 애플에서 제공하는 navigationViewStyle 수식어들에 대해 원하는 스타일을 적용하도록 한번 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내비게이션 뷰 스타일은 크게 3가지를 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내비게이션 뷰에 스타일을 적용하는 방법은 아래와 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654408758253&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationView { }
	.navigationViewStyle(...)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 91px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style9&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;스타일 종류&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 38px;&quot;&gt;DefaultNavigationViewStyle&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 38px;&quot;&gt;- 내비게이션 뷰의 기본 스타일&lt;br /&gt;- 자동으로 스타일을 결정&lt;br /&gt;- watchOS에서만 제외하고 모두 사용이 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;StackNaviagtionViewStyle&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;- 계층 구조를 하나 뷰로 나가는 스타일&lt;br /&gt;- tvOS, iOS에서 사용 가능&lt;br /&gt;- NavigationVIew안에 여러 뷰를 생성했으면 맨 처음에 있는 뷰만 인식&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;DoubleColumnNavigationViewStyle&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;- UIKit에서 SplitViewController의 역할&lt;br /&gt;- 만약 사용할수 없는 OS면 자동으로 StackNavigationViewStyle로 전환이 된다.&lt;br /&gt;-NaviagtionView안에 여러 뷰를 생성했으면 맨 처음과 맨 마지막 뷰만 인식을 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DoubleColumnNaviagationViewStyle이 어떤 형식으로 보이는지 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면_기록_2022-06-05_오후_3_17_38_AdobeCreativeCloudExpress.gif&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdd3LZ/btrDZvVzs6J/Wp0R0QpgFrvcFRH6T0HAkk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdd3LZ/btrDZvVzs6J/Wp0R0QpgFrvcFRH6T0HAkk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdd3LZ/btrDZvVzs6J/Wp0R0QpgFrvcFRH6T0HAkk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cdd3LZ/btrDZvVzs6J/Wp0R0QpgFrvcFRH6T0HAkk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;241&quot; data-filename=&quot;화면_기록_2022-06-05_오후_3_17_38_AdobeCreativeCloudExpress.gif&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;241&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iPhone 12Pro max를 Lanscape 한 후에 실행을 해보면 위와 같이 DoubleColumnNaviagationViewStyle형태로 ViewController가 보이는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <category>ios</category>
      <category>NavigationView</category>
      <category>Style</category>
      <category>SwiftUI</category>
      <category>개인공부</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/123</guid>
      <comments>https://boidevelop.tistory.com/123#entry123comment</comments>
      <pubDate>Sun, 5 Jun 2022 15:22:39 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] SwiftUI에서 UINavigationViewController 사용하기 (NavigationView)</title>
      <link>https://boidevelop.tistory.com/122</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 UIkit에서 제공하는 UINavigationViewController을 SwiftUI에서 어떻게 사용하는지 한번 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내비게이션 뷰는 내비게이션 스택을 통해 콘텐츠 뷰들을 관리하는 컨테이너 뷰입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 화면을 전환하거나 내비게이션 아이템, 내비게이션 타이틀과 같은 요소들을 이용해&amp;nbsp; Controller을 쉽고 다양하게 보여줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;NavigationView 적용 방법&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1654405008921&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationView {
    Text(&quot;ContentView 01&quot;)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;내비게이션 뷰를 적용하기 위해서는 넣고 싶은 컨탠츠들을 내비게이션 뷰로 감싸 주면 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉, 저는 내비게이션 뷰 안에 Text 객체를 넣어줘서 표현해줬습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt; &lt;span style=&quot;font-size: 21px;&quot;&gt;NavigationViewTitle 적용 방법&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1654405111158&quot; class=&quot;reasonml&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationView {
    Text(&quot;ContentView 01&quot;)
        .navigationTitle(&quot;SwiftUI&quot;)
        .navigationBarTitleDisplayMode(.inline)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내비게이션 뷰 안에. navigationTitle(타이틀 제목)을 넣어주면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가끔씩 업데이트되지 않은 서적은. navigationBarTitle(타이틀 제목)을 넣어달라는 내용이 있는데 현재. navigationBarTitle은 Descrepted 되었으므로. navigationTitle 메서드를 사용해주셔야 합니다. :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 여기서 위 예시 코드 중에. navigationBartTitleDisplayMode메서드가 있는 것을 확인하셨을 겁니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 옵션도 한번 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt; &lt;span style=&quot;font-size: 21px;&quot;&gt;NavigationViewTitle 보여주는 옵션 설정하기&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;. navigationBarTitleDisplayMode을 통해 보여주는 모드를 설정하는 스타일은 크게 두 가지가 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 디스플레이 모드를 설정해주지 않으면 기본적으로 automatic이 사용됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;large&lt;br /&gt;아래와 같이 내비게이션 뷰 안에 큰 제목으로 표현이 되는 Mode입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.08.50.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBH2de/btrD2HAIh27/EKjaqz2CQbvf9hgAa7NkG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBH2de/btrD2HAIh27/EKjaqz2CQbvf9hgAa7NkG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBH2de/btrD2HAIh27/EKjaqz2CQbvf9hgAa7NkG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBH2de%2FbtrD2HAIh27%2FEKjaqz2CQbvf9hgAa7NkG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;275&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.08.50.png&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;inline&lt;br /&gt;UIKit의 내비게이션 뷰 타이틀과 같이 맨 위 가운데에 들어가는 것을 확인할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.10.40.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o9aT3/btrDWE7b1IQ/kJlsEI2S9XyxVTt1UGkmak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o9aT3/btrDWE7b1IQ/kJlsEI2S9XyxVTt1UGkmak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o9aT3/btrDWE7b1IQ/kJlsEI2S9XyxVTt1UGkmak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo9aT3%2FbtrDWE7b1IQ%2FkJlsEI2S9XyxVTt1UGkmak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;251&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.10.40.png&quot; data-origin-width=&quot;608&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;NavigationBarItem 설정하기&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;UIKIt에서 내비게이션 바 버튼 아이템을 설정할 때는 UIBarButtonItem객체를 생성해줘서 구현하도록 설정해줬습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SwiftUI에서는 각 아이템 버튼 객체를 생성해준 후 NavigationBarItems 수식어에 전달을 해줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654406707580&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
        let leftBtn = Button(action: { print(&quot;is Left Btn&quot;) }) {
            Image(systemName: &quot;bell&quot;).imageScale(.large)
        }
        
        let rightBtn = Button(action: { print(&quot;is Right Btn&quot;) }) {
            Image(systemName: &quot;gear&quot;).imageScale(.large)
        }
        
        return NavigationView {
            Text(&quot;ContentView 01&quot;)
                .navigationTitle(&quot;HoonIOS&quot;)
                .navigationBarTitleDisplayMode(.inline)
                .navigationBarItems(leading: leftBtn, trailing: rightBtn)
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 코드를 한번 살펴보면 leftBtn, rightBtn의 Button 타입의 변수를 생성해준후 각 actionEvent, 버튼 이미지를 설정해 주고 이 객체를 NavigationView의 navigationBarItems에 전달해준 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 아래와 같이 NavigationBarItems가 설정된 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.27.19.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;1346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpPXXu/btrD2GV6PRW/LeOEf885mJXH5q3vpktkM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpPXXu/btrD2GV6PRW/LeOEf885mJXH5q3vpktkM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpPXXu/btrD2GV6PRW/LeOEf885mJXH5q3vpktkM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpPXXu%2FbtrD2GV6PRW%2FLeOEf885mJXH5q3vpktkM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;645&quot; data-filename=&quot;스크린샷 2022-06-05 오후 2.27.19.png&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;1346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #fefeb8; padding: 10px; border: 1px solid #f3c534;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 만약 내비게이션 뷰 아이템을 하나로 묶어서 표현을 하고 싶은 HStack에 묶어서 사용하면 가능할 수 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654406973059&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let leftBtn = Button(action: { print(&quot;is Left Btn&quot;) }) {
            Image(systemName: &quot;bell&quot;).imageScale(.large)
        }
        
        let rightBtn = Button(action: { print(&quot;is Right Btn&quot;) }) {
            Image(systemName: &quot;gear&quot;).imageScale(.large)
        }
        let makeTrailing = HStack {
            leftBtn
            rightBtn
        }
        
        return NavigationView {
            Text(&quot;ContentView 01&quot;)
                .navigationTitle(&quot;HoonIOS&quot;)
                .navigationBarTitleDisplayMode(.inline)
                .navigationBarItems(leading: leftBtn, trailing: makeTrailing)
    	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 makeTrailing의 HStack타입 변수에 넣어주면 두 개의 아이템을 한 번에 묶어서 표현되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;내비게이션 링크를 통해 다른 화면 이동&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;내비게이션 링크는 특정 이벤트를 통해 다른 화면으로 이동할 때 사용하는 메서드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;뭐... 음...&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 UIKit에서 pushViewController 메서드라고 생각하면 쉽습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;뷰를 추가하여 내비게이션 계층 구조에 스택을 추가하는 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1654408104251&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;NavigationView {
    NavigationLink(destination: Text(&quot;Welcome!\n is Another View!&quot;)) {
        Text(&quot;ContentView 02&quot;)
    }
    Text(&quot;ContentView 01&quot;)
        .navigationTitle(&quot;HoonIOS&quot;)
        .navigationBarTitleDisplayMode(.inline)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면_기록_2022-06-05_오후_2_47_53_AdobeCreativeCloudExpress.gif&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujSey/btrD2GV7UA0/srgCdPGKXq5MPxR3tFO6c1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujSey/btrD2GV7UA0/srgCdPGKXq5MPxR3tFO6c1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujSey/btrD2GV7UA0/srgCdPGKXq5MPxR3tFO6c1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ujSey/btrD2GV7UA0/srgCdPGKXq5MPxR3tFO6c1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;216&quot; height=&quot;467&quot; data-filename=&quot;화면_기록_2022-06-05_오후_2_47_53_AdobeCreativeCloudExpress.gif&quot; data-origin-width=&quot;216&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 살펴보면 ContentView 02 텍스트를 누르면 다른 뷰로 이동을 하고 그 뷰 안에는 Welcome! is Another View!라는 텍스트가 보이는 것을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지 내비게이션 뷰에 대해 살펴봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 많이 어색할 수 있지만 버튼 아이템이나 바 타이틀을 부여하는 부분에서는 더 간편하고 쉬운 거 같다는 생각이 드네요 :)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <category>ios</category>
      <category>NavigiationView</category>
      <category>SwiftUI</category>
      <category>UIkit</category>
      <category>UINavigationViewController</category>
      <category>개발자</category>
      <category>개인공부</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/122</guid>
      <comments>https://boidevelop.tistory.com/122#entry122comment</comments>
      <pubDate>Sun, 5 Jun 2022 14:55:55 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] SwiftUI에서 Button(버튼) 사용하기</title>
      <link>https://boidevelop.tistory.com/121</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SwiftUI에서 Button 사용자의 탭 이벤트를 통해 특정 작업을 할 수 있게 기본적으로 제공하는 컨트롤러입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 UIKit에서는 UIButton하고 같은 역할을 하는 친구라고 생각을 하시면 더 이해하기 쉬우실 거 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플 공식문서에서는 어떻게 정의하고 있는지 한번 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-28 오후 3.53.01.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n7l2j/btrDk71FWEX/RrCEqEvudoTK81WwtwEcmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n7l2j/btrDk71FWEX/RrCEqEvudoTK81WwtwEcmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n7l2j/btrDk71FWEX/RrCEqEvudoTK81WwtwEcmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn7l2j%2FbtrDk71FWEX%2FRrCEqEvudoTK81WwtwEcmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1568&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2022-05-28 오후 3.53.01.png&quot; data-origin-width=&quot;1568&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;말 그대로 행동을 이니셜라이저해 컨트롤하는 거라고 쓰여있네요, 말 그대로 행동을 컨트롤한다! 이거입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼의 생성자는 모두 2가지 매개변수를 정의를 하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 개는 버튼의 외형을 구분해주는 거고 다른 하나는 이벤트가 발생했을 때의 처리를 해주는 코드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해가 안 되실 수 있으니 아래 버튼한개를 생성해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1653721266279&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    VStack {
        Button(action: {
            print(&quot;Hello is HoonIOS&quot;)
        }, label: {
            Text(&quot;Hoons&quot;)
        })
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.01.48.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;1410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRLpj0/btrDkvoPCA1/altYFhARvgWjmKZecyE800/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRLpj0/btrDkvoPCA1/altYFhARvgWjmKZecyE800/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRLpj0/btrDkvoPCA1/altYFhARvgWjmKZecyE800/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRLpj0%2FbtrDkvoPCA1%2FaltYFhARvgWjmKZecyE800%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;1410&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.01.48.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;1410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 같이 살펴보면 버튼을 누르면 Hello is HoonIOS를 로그로 표출해달라고 했고 버튼의 Label은 Hoons로 설정을 해줘라고 코드를 부여해줬습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과 왼쪽과 같이 버튼이 표현되는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼의 제네릭 매개변수 Label에는 뷰 프로토콜을 준수하는 타입이면 무엇이든 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼의 Label을 이용해 버튼을 여러 형식으로 나눠서 적용하는 방식을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653722041739&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1.
Button(action: {
    print(&quot;Hello is HoonIOS&quot;)
}, label: {
    Text(&quot;Hoons&quot;)
})

2.
Button(action: {
    print(&quot;Hello is HoonIOS 2&quot;)
}, label: {
    Text(&quot;Hoons2&quot;)
        .padding()
        .background(Capsule().strokeBorder())
})

3.
Button(action: {
    print(&quot;Hello is HoonIOS 3&quot;)
}){
    Circle()
        .stroke(lineWidth: 2)
        .frame(width: 80, height: 80)
        .overlay(Text(&quot;Hoons3&quot;))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.29.25.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;1404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5TnTA/btrDnq0V694/b1k5j5OSAYEUSFKZsqJ7h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5TnTA/btrDnq0V694/b1k5j5OSAYEUSFKZsqJ7h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5TnTA/btrDnq0V694/b1k5j5OSAYEUSFKZsqJ7h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5TnTA%2FbtrDnq0V694%2Fb1k5j5OSAYEUSFKZsqJ7h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;1404&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.29.25.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;1404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;터치 이벤트랑 텍스트만 표현하기 위해서는 단순하게 action과 title 매개변수를 사용해서 터치 이벤트와 버튼 title을 구분해줄 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;버튼의 텍스트 주변에 백그라운드를 Capsule을 이용해서 외곽선을 그려줬습니다.&amp;nbsp;&lt;br /&gt;그럼 버튼 외각에 Radius가 적용되는 사각형이 표출되는 것을 확인할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;이번 항목은 2번 항목과는 다르게 외곽석을 먼저 그리고. overlay 메서드를 통해 그 위에 텍스트를 올려줬습니다.&amp;nbsp;&lt;br /&gt;즉 2번은 텍스트를 구성하고 background를 설정해준 반면에 3번 방식은 외곽선을 그리고 텍스트를 올려준 것입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;버튼에 이미지 넣기&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UIKit와 똑같이 SwiftUI에서 이미지를 넣을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 버튼에 시스템 이미지를 적용해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653723449326&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Button(action: {
    print(&quot;Hello is HoonIOS2&quot;)
}, label: {
    Image(systemName: &quot;arrow.clockwise.circle&quot;)
        .imageScale(.large)
        .font(.largeTitle)
})&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.38.51.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtzcFq/btrDjNpZMlA/cQcioEDfoGfYqKUGa9AEn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtzcFq/btrDjNpZMlA/cQcioEDfoGfYqKUGa9AEn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtzcFq/btrDjNpZMlA/cQcioEDfoGfYqKUGa9AEn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtzcFq%2FbtrDjNpZMlA%2FcQcioEDfoGfYqKUGa9AEn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;179&quot; height=&quot;1392&quot; data-filename=&quot;스크린샷 2022-05-28 오후 4.38.51.png&quot; data-origin-width=&quot;634&quot; data-origin-height=&quot;1392&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;위의 방식으로 label 매개변수에 Image객체를 생성해 크기와 폰트를 지정해주면 사이즈와 이미지가 버튼에 적용되는 것을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;버튼 이미지를 사용할 때 주의할 점은 버튼에 이미지를 넣으면 이미지 원본 색상을 잃어버리고 AccentColor의 색으로 뒤덮이게 됩니다.&lt;br /&gt;이럴 때는 랜더링 모드를 변경해주거나 버튼 스타일을 적용해주면 해결이 됩니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;background-color: #fefeb8; padding: 10px; border: 1px solid #f3c534;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이미지가 색상을 잃어버렸을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜더링 모드)&lt;br /&gt;&lt;span&gt;즉 이미지가 원본 색상을 잃어버리게 된다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;u&gt;&lt;b&gt;이것은 시스템이 자동으로 template모드로 적용&lt;/b&gt;&lt;/u&gt;시키기 때문에 색상을 잃어버리게 됩니다.&lt;br /&gt;&lt;br /&gt;따라서. renderingMode(. original)로 이미지를 설정해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 스타일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 스타일 수식어에는 디폴트 값으로 DefaultButtonStyle을 사용하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;PlainButtonStyle의 효과는 별도로 시각적 요소를 적용하지 않고 버튼을 누르거나 포커스 되어 있을 때 그리고 비활성화된 상태일 때만 지정된 효과를 적용하는 것입니다.&lt;br /&gt;&lt;br /&gt;만약 이미지를 색상대로 표현해주고 싶으면. buttonStyle(. PlainButtonStyle)을 적용해주면 됩니다.&lt;br /&gt;버튼 스타일에는 크게 3가지가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DefaultButtonStyle&lt;br /&gt;- 버튼 스타일 생략시 기본적으로 적용되는 값, 이 스타일은 환경에 따라 시스템이 알아서 버튼 스타일을 반영하게 됩니다.&lt;/li&gt;
&lt;li&gt;BorderlessButtonStyle&lt;br /&gt;- 기본 반영되는 스타일입니다. 콘텐츠에 미리 지정된 시각적 효과가 적용이 되고 테두리를 그리지 않습니다. &lt;br /&gt;해당 스타일은 WatchOS에서는 사용할수 없고 MacOS에서는 BorderedButtonStyle이 함께 제공이 됩니다.&lt;/li&gt;
&lt;li&gt;PlainButtonStyle&lt;br /&gt;- 모든 OS에서 사용할수 있는 버튼 스타일로 어떠한 시각적 요소가 적용되지 않는 스타일입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; font-family: Arial, 돋움, Dotum, AppleGothic, sans-serif; border-width: 0px 0px 2px 10px; word-spacing: 3px; border-bottom-style: solid; border-bottom-color: #cccccc; padding: 3px 5px; border-left-style: solid; border-left-color: #55555b; margin: 5px 0px; letter-spacing: 1px; line-height: 1.5; border-image: initial;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #5d5d5d;&quot;&gt;&lt;span style=&quot;font-size: 21px;&quot;&gt;onTapGesture 리스너&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--소제목1 끝--&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button을 통해 action을 등록하는 경우 말고도 다른 객체에게도 탭 체스처를 적용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onTapGesture 수식어를 사용하면 버튼을 이용하지 않고도 탭 기능을 구현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수식어는 어느 뷰에서나 쉽고 간단하게 추가할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onTapGesture을 어떻게 사용하는지 한번 살펴보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1653725296059&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Image(systemName: &quot;arrow.clockwise.circle&quot;)
    .imageScale(.large)
    .font(.largeTitle)
    .onTapGesture {
        print(&quot;Image onTapGesutre&quot;)
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 뷰에 onTapGesture을 등록해주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;onTapGesture 수식어는 하이라이트 애니메이션과 같은 기본 효과들은 사용할 수 없고 커스텀 버튼 스타일을 사용할수 없는 점은 주의해야 할 점입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <category>Button</category>
      <category>ios</category>
      <category>Swift</category>
      <category>SwiftUI</category>
      <category>UIBUTTON</category>
      <category>개발</category>
      <category>개인공부</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/121</guid>
      <comments>https://boidevelop.tistory.com/121#entry121comment</comments>
      <pubDate>Sat, 28 May 2022 17:12:38 +0900</pubDate>
    </item>
    <item>
      <title>[SwiftUI] Spacer란?(Spacer을 이용해서 뷰 짜기)</title>
      <link>https://boidevelop.tistory.com/120</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;안녕하세요, HoonIOS입니다.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에는 스택을 이용하여 레이아웃을 짜 봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Spacer을 이용하여 레이아웃을 구성해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 시작--&gt;&lt;/p&gt;
&lt;h3 style=&quot;box-sizing: border-box; margin-bottom: 5px; border-right-width: 0px; word-spacing: 3px; margin-top: 5px; border-bottom: #0404B4 2px solid; border-left: #0404B4 12px solid; letter-spacing: 1px; line-height: 1.5; border-top-width: 0px; margin-right: 0px; border-image: initial; padding: 3px 5px 3px 5px;&quot; data-ke-size=&quot;size23&quot;&gt;Spacer란?&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Spacer는 뷰 사이의 간격을 설정을 하거나 뷰의 크기를 확장할 때 사용되는 레이아웃입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;스택 밖에서 사용될 때는 부모 뷰가 제공하는 공간 내에 최대의 크기로 확장이 되고 하나의 뷰로 사용이 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 Spacer는 그때그때 크기가 달라지게 되겠죠?&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;HStack, VStack에서 사용을 할 때는 시각적 요소가 제외되고 단지 공간을 차지하기 위한 역할로만 기능을 합니다. 만약 아무 콘텐츠 없이 혼자 단독으로 사용하게 되면은 뷰가 없는 거처럼 사용이 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 Stack안에 색깔이 빨간색인 Spacer을 넣어주면 어떻게 표현이 될까요?&lt;/p&gt;
&lt;pre id=&quot;code_1650785515594&quot; class=&quot;maxima&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    HStack{
        Spacer().background(Color.red)

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.31.18.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;816&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d19Zf2/btrAj4mdRmS/Z5tCOREaeDhewz9LTGWEbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d19Zf2/btrAj4mdRmS/Z5tCOREaeDhewz9LTGWEbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d19Zf2/btrAj4mdRmS/Z5tCOREaeDhewz9LTGWEbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd19Zf2%2FbtrAj4mdRmS%2FZ5tCOREaeDhewz9LTGWEbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;816&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.31.18.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;816&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;!--머릿말 끝--&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stack안에 사용하면 왼쪽과 같이 아무 콘텐츠 없이 혼자 단독으로 사용되어 뷰가 없는 거처럼 사용이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 Stack안에 Spacer와 다른 콘텐츠가 있을 때 어떻게 표현이 되는지 한번 확인해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650786612003&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var body: some View {
    HStack {
        Spacer().background(Color.red)
        Text(&quot;Text&quot;).font(.largeTitle).background(Color.blue)
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.50.37.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;1166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddDqn0/btrAh9uPrNs/1n5weInQWuSPtfJ8cPTUO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddDqn0/btrAh9uPrNs/1n5weInQWuSPtfJ8cPTUO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddDqn0/btrAh9uPrNs/1n5weInQWuSPtfJ8cPTUO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddDqn0%2FbtrAh9uPrNs%2F1n5weInQWuSPtfJ8cPTUO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;434&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.50.37.png&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;1166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 살펴보면 Spacer에 배경색을 Red로 지정을 해도 무시한 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Spacer는 시각적 효과를 준 것은 모두 적용되지 않습니다.&lt;/li&gt;
&lt;li&gt;Spacer을 줌으로써 텍스트가 한가운데에 위치해있지 않고 가장 우측으로 이동한 것을 확인할 수 있습니다.&lt;br /&gt;즉 Spacer는 텍스트뷰 크기를 제외한 나머지 공간을 모두 차지한 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정확하게 Spacer가 얼마큼 차지하는지 스택에 대한 background 색깔을 지정해주겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.55.27.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;1008&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJ49X/btrAlheAohM/W01O91YkTGUVzHlLKTovyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJ49X/btrAlheAohM/W01O91YkTGUVzHlLKTovyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJ49X/btrAlheAohM/W01O91YkTGUVzHlLKTovyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJ49X%2FbtrAlheAohM%2FW01O91YkTGUVzHlLKTovyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;438&quot; data-filename=&quot;스크린샷 2022-04-24 오후 4.55.27.png&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;1008&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HStack에 대한 백그라운드 색깔을 초록색으로 지정해줬습니다.&lt;br /&gt;결과를 봤을 때 Text뷰에 해당하는 부분을 제외하고는 초록색으로 모두 변한 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;즉, Spacer가 차지하는 공간은 초록색으로 색칠한 부분과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer의 크기를 지정해줄 수 없냐고요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;당연히 지정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer 구조체가 어떻게 되어 있는지 확인해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1650787189988&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Struct Spacer {
	var minLength: CGFloat?
    init(minLength: CGFloat? = nil)
    typealias Body = Never
}

extension Spacer: View {}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer의 init을 보면 크기를 설정해주면 해당 크기만큼 콘텐츠의 간격을 지정해주고 만약 설정하지 않으면 뷰의 간격에 따라 알아서 조절하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650787414456&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HStack {
    Text(&quot;Left Text&quot;).font(.largeTitle).background(Color.red)
    Spacer(minLength:100)
    Text(&quot;Right Text&quot;).font(.largeTitle).background(Color.blue)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.03.45.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;1004&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IRgRE/btrAj4NjZjO/PFoZciSqykz7fKOJew8q4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IRgRE/btrAj4NjZjO/PFoZciSqykz7fKOJew8q4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IRgRE/btrAj4NjZjO/PFoZciSqykz7fKOJew8q4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIRgRE%2FbtrAj4NjZjO%2FPFoZciSqykz7fKOJew8q4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;434&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.03.45.png&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;1004&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spacer 특성상 사용 가능한 공간과 뷰의 크기에 따라 간격을 알아서 조절하게 되는데 minLength값을 지정하게 되면 콘텐츠 간의 최소 간격을 지정할 수 있게 됩니다.&lt;br /&gt;&lt;br /&gt;즉, 더 크게 늘을 수는 있지만 간격이 더 좁아질 수는 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer의 길이도 지정해줄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650787769881&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HStack {
    Text(&quot;Left Text&quot;).font(.largeTitle).background(Color.red)
    Spacer().frame(width:100)
}.background(Color.green)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.09.39.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;1012&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vYesC/btrAeOFcqi4/kLANkzUkLcQgEo5xavM7E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vYesC/btrAeOFcqi4/kLANkzUkLcQgEo5xavM7E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vYesC/btrAeOFcqi4/kLANkzUkLcQgEo5xavM7E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvYesC%2FbtrAeOFcqi4%2FkLANkzUkLcQgEo5xavM7E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;436&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.09.39.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;1012&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spacer의 넓이를 100으로 지정해줌으로써 가로 한 줄을 모두 차지하는 게 아니라 길이가 100만큼 차지하는 것을 확인할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer을 이용하면 아래와 같이 쉬운 뷰를 구성할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1650788322277&quot; class=&quot;swift&quot; data-ke-language=&quot;swift&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; VStack {
        Text(&quot;1번째&quot;).font(.largeTitle)
        Text(&quot;2번째&quot;).font(.headline).foregroundColor(Color.blue)
        Spacer()
        Text(&quot;3번째&quot;)
        Spacer()
        Spacer()
        Spacer()
        Text(&quot;4번째&quot;).font(.body)
    }
    .font(.title)
    .frame(width: 200, height: 400)
    .padding()
    .border(Color.red, width: 3)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.18.57.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxVYS7/btrAjpKXfxv/YrdIwh4sfE8gHckyAuHKDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxVYS7/btrAjpKXfxv/YrdIwh4sfE8gHckyAuHKDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxVYS7/btrAjpKXfxv/YrdIwh4sfE8gHckyAuHKDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxVYS7%2FbtrAjpKXfxv%2FYrdIwh4sfE8gHckyAuHKDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2022-04-24 오후 5.18.57.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Spacer는 개수만큼 크기를 분할하여 나눌 수 있어 원하는 위치에 원하는 개수만큼 넣어주면 m/n의 비율만큼 구성을 해줄 수 있어 레이아웃을 구성하기에는 더 편리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Spacer을 이용하면 정말 편리하고 쉽게 레이아웃을 짤 수 있는 것을 볼 수 있습니다. :)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀 더 다양한 HStack, VStack, ZStack을 통해서 테스트해보고 다양하게 구성해보시면 좋을 것 같네요 ㅎㅎ&lt;/p&gt;</description>
      <category>swiftUI시작기</category>
      <author>HoonIOS</author>
      <guid isPermaLink="true">https://boidevelop.tistory.com/120</guid>
      <comments>https://boidevelop.tistory.com/120#entry120comment</comments>
      <pubDate>Sun, 24 Apr 2022 17:24:26 +0900</pubDate>
    </item>
  </channel>
</rss>