<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>10-Minute Tips to Make Your iOS App More Interactive | Infinum</title>
		<atom:link href="https://infinum.com/blog/10-minute-tips-to-make-your-ios-app-more-interactive/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/10-minute-tips-to-make-your-ios-app-more-interactive/</link>
		<description>Building digital products</description>
		<lastBuildDate>Tue, 07 Apr 2026 11:57:26 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>7928https://infinum.com/uploads/2019/07/10-minute-tips-to-make-your-iOS-app-more-interactive-0.webp</url>
				</image>
				<title>10-Minute Tips to Make Your iOS App More Interactive</title>
				<link>https://infinum.com/blog/10-minute-tips-to-make-your-ios-app-more-interactive/</link>
				<pubDate>Tue, 09 Jul 2019 14:05:00 +0000</pubDate>
				<dc:creator>Goran Brlas</dc:creator>
				<guid isPermaLink="false">https://infinum.com/the-capsized-eight/10-minute-tips-to-make-your-ios-app-more-interactive/</guid>
				<description>
					<![CDATA[<p>Most people prefer visual interfaces to command line terminals. Learn how to increase app engagement and make your app stand out!</p>
<p>The post <a href="https://infinum.com/blog/10-minute-tips-to-make-your-ios-app-more-interactive/">10-Minute Tips to Make Your iOS App More Interactive</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-187"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	What do crows like? Shiny things. Us humans are not that different, which is why most people prefer using visual interfaces instead of command line terminals.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-97'
	>
	We love good looking, fluid, modern, responsive, and touch-sensitive applications which provide feedback. We geek out over good looking animations and apps that come alive as we use them. In short, <strong>we love our apps shiny</strong>.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-100'
	>
	As developers, too often we focus on functionalities and just getting things done. If a user story or client requirement is completed and it works, we will pat ourselves on the back and call it a day. But what if we spent just a <strong>few more minutes</strong> to make things – you’ve guessed it – shinier?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-102">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-103'
	>
	This blog post will provide you with <strong>4 quick and easy ways to make your apps stand out</strong> in the sea of similar ones, and all it’s going to take is a few minutes of your time.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-105">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-106'
	>
	Waiting for the coffee to brew or the microwave to finish heating up your food? Spend those few minutes adding these into your apps, and make it easier for users to pick your app as their favourite.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-110"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-108">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-109'
	>
	Round them&nbsp;up</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-113"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-111">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-112'
	>
	Rectangles; they are everywhere. Let’s take two common UI elements to demonstrate this – the trusty <strong>button</strong> and the all-knowing, albeit non-native, <strong>progress bar.</strong> When customizing their look, we would probably come up with something like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-116"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-114"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-115">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/06/10-minute-tips-to-make-your-iOS-app-more-interactive-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="208"
															width="514"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-119"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-117">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-118'
	>
	Sure, they get the job done as best as they can; the button can be clicked and the progress bar shows the current progress (duh). However, are they any different from all other generic UI elements we see throughout the apps we are using? Not really. Let’s change this!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-122"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-120">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-121'
	>
	With just a few lines of code, we can easily make them stand out more, and make the UI itself more pleasing to the eye.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-124"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">public</span><span class="token"> </span><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">UIView</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #6a737d;">///</span><span class="token" style="color: #6a737d;"> Corner radius of view; also inspectable from Storyboard.</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">@IBInspectable</span><span class="token"> </span><span class="token">var cornerRadius:</span><span class="token"> CGFloat </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">get</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> layer.</span><span class="token">cornerRadius</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">set</span><span class="token"> </span><span class="token">(</span><span class="token">cornerRadius</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            layer.</span><span class="token">masksToBounds</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">            layer.</span><span class="token">cornerRadius</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> cornerRadius
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-127"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-125">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-126'
	>
	Since UIButton is also a type of UIView, no additional code is necessary to make our button rounded as well. All we have to do is set the proper corner radius in the storyboard. After applying this small change, our <strong>rounded UI</strong> looks much nicer and, dare I say, <em>shinier</em>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-128"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-129">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2019/06/10-minute-tips-to-make-your-iOS-app-more-interactive-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="204"
															width="510"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-133"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-131">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-132'
	>
	Feedback is important</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-136"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-134">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-135'
	>
	Apple started taking device vibrations more seriously when they removed the home button from the iPhone 7 and 7 Plus. The various haptic signals needed for all the actions in this new buttonless device required Apple to build a 2nd generation of the Taptic Engine, as well as several frameworks in a bundle called <strong>Haptic Feedback</strong> to easily use this new technology. These frameworks are available from iOS 10, which in 2019 means most of your target audience’s devices support it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-139"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-137">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-138'
	>
	There are three main types of feedback generators that we can use:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-142"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-140">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-141'
	>
	<li><strong>UISelectionFeedbackGenerator</strong> indicates that the selection is actively changing. This feedback type is intended for communicating movement through a series of discrete values. Apple uses it throughout the system (e.g. toggle, picker wheel etc.) and if you provide a custom way for users to pick or select something, you should probably be using it as well.</li><li><strong>UINotificationFeedbackGenerator</strong> should notify the user that a task or action, such as making a payment or saving to a database, have completed, along with the completion state which should be obvious without looking at the screen. It has three variations:&nbsp;<code>.success</code>,&nbsp;<code>.warning</code>, and&nbsp;<code>.error</code>, which should be used accordingly.</li><li><strong>UIImpactFeedbackGenerator</strong> provides a physical means of complementing the visual experience. For example, the user might feel a thud when a view slides into place or two objects collide. Same as <em>UINotificationFeedbackGenerator</em>, this one also has three variations:&nbsp;<code>.light</code>,&nbsp;<code>.medium</code>, and&nbsp;<code>.heavy</code>.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-145"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-143">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-144'
	>
	Haptic signals are a great way to complement an app’s interface and create a stunning user experience overall. In addition, iOS 13 expands on this with the ability to create your own feedback patterns, which could result in interesting ways of interacting with our phones.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-148"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-146">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-147'
	>
	One thing to keep in mind is that you shouldn’t go overboard and make the device vibrate at all times. As uncle Ben said in the first Spider-man movie, <em>”With great power comes great responsibility”</em>, so use haptic feedback wisely and with purpose.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-149">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-150'
	>
	Ups and&nbsp;downs</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-154"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-152">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-153'
	>
	Following along with the theme of notifying users of their actions, let’s switch from haptic to <strong>visual feedback</strong>. We’ve all used buttons inside our applications – when we press them, some action occurs. If we use Apple’s default buttons, they change the colour a bit, which notifies us something’s happened. Although subtle, the effect serves its purpose rather great. But why stop at that – why not make it look even better?&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-157"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-155">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-156'
	>
	What we can do here is implement button scaling when it’s highlighted, which (subjectively) looks a lot better. The code for that is pretty straightforward:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">class AnimatedButton</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">RoundButton </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">override</span><span class="token"> </span><span class="token">var isHighlighted:</span><span class="token"> </span><span class="token" style="color: #005cc5;">Bool</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">didSet</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">let transform:</span><span class="token"> CGAffineTransform </span><span class="token" style="color: #d73a49;">=</span><span class="token"> isHighlighted </span><span class="token" style="color: #d73a49;">?</span><span class="token"> .</span><span class="token" style="color: #d73a49;">init</span><span class="token">(</span><span class="token">scaleX:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.95</span><span class="token">, </span><span class="token">y:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.95</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">:</span><span class="token"> .</span><span class="token" style="color: #005cc5;">identity</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">animate(</span><span class="token">transform</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">AnimatedButton</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token">func animate</span><span class="token">(</span><span class="token">_ transform</span><span class="token">: </span><span class="token">CGAffineTransform</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        UIView.</span><span class="token">animate(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">withDuration:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.4</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">delay:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">usingSpringWithDamping:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.5</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">initialSpringVelocity:</span><span class="token"> </span><span class="token" style="color: #005cc5;">3</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">options:</span><span class="token"> [.</span><span class="token">curveEaseInOut</span><span class="token">],
</span></span><span class="line"><span class="token">            </span><span class="token">animations:</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">self</span><span class="token">.</span><span class="token">transform</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> transform
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-161'
	>
	As you can notice, we have also used our <em>RoundButton</em> created before. They fit together perfectly, and this is what it looks like in action:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-163"
	 data-media-type='video'>

	<div class="video__wrapper" data-id="es-164">
		<video
		class="video block-media__video js-video js-block-media-video video--cursor-takeover-use"
		 loop autoplay playsinline muted preload='metadata'>
		<source  src='https://infinum.com/uploads/2019/07/10-minute-tips-to-make-your-ios-app-more-interactive-3.mp4' type='video/mp4' />	</video>
	</div></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-166">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-167'
	>
	You can also do something similar for the tab bar items in the <em>UITabBarControllerDelegate’s tabBarController(_&nbsp;: didSelect:)</em> method. It looks really nice and provides a visual pop. For bonus points, add selection haptic feedback for a well-rounded user experience.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-169"
	 data-media-type='video'>

	<div class="video__wrapper" data-id="es-170">
		<video
		class="video block-media__video js-video js-block-media-video video--cursor-takeover-use"
		 loop autoplay playsinline muted preload='metadata'>
		<source  src='https://infinum.com/uploads/2019/07/10-minute-tips-to-make-your-ios-app-more-interactive-4.mp4' type='video/mp4' />	</video>
	</div></div></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-172">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-173'
	>
	Tab sliding</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-175">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-176'
	>
	Last but not least, we will return to our tab bar controller for a moment. When we tap on the bar items, their respective view controllers come into focus. Good thing about Apple’s implementation of this is that their state is preserved when switching. However, the result is slightly basic-looking, which we don’t want. Why not switch it up a bit and improve the looks of this, too?&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-180"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-178">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-179'
	>
	All we need are a few lines of code to <strong>animate the transition of our view controllers</strong>:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-182"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">TabBarController</span><span class="token">:</span><span class="token"> </span><span class="token" style="color: #6f42c1;">UITabBarControllerDelegate </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func tabBarController</span><span class="token">(</span><span class="token">_ tabBarController</span><span class="token">: </span><span class="token">UITabBarController</span><span class="token">, </span><span class="token">shouldSelect viewController</span><span class="token">: </span><span class="token">UIViewController</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">Bool</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">guard</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">let</span><span class="token"> tabViewControllers </span><span class="token" style="color: #d73a49;">=</span><span class="token"> tabBarController.viewControllers,
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">let</span><span class="token"> targetIndex </span><span class="token" style="color: #d73a49;">=</span><span class="token"> tabViewControllers.</span><span class="token">firstIndex(</span><span class="token">of:</span><span class="token"> viewController</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">let</span><span class="token"> targetView </span><span class="token" style="color: #d73a49;">=</span><span class="token"> tabViewControllers</span><span class="token">[</span><span class="token">targetIndex</span><span class="token">]</span><span class="token">.</span><span class="token" style="color: #005cc5;">view</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">let</span><span class="token"> currentViewController </span><span class="token" style="color: #d73a49;">=</span><span class="token"> selectedViewController,
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">let</span><span class="token"> currentIndex </span><span class="token" style="color: #d73a49;">=</span><span class="token"> tabViewControllers.</span><span class="token">firstIndex(</span><span class="token">of:</span><span class="token"> currentViewController</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token" style="color: #d73a49;">else</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token"> </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">if</span><span class="token"> currentIndex </span><span class="token" style="color: #d73a49;">!=</span><span class="token"> targetIndex </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">animateToView(</span><span class="token">targetView</span><span class="token">, </span><span class="token">at:</span><span class="token"> targetIndex</span><span class="token">, </span><span class="token">from:</span><span class="token"> currentViewController.</span><span class="token" style="color: #005cc5;">view</span><span class="token">, </span><span class="token">at:</span><span class="token"> currentIndex</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">return</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">private</span><span class="token"> </span><span class="token" style="color: #d73a49;">extension</span><span class="token"> </span><span class="token" style="color: #6f42c1;">TabBarController</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">func animateToView</span><span class="token">(</span><span class="token">_ toView</span><span class="token">: </span><span class="token">UIView</span><span class="token">, </span><span class="token">at toIndex</span><span class="token">: </span><span class="token" style="color: #005cc5;">Int</span><span class="token">, </span><span class="token">from fromView</span><span class="token">: </span><span class="token">UIView</span><span class="token">, </span><span class="token">at fromIndex</span><span class="token">: </span><span class="token" style="color: #005cc5;">Int</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Position toView off screen (to the left/right of fromView)</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">let</span><span class="token"> screenWidth </span><span class="token" style="color: #d73a49;">=</span><span class="token"> UIScreen.</span><span class="token">main</span><span class="token">.</span><span class="token">bounds</span><span class="token">.</span><span class="token" style="color: #005cc5;">size</span><span class="token">.</span><span class="token">width</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #d73a49;">let</span><span class="token"> offset </span><span class="token" style="color: #d73a49;">=</span><span class="token"> toIndex </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> fromIndex </span><span class="token" style="color: #d73a49;">?</span><span class="token"> screenWidth </span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token">screenWidth
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        toView.</span><span class="token">frame</span><span class="token">.</span><span class="token">origin</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">CGPoint(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">x:</span><span class="token"> toView.</span><span class="token">frame</span><span class="token">.</span><span class="token">origin</span><span class="token">.</span><span class="token">x</span><span class="token"> </span><span class="token" style="color: #d73a49;">+</span><span class="token"> offset</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">y:</span><span class="token"> toView.</span><span class="token">frame</span><span class="token">.</span><span class="token">origin</span><span class="token">.</span><span class="token">y</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        fromView.</span><span class="token">superview</span><span class="token" style="color: #d73a49;">?</span><span class="token">.</span><span class="token">addSubview(</span><span class="token">toView</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Disable interaction during animation</span><span class="token">
</span></span><span class="line"><span class="token">        view.</span><span class="token">isUserInteractionEnabled</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">        UIView.</span><span class="token">animate(</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">withDuration:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.5</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">delay:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.0</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">usingSpringWithDamping:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.75</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">initialSpringVelocity:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0.5</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">options:</span><span class="token"> .</span><span class="token">curveEaseInOut</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">animations:</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Slide the views by -offset</span><span class="token">
</span></span><span class="line"><span class="token">                fromView.</span><span class="token">center</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">CGPoint(</span><span class="token">x:</span><span class="token"> fromView.</span><span class="token">center</span><span class="token">.</span><span class="token">x</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token"> offset</span><span class="token">, </span><span class="token">y:</span><span class="token"> fromView.</span><span class="token">center</span><span class="token">.</span><span class="token">y</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">                toView.</span><span class="token">center</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token">CGPoint(</span><span class="token">x:</span><span class="token"> toView.</span><span class="token">center</span><span class="token">.</span><span class="token">x</span><span class="token"> </span><span class="token" style="color: #d73a49;">-</span><span class="token"> offset</span><span class="token">, </span><span class="token">y:</span><span class="token"> toView.</span><span class="token">center</span><span class="token">.</span><span class="token">y</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token">            </span><span class="token">completion:</span><span class="token"> </span><span class="token">{</span><span class="token"> </span><span class="token" style="color: #005cc5;">_</span><span class="token"> </span><span class="token" style="color: #d73a49;">in</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #6a737d;">//</span><span class="token" style="color: #6a737d;"> Remove the old view from the tabbar view.</span><span class="token">
</span></span><span class="line"><span class="token">                fromView.</span><span class="token">removeFromSuperview(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">self</span><span class="token">.</span><span class="token">selectedIndex</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> toIndex
</span></span><span class="line"><span class="token">                </span><span class="token" style="color: #005cc5;">self</span><span class="token">.</span><span class="token" style="color: #005cc5;">view</span><span class="token">.</span><span class="token">isUserInteractionEnabled</span><span class="token"> </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">true</span><span class="token">
</span></span><span class="line"><span class="token">            </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">        </span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-183">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-184'
	>
	After doing this, our tab switching should have a fresh new look, like in the example below:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-190"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-188"
	 data-media-type='video'>

	<div class="video__wrapper" data-id="es-189">
		<video
		class="video block-media__video js-video js-block-media-video video--cursor-takeover-use"
		 loop autoplay playsinline muted preload='metadata'>
		<source  src='https://infinum.com/uploads/2019/07/10-minute-tips-to-make-your-ios-app-more-interactive-5.mp4' type='video/mp4' />	</video>
	</div></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-205"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-191">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-192">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-193'
	>
	Wrapping it up</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-195">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-196'
	>
	If you’re underwhelmed when using applications with bland interfaces, you shouldn’t be satisfied with creating them either. Sudden UI changes or no feedback on inputs could result in users thinking they might have done something wrong or question whether anything is happening under the hood at all.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-200"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-198">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-199'
	>
	Listed above are just some of the ways you can increase app engagement and make it stand out. The best thing is they are so easy to execute and so helpful in capturing the attention of users!</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-203"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-201">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-202'
	>
	Got any tips &amp; tricks of your own? Feel free to leave them in the comments below, we’re always eager to learn new things.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/10-minute-tips-to-make-your-ios-app-more-interactive/">10-Minute Tips to Make Your iOS App More Interactive</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>