<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2024-12-24T11:20:25+00:00</updated><id>/feed.xml</id><title type="html">cattus’s diary</title><subtitle>A Web Developer&apos;s Honest Journal.</subtitle><entry><title type="html">[Web] ios에서 발생하는 이슈 모음</title><link href="/web/ios/2023/05/21/ios-issues.html" rel="alternate" type="text/html" title="[Web] ios에서 발생하는 이슈 모음" /><published>2023-05-21T00:43:28+00:00</published><updated>2023-05-21T00:43:28+00:00</updated><id>/web/ios/2023/05/21/ios-issues</id><content type="html" xml:base="/web/ios/2023/05/21/ios-issues.html"><![CDATA[<h1 id="1-ios-에서-overflow-hidden-과-border-radius-가-동작하지-않는-이슈">1. ios 에서 overflow: hidden 과 border-radius 가 동작하지 않는 이슈</h1>

<p>ios 낮은 버전에서 발생하는 이슈입니다. <code class="language-plaintext highlighter-rouge">overflow: hidden</code> 인 요소에 적용되어있는 <code class="language-plaintext highlighter-rouge">border-radius</code> 가 동작하지 않는 경우가 있습니다.</p>

<h2 id="해결방안">해결방안</h2>

<p><code class="language-plaintext highlighter-rouge">overflow: hidden; border-radius</code> 를 적용할 엘리먼트에 추가로 아래 스타일(<code class="language-plaintext highlighter-rouge">-webkit-mask-image: -webkit-radial-gradient(white, black);</code> ) 적용하면 해결됩니다.</p>

<figure class="highlight"><pre><code class="language-css" data-lang="css"><span class="o">//</span> <span class="nt">Add</span> <span class="nt">on</span> <span class="nt">element</span> <span class="nt">with</span> <span class="nt">overflow</span>
<span class="nt">-webkit-mask-image</span><span class="o">:</span> <span class="nt">-webkit-radial-gradient</span><span class="o">(</span><span class="nt">white</span><span class="o">,</span> <span class="nt">black</span><span class="o">);</span></code></pre></figure>

<h1 id="2-ios-에서-합성어-입력-시-이전-문자열이-입력되는-경우">2. ios 에서 합성어 입력 시, 이전 문자열이 입력되는 경우</h1>

<p>채팅 입력 기능을 개발할 때, 메시지를 입력하고 전송 버튼을 눌러도 input 태그의 포커스가 유지되도록 구현하는 경우가 있습니다. 이는 키패드가 내려가는 것을 방지하기 위한 방식입니다. 그러나 이 경우 새로운 텍스트를 입력할 때 이전에 전송된 텍스트와 합쳐지는 문제가 발생할 수 있습니다. 이 문제를 해결하려면 iOS에서 한글과 같은 조합형 언어가 입력되는 방식을 이해해야 합니다.</p>

<h2 id="ios에서-한글-입력-과정">iOS에서 한글 입력 과정</h2>

<p>iOS에서 한글과 같은 조합형 언어를 입력할 때는, 글자가 완성되기 전까지 입력된 부분을 버퍼에 저장합니다. 예를 들어, <strong>“각”</strong>을 입력한다고 가정해봅시다.</p>

<p>사용자가 “가”를 입력하면, “가”는 버퍼에 저장됩니다.
이후, 사용자가 “ㄱ”을 입력하면, 버퍼에 있던 “가”를 삭제하고 받침 “ㄱ”을 추가해 “각”이 완성됩니다.
이 과정은 input 요소에 이벤트 리스너를 추가하면 확인할 수 있습니다.</p>

<h2 id="이슈의-원인">이슈의 원인</h2>

<p>채팅 입력 시 포커스를 강제로 유지하려고 하면, 한글 입력 과정에서 버퍼에 저장된 글자가 조합되는 도중에 원치 않은 입력 동작이 발생할 수 있습니다. 즉, 이전 텍스트가 지워지지 않고 새로운 텍스트와 합쳐지는 문제가 생깁니다.</p>

<h2 id="해결-방법">해결 방법</h2>

<p>이 문제를 해결하려면 보이지 않는 input 요소를 활용해 조합 과정이 완료된 후 포커스를 전환하는 방법을 사용할 수 있습니다:</p>

<p>사용자가 텍스트 입력을 완료하여 조합이 종료되면, 보이지 않는 input 요소로 포커스를 이동시킵니다.
이후, 다시 원래의 input 요소로 포커스를 복원합니다.
이 방식은 한글 조합 과정에서 발생하는 입력 충돌 문제를 방지하면서도 포커스를 유지해 키패드가 내려가는 것을 방지할 수 있습니다.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;input</span> <span class="na">style=</span><span class="s">"width: 1px; height: 1px; z-index: -1"</span> <span class="na">(focus)=</span><span class="s">"onFocusBlankInput()"</span> <span class="na">#blankInput</span> <span class="nt">/&gt;</span>
</code></pre></div></div>

<div class="language-tsx highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">send</span><span class="p">():</span> <span class="k">void</span> <span class="p">{</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">blankInput</span><span class="p">?.</span><span class="nx">nativeElement</span><span class="p">.</span><span class="nx">focus</span><span class="p">();</span>
	<span class="c1">// ...</span>
<span class="p">}</span>

<span class="nx">onFocusBlankInput</span><span class="p">():</span> <span class="k">void</span> <span class="p">{</span>
  <span class="k">this</span><span class="p">.</span><span class="nx">messageInput</span><span class="p">?.</span><span class="nx">nativeElement</span><span class="p">.</span><span class="nx">focus</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<h1 id="3-unload-beforeunload-pagehide-visibilitychange-관련-이슈">3. unload, beforeunload, pagehide, visibilitychange 관련 이슈</h1>

<h1 id="4-유저스크롤-도중-문서-조작시-발생하는-이슈">4. 유저스크롤 도중 문서 조작시 발생하는 이슈</h1>

<h1 id="5-ios-input-focus-되지-않는-이슈">5. ios input focus 되지 않는 이슈</h1>

<p>유저 인터랙션 없이 focus 불가능. 하지만 이미 다른 input 에 포커스 되어있었다면 그걸 옮기는건 가능</p>

<h1 id="6-자동재생이-되지-않는-경우">6. 자동재생이 되지 않는 경우</h1>

<h1 id="7-하단-노치-대응">7. 하단 노치 대응</h1>

<h1 id="8-and-와-가상-키보드-동작-차이--채팅창과-컨텐츠-함께-보는-방법">8. and 와 가상 키보드 동작 차이 &amp; 채팅창과 컨텐츠 함께 보는 방법</h1>]]></content><author><name></name></author><category term="web" /><category term="ios" /><summary type="html"><![CDATA[1. ios 에서 overflow: hidden 과 border-radius 가 동작하지 않는 이슈]]></summary></entry></feed>