<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Serhii Kharauzov on Medium]]></title>
        <description><![CDATA[Stories by Serhii Kharauzov on Medium]]></description>
        <link>https://medium.com/@sergkharauzov?source=rss-435333b617b0------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*ev6pLyEvdjInzlqTOnPrcQ.jpeg</url>
            <title>Stories by Serhii Kharauzov on Medium</title>
            <link>https://medium.com/@sergkharauzov?source=rss-435333b617b0------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Wed, 06 May 2026 14:56:35 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@sergkharauzov/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[The power of child ViewControllers in iOS]]></title>
            <link>https://medium.com/@sergkharauzov/the-power-of-child-viewcontrollers-in-ios-da3d58f5a9fe?source=rss-435333b617b0------2</link>
            <guid isPermaLink="false">https://medium.com/p/da3d58f5a9fe</guid>
            <category><![CDATA[ui]]></category>
            <category><![CDATA[animation]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Serhii Kharauzov]]></dc:creator>
            <pubDate>Wed, 25 Mar 2020 16:31:20 GMT</pubDate>
            <atom:updated>2020-03-25T16:31:20.565Z</atom:updated>
            <content:encoded><![CDATA[<p>Little chance that you will find iOS developer, who hasn’t heard about <strong>child view controllers</strong>. But this undervalued functional remains not very popular in daily usage, while creating custom and complex interfaces.</p><p>The main <strong>benefits</strong> of using child view controllers:</p><ol><li>Child view controllers are self-contained and independent from parent controller. They have own internal business logic and interface construction.</li><li>They have the same access to lifecycle events(viewDidLoad, viewWillAppear) as their parent controller. What might be convenient for many cases.</li><li>When using child view controllers as separate pieces of interfaces, they aren’t strongly coupled in the screen. It’s easy to replace one child controller on another.</li></ol><p>Good candidates for considering this pattern are:</p><ul><li>view controller with embedded scrolling list, that contain many different complex blocks (f.e. feed screen)</li><li>custom views, that can be presented as subviews in view controller (f.e. alert)</li><li>view controller that can be divided visually into separate blocks with own business logic (<strong>see my own example below</strong>)</li></ul><p>I’m writing this article to show the benefits of this pattern on real example.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/450/1*gkJU2DszY33Dm3urAxSdfg.gif" /><figcaption>Visual presentation of result</figcaption></figure><p><strong>Note: </strong>In this article, I’m concentrating the attention on how to struct custom interfaces in a complex hierarchy of views from the architectural point. I will skip explanations for implementations of interfaces, <a href="https://medium.com/@sergkharauzov/make-draggable-uiviewcontroller-with-swipe-cards-using-custom-transitions-in-ios-c96f581639e0">animations and dragging</a>.</p><p>Let’s assume, that we have a task to create a profile screen, that contains different information about the user and also contains personalised suggested information. Design looks like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*-29j2IhLMggNe7b2I1I2aw.png" /><figcaption>Profile screen</figcaption></figure><p>Visually we can divide the screen into 3 separate parts, each of them containing own data, business and server logic. One of the variants is to implement it via custom UIView classes. And keep all logic inside one view controller or/and inside those views as well. But just imagine, how massive view controller we will get finally 🤔 And even more, what if client or designer decides to add an extra one or two cards later 🤯</p><p>The rescuer here is an injection of child view controllers which lie perfectly on this UI/UX case. We will use one parent view controller that will be responsible for keeping three other child controllers:</p><ol><li>Child controller for the top part (short profile info like avatar and name)</li><li>Child controller for the list of activity information (yellow card)</li><li>Child controller for the feed with recommendations (white card)</li></ol><p>In order to add or remove child controllers to the parent we would need two straightforward helping methods:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/dc479512850aa497751f112ec9fc1fa4/href">https://medium.com/media/dc479512850aa497751f112ec9fc1fa4/href</a></iframe><p>add() method adds the child to the parent view controller. Then adds the view of the child to the view of the parent. Eventually, it notifies the child that it was moved to a parent.</p><p>remove() method notifies the child that it’s about to be removed. Then, removes the child from its parent. Eventually, it removes the view of child from the parent’s view.</p><p>Parent view controller ProfileViewController will be subclassed from CardsHolderViewController , which contains implemented logic to handle opening, closing and dragging of the cards.</p><p>The approach to constructing such interfaces is very simple. We have 3 views inside CardsHolderViewController.view : <em>topView, cardView1</em>, <em>cardView2. </em>During the initialisation of the screen, we’re setting initial frames for them. Each of these views will be responsible for keeping own child view controller, assigned from ProfileViewController.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a2225e0a9882a805976cd6872d5baf52/href">https://medium.com/media/a2225e0a9882a805976cd6872d5baf52/href</a></iframe><p>Then, from viewDidLoad() method of ProfileViewController we’re assigning our desired child view controllers using helping methods attached earlier in the article.</p><ol><li>ProfileShortInfoViewController for displaying avatar and name.</li><li>ProfileActivityViewController for displaying the list with activity history.</li><li>RecommendationsViewController for recommendations feed.</li></ol><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9d747fdb01a281c126b7e289bf533afc/href">https://medium.com/media/9d747fdb01a281c126b7e289bf533afc/href</a></iframe><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/53b821d970aa2d087d21f59f03b0deef/href">https://medium.com/media/53b821d970aa2d087d21f59f03b0deef/href</a></iframe><p>where methods setCardChildViewController(_) and setTopChildViewController(_) assign passing view controllers as a child, and then add the view of controller as a subview to the corresponding <em>cardView </em>or <em>topView </em>with desired frame.</p><p>That’s it 🙌. With this simple implementation, you’re getting constructed profile scene with child view controllers inside. Using interface debugging tool of Xcode, we can see a full visual hierarchy of subviews inside one scene:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*ZJd8gLN6SJowl6mFbVFGow.png" /><figcaption>Screenshot from Xcode</figcaption></figure><h4>One more thing ☝️</h4><p>You could notice in the demo presentation, that cards are draggable and some animations occur during the opening and closing of the cards. CardsDragger class is responsible for handling gesture interactions and perform corresponding actions for cards(close/open). It’s initialised inside CardsHolderViewController and observes UIPanGestureRecognizer events.</p><p>It has didOccurDraggingEvent: ((_ value: CGFloat) -&gt; Void) closure, that fires every time, when the frame of any card changes. One can use it to run own animations inside parent view controller based on cards’ states/frames. In my example, it’s an animation with avatar image and labels of top child controller.</p><h4>Conclusion</h4><p>We just saw on the real practical example, that it’s easy and convenient to construct complex screen via child view controllers using them as plugins. With this approach, it will be simpler to support and scale your code further. Of course, this is not a universal pattern, that must be applied everywhere for all screens. But I suggest to take it into consideration, when you going to implement a massive screen or when some complex pieces of the interface might be used as UI plugins in separate places in your app 😉</p><p>The full project is available on <a href="https://github.com/Kharauzov/CardsHolder">Github</a>.<br>If you have any questions or suggestions, feel free to contact me by <a href="mailto:serhii.kharauzov@gmail.com">email</a> or just leave a comment below.<br>Hope you found this article useful and inspiring. Thanks for reading 👏</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=da3d58f5a9fe" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Screen-based values in your iOS app]]></title>
            <link>https://medium.com/@sergkharauzov/screen-based-values-in-your-ios-app-29c528af3be8?source=rss-435333b617b0------2</link>
            <guid isPermaLink="false">https://medium.com/p/29c528af3be8</guid>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ui]]></category>
            <category><![CDATA[interfaces]]></category>
            <category><![CDATA[iphone]]></category>
            <category><![CDATA[ios]]></category>
            <dc:creator><![CDATA[Serhii Kharauzov]]></dc:creator>
            <pubDate>Sun, 16 Feb 2020 07:02:31 GMT</pubDate>
            <atom:updated>2020-02-16T07:02:31.394Z</atom:updated>
            <content:encoded><![CDATA[<p>Configure interfaces depending on screen size of iPhone</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rkpDlvnVzAbmGGOQDXn0Xw.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@anckor">Julian O’hayon</a> from <a href="https://unsplash.com">Unsplash</a></figcaption></figure><p>Nowadays iOS developers must support around 6 different screens sizes of iPhones. This often requires to use different values when building interfaces for smaller and bigger devices. Usually, if you’re building interface from code, it looks like this somewhere in your view class:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/89d7255ec152ca2b7f3624a02eafda4d/href">https://medium.com/media/89d7255ec152ca2b7f3624a02eafda4d/href</a></iframe><p>This bunch of if/else doesn’t look sexy, and even worse, it has a chance to expand if you need to cover other devices separately. And when you have custom UI in your app, often you would need to provide such an approach in almost all of your screens.</p><p>So I wanted to improve this situation and thus I created <strong>SBValue</strong>.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/43d176c617c7724468f744149d8b36f6/href">https://medium.com/media/43d176c617c7724468f744149d8b36f6/href</a></iframe><h4>SBValue</h4><p>This is a simple structure, that accepts values of <strong>generic</strong> type, which associate with each of the iPhone devices. After the initialization of this struct, you just need to call definedValue , and it will return a value, which corresponds to the device, that uses your app. That’s it.</p><p>You can add/customise init methods in order to fit your requirments. And you can expand it with iPads as well.</p><p>To check for the device, that uses the app, I’ve implemented a popular solution:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a2e6d3b1232148c855229a645734cd96/href">https://medium.com/media/a2e6d3b1232148c855229a645734cd96/href</a></iframe><p>Returning to previous example with ProfileView, it will look like this after injection of <strong>SBValue</strong> there:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5022e273f738bdb965e164d4e7c1ecae/href">https://medium.com/media/5022e273f738bdb965e164d4e7c1ecae/href</a></iframe><h4>In result:</h4><ul><li>less lines of code</li><li>expandable for other devices</li><li>easy to assign as a variable, when needed</li></ul><p>You might be interested to check also <a href="https://medium.com/@mikhailpanfilov/devicetype-deviceconstraint-swift-5-f5a01e97bc36">an approach</a> of my friend when you implement UI via interface builder.</p><p>If you have any questions or suggestions, feel free to contact me by <a href="mailto:serhii.kharauzov@gmail.com">email</a> or just leave a comment below.<br>Hope you found this article useful and inspiring. Thanks for reading 🙌</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/70/1*R6uflWxgB-Ht-TSSnSFLow.png" /><figcaption><a href="https://github.com/Kharauzov">https://github.com/Kharauzov</a></figcaption></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=29c528af3be8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Make draggable UIViewController with swipe cards using custom transitions in iOS]]></title>
            <link>https://medium.com/@sergkharauzov/make-draggable-uiviewcontroller-with-swipe-cards-using-custom-transitions-in-ios-c96f581639e0?source=rss-435333b617b0------2</link>
            <guid isPermaLink="false">https://medium.com/p/c96f581639e0</guid>
            <category><![CDATA[transitions]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[animation]]></category>
            <dc:creator><![CDATA[Serhii Kharauzov]]></dc:creator>
            <pubDate>Thu, 28 Feb 2019 14:14:13 GMT</pubDate>
            <atom:updated>2019-02-28T17:58:15.816Z</atom:updated>
            <content:encoded><![CDATA[<h4>How to implement interactive, distinguished interface considering possibilities of UIKit</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*OnYUWY41BX1FQiEjHsN63w.gif" /><figcaption>Presentation of result</figcaption></figure><p>There are <strong>two</strong> main things, that I will demonstrate and explain in this article:</p><p>UIKit supplies us with a short amount of built-in transitions, that we regularly use while implementing a transition from one view controller to another. The most popular are modal present and navigation push. Because of their simpleness and wide common usage, such transitions could be boring and won’t make users excited in case when app’s design is fully custom.<br>A great solution would be to use possibilities of <em>UIViewControllerAnimatedTransitioning</em> and <em>UIViewControllerInteractiveTransitioning</em> protocols that stand for creating custom interactive transitions.</p><p>The second thing is about frequently used UI component at iOS — <em>UICollectionView</em> and its cells. Usually, if talking about interaction with cells, it’s enough for us to handle clicks via didSelectItemAt method of the delegate. But I want to show, how an injection of <em>UIGestureRecognizer</em> object can increase the potential of UICollectionView cells and distinguish it from the rest of the screen’s components.</p><p><strong>Remark</strong>: I wrote this article to show the most important things and features, rather than teaching step-by-step implementation. So it assumes, that you feel confident with Swift language and know basics of UIKit.</p><h3>Let’s start from transition</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uJyq3PmYQOQ1DJ5cXsC1-A.png" /></figure><p>The project has a storyboard, that contains two view controllers. StartViewController(left) has a lot of subviews, just to show some content. But the view, that is interesting for us, has label “Open Cards View” and placed in the bottom. It will be responsible for catching gestures and presenting CardsViewController(right) by dragging or with a simple tap.<br>CardsViewController has collection view, responsible for showing cards and has few subviews to show different backgrounds based on transition’s progress.</p><p>A<strong> required</strong> thing to implement custom transition is to describe its mechanic’s rules at class, conformed to <em>UIViewControllerAnimatedTransitioning</em>.<br>For presenting transition create MiniToLargePresentingViewAnimator class, that inherits from NSObject due to <em>UIViewControllerAnimatedTransitioning</em> requirements. Also, you need to create MiniToLargeDismissingViewAnimator, responsible to provide custom dismiss transition. Both animators have pretty the same code, so let’s explore only presenting part.</p><p>MiniToLargePresentingViewAnimator has two properties: duration and initialY. With the first property, everything must be straightforward. initialY needs more attention. When the user starts dragging bottom piece of card, the next view controller is being presented and his position starts from initialY. initialY is the position of bottom card view.<br>This trick enables us to replace invisibly bottom card view with CardsViewController’s view and achieve the effect of a draggable card.<br>When CardsViewController is going to dismiss, it ended at initialY as well.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6e15833de72adbd4b101da95f7ce8e2e/href">https://medium.com/media/6e15833de72adbd4b101da95f7ce8e2e/href</a></iframe><p>Magic happens at animateTransition(using transitionContext: UIViewControllerContextTransitioning) method, where described how the transition should work. <br>1. Getting view controllers, that are involved at transition. MiniToLargeAnimatable protocol is used here to avoid access to CardsViewController explicitly.<br>2. Setting initial frame and background appearance for presenting view controller.<br>3. This step is optional in general but required in our situation. Since you’re going to use custom modalPresentationStyle and interactive presentation, view controller lifecycle does not work as expected in this case. You have to track these events yourself.<br>4. Standard animating block, used to change smoothly frame and background of subviews owned by presented view controller.</p><p>By implementing such two animators you’ll have custom transitions for presenting and dismissing of view controller. But wait, are they already interactive and you can drag bottom card? Not yet. One more class is required to make transition interactive with gestures.</p><h3>Let’s make transition interactive</h3><p>You need a new class called MiniToLargeViewInteractiveAnimator that inherits from UIPercentDrivenInteractiveTransition. The main thing, that this class does is adding a gesture recognizer to the desired view and updating of the custom transition(<strong>implemented at animators above</strong>) based on the percent of the swipe made by the user at target view.<br>Since this class is responsible for managing both present and dismiss, gesture recognizer must be added to appropriate controllers’ views.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ab96599f4d1c36ff3f1fb48b5e39d188/href">https://medium.com/media/ab96599f4d1c36ff3f1fb48b5e39d188/href</a></iframe><p>1. Store view controllers, involved in transition for later usage. Add gesture recognizer to target view based on present/dismiss case. And slow down completion of the transition by setting completionSpeed.<br>2. Removing gesture recognizer from view before deallocating animator since you don’t need it anymore. This step does not affect the transition.<br>3. Just handle all states of gesture and update custom transition based on swipe progress.<br>4. If you want to finish the transition earlier, you can check whether percent reached the threshold and call finish() method. Let’s ignore call prepareBeingDismissed() for now.<br>5. When the user ended dragging and transition was still in progress, you need to determine what to do based on shouldComplete property.</p><p>Let’s sum up what you have now. You created three classes, responsible for providing custom interactive transition: MiniToLargePresentingViewAnimator, MiniToLargeDismissingViewAnimator and MiniToLargeViewInteractiveAnimator. Now you need to figure out how to use all this stuff with our controllers.</p><h3>TransitionCoordinator</h3><p>In order to decouple CardsViewController from StartViewController due to common transition, let’s create a class, called MiniToLargeTransitionCoordinator. It conforms to <em>UIViewControllerTransitioningDelegate</em> and manages our draggable transition. StartViewController holds an instance of transitionCoordinator and calls only its two methods based on conditions.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a9f30dbae1c5f6fb52252cbbe582cdb3/href">https://medium.com/media/a9f30dbae1c5f6fb52252cbbe582cdb3/href</a></iframe><p>Method prepareViewForCustomTransition(fromViewController: StartViewController) creates required bindings and interactive animators, instantiates CardsViewController and prepares it for draggable transition. <strong>Pay attention</strong> to gestureView of animators. On present transition we want bottomTriggerView of StartViewController to be responsive on pan gesture. And on dismiss case, hole view of CardsViewController responds to gesture.<br>Method removeCustomTransitionBehaviour() is called when you want to remove the possibility to show CardsViewController, including dragging behavior. For instance, when there is no data to show.</p><p>And finally MiniToLargeTransitionCoordinator implements required methods of <em>UIViewControllerTransitioningDelegate</em> protocol. These methods will be triggered to replace default transition animation in case of present(…) or dismiss(…) calls from our view controllers.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/807d7830ff01819cd31135d9df0ac908/href">https://medium.com/media/807d7830ff01819cd31135d9df0ac908/href</a></iframe><p>The only unusual moment here is about isTransitionInProgress check condition. It’s required because custom transition could be performed without interaction via a single tap on the bottom card at StartViewController or with manual dismiss at CardsViewController. In this case, methods must return nil for <em>UIViewControllerInteractiveTransitioning</em>.</p><h3>Let’s dive into swipe UICollectionView cells</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*o7-VnG0whEX2htMKbaG3Tg.png" /></figure><p>This is how CardCollectionViewCell looks at interface builder. In reality, there’s only one container, that holds different subviews. But I split it into two for providing better visualization. The left container is called frontContentView and represents the content of certain item in array. Specifically, this view will be dragging. On the right side, there is actionsView, that provides buttons to interact with the cell and its content.<br>In order to make CardCollectionViewCell or your own cell swipeable, inherit it from SwipingCollectionViewCell, which stands for providing swiping behavior.</p><p>CardCollectionViewCell is just a plain cell, that shows info to the user. It has one optional extra method frontViewPositionChanged(on percent: CGFloat) from the parent cell, responsible to update properties of subviews while cell’s swiping is in the progress. If you don’t want any UI changes on swipe, this method could be omitted.</p><p>Also, there is required override property swipeDistanceOnY. Or, in other words — it is the height of actionsView. Using this property cell determines bounds of swipe area. There’re only two possible states of the cell during the dragging: at the initial position and at the top position.</p><p>Let’s look at SwipingCollectionViewCell implementation.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/7e769d965e13c8d78b8094281b1dfe4c/href">https://medium.com/media/7e769d965e13c8d78b8094281b1dfe4c/href</a></iframe><p>When the cell is loaded from xib file, an initial position of frontContentView is saved as it will be needed later. Then pan gesture recognizer is added via lazy property. When frontContentView will be dragging up or down, visually it will be located outside of the cell’s bounds. So it’s required to set false for clipsToBounds property, otherwise dragging view will be hidden by the bounds of the cell.</p><p>Next code will show to you what exactly is going on during the dragging of the cell:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/2c80388991708a060e72ab5ef7025117/href">https://medium.com/media/2c80388991708a060e72ab5ef7025117/href</a></iframe><p>1. When pan gesture is activated, it will have different states. The most interesting for us is .changed state. Right here progress of frontContentView movement is being calculated and based on it you update frames and other properties of cell’s subviews. <br>2. On the .ended state you determine dragging direction and manually finish the animation.<br>3.1 and 3.2 methods move frontContentView with animation to appropriate place based on conditions. The unusual thing, that you likely noticed inside both methods is <em>CADisplayLink</em>. It calls animationDidUpdate() with refresh rate of the display. <em>CADisplayLink</em> enables to react fast to all changes that occur during the animation inside UIView.animate block.<br>4. You take frontContentView frame at a specific time interval during the animation and based on this frame calculate progress of animation. Basically, it is similar to logic inside .change state of handlePanGesture() method.</p><h3>Important moment</h3><p>At this moment you have like a card draggable view controller with draggable, scrolling cards inside.<br>You need to allow different gestures to act simultaneously. Otherwise, it will be a gesture conflict leading to incorrect work of any of the components. Implementation of shouldRecognizeSimultaneouslyWith method from <em>UIGestureRecognizerDelegate</em> protocol is a solution.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/f7f84c6779e71e9bc27d59d9b48177e2/href">https://medium.com/media/f7f84c6779e71e9bc27d59d9b48177e2/href</a></iframe><h3>We’re done.</h3><p>Now you know, how interactive transitions work under the hood and how easy it’s to make swiping cells. I believe, that with these bits of knowledge more new opportunities become available and it’s simpler to highlight your app from the crowd.<br>The full project is available on <a href="https://github.com/Kharauzov/SwipeableCards">Github</a>.<br>If you have any questions or suggestions, feel free to contact me by <a href="mailto:serhii.kharauzov@gmail.com">email</a> or just leave a comment below.<br>Hope you found this article useful and inspiring. Thanks for reading!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c96f581639e0" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>