Full Code of Juanpe/SkeletonView for AI

main 30c92f099288 cached
165 files
530.4 KB
149.0k tokens
1 requests
Download .txt
Showing preview only (581K chars total). Download the full file or copy to clipboard to get everything.
Repository: Juanpe/SkeletonView
Branch: main
Commit: 30c92f099288
Files: 165
Total size: 530.4 KB

Directory structure:
gitextract_9ngk7ec7/

├── .codebeatsettings
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feedback.md
│   │   └── submit-a-request.md
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   └── workflows/
│       ├── CD.yml
│       ├── main.yml
│       ├── needs-attention.yml
│       ├── pod_lib_lint.yml
│       ├── pod_trunk.yml
│       ├── release.yml
│       ├── release_notes.yml
│       ├── stale.yml
│       └── validations.yml
├── .gitignore
├── .swift-version
├── .swiftlint.yml
├── .swiftpm/
│   └── xcode/
│       └── package.xcworkspace/
│           └── contents.xcworkspacedata
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dangerfile.swift
├── Examples/
│   ├── CollectionView/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── avatar.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── picture.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── CollectionViewCell.swift
│   │   ├── Main.storyboard
│   │   ├── SkeletonViewExampleCollectionview-Info.plist
│   │   └── ViewController.swift
│   ├── iOS Example/
│   │   ├── Sources/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AccentColor.colorset/
│   │   │   │   │   └── Contents.json
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   ├── Contents.json
│   │   │   │   └── avatar.imageset/
│   │   │   │       └── Contents.json
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Cell.swift
│   │   │   ├── Constants.swift
│   │   │   ├── HeaderFooterSection.swift
│   │   │   ├── Info.plist
│   │   │   ├── UITextViewByCodeViewController.swift
│   │   │   └── ViewController.swift
│   │   └── iOS Example.xcodeproj/
│   │       ├── project.pbxproj
│   │       └── project.xcworkspace/
│   │           ├── contents.xcworkspacedata
│   │           └── xcshareddata/
│   │               └── IDEWorkspaceChecks.plist
│   └── tvOS Example/
│       ├── Sources/
│       │   ├── AppDelegate.swift
│       │   ├── Assets.xcassets/
│       │   │   ├── AccentColor.colorset/
│       │   │   │   └── Contents.json
│       │   │   ├── App Icon & Top Shelf Image.brandassets/
│       │   │   │   ├── App Icon - App Store.imagestack/
│       │   │   │   │   ├── Back.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   ├── Contents.json
│       │   │   │   │   ├── Front.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   └── Middle.imagestacklayer/
│       │   │   │   │       ├── Content.imageset/
│       │   │   │   │       │   └── Contents.json
│       │   │   │   │       └── Contents.json
│       │   │   │   ├── App Icon.imagestack/
│       │   │   │   │   ├── Back.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   ├── Contents.json
│       │   │   │   │   ├── Front.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   └── Middle.imagestacklayer/
│       │   │   │   │       ├── Content.imageset/
│       │   │   │   │       │   └── Contents.json
│       │   │   │   │       └── Contents.json
│       │   │   │   ├── Contents.json
│       │   │   │   ├── Top Shelf Image Wide.imageset/
│       │   │   │   │   └── Contents.json
│       │   │   │   └── Top Shelf Image.imageset/
│       │   │   │       └── Contents.json
│       │   │   └── Contents.json
│       │   ├── Base.lproj/
│       │   │   ├── LaunchScreen.storyboard
│       │   │   └── Main.storyboard
│       │   ├── Info.plist
│       │   └── ViewController.swift
│       └── tvOS Example.xcodeproj/
│           ├── project.pbxproj
│           └── project.xcworkspace/
│               ├── contents.xcworkspacedata
│               └── xcshareddata/
│                   └── IDEWorkspaceChecks.plist
├── Gemfile
├── LICENSE
├── Package.swift
├── README.md
├── SkeletonVIew.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── SkeletonView.podspec
├── SkeletonView.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       ├── IDETemplateMacros.plist
│       └── xcschemes/
│           ├── SkeletonView iOS.xcscheme
│           └── SkeletonView tvOS.xcscheme
├── SkeletonViewCore/
│   ├── Sources/
│   │   ├── API/
│   │   │   ├── AnimationBuilder/
│   │   │   │   └── SkeletonAnimationBuilder.swift
│   │   │   ├── Appearance/
│   │   │   │   └── SkeletonAppearance.swift
│   │   │   ├── Collections/
│   │   │   │   ├── CollectionViews/
│   │   │   │   │   └── SkeletonCollectionViewProtocols.swift
│   │   │   │   └── TableViews/
│   │   │   │       └── SkeletonTableViewProtocols.swift
│   │   │   ├── Deprecated.swift
│   │   │   ├── FoundationExtensions/
│   │   │   │   └── Notification+SkeletonFlow.swift
│   │   │   ├── Models/
│   │   │   │   ├── GradientDirection.swift
│   │   │   │   ├── SkeletonGradient.swift
│   │   │   │   ├── SkeletonTextLineHeight.swift
│   │   │   │   ├── SkeletonTextNumberOfLines.swift
│   │   │   │   ├── SkeletonTransitionStyle.swift
│   │   │   │   └── SkeletonType.swift
│   │   │   ├── SkeletonExtended.swift
│   │   │   ├── SkeletonView.swift
│   │   │   └── UIKitExtensions/
│   │   │       ├── CALayer+Animations.swift
│   │   │       ├── UICollectionView+Extensions.swift
│   │   │       ├── UILabel+IBInspectable.swift
│   │   │       ├── UILabel+SKExtensions.swift
│   │   │       ├── UITextView+IBInspectable.swift
│   │   │       ├── UITextView+SKExtensions.swift
│   │   │       ├── UIView+IBInspectable.swift
│   │   │       └── UIView+SKExtensions.swift
│   │   ├── Internal/
│   │   │   ├── Collections/
│   │   │   │   ├── CollectionSkeleton.swift
│   │   │   │   ├── SkeletonCollectionDataSource.swift
│   │   │   │   ├── SkeletonCollectionDelegate.swift
│   │   │   │   └── SkeletonReusableCell.swift
│   │   │   ├── Debug/
│   │   │   │   └── SkeletonDebug.swift
│   │   │   ├── FoundationExtensions/
│   │   │   │   ├── DispatchQueue+Extensions.swift
│   │   │   │   ├── Int+Extensions.swift
│   │   │   │   ├── Notification+Extensions.swift
│   │   │   │   └── ProcessInfo+Extensions.swift
│   │   │   ├── Helpers/
│   │   │   │   ├── AssociationPolicy.swift
│   │   │   │   ├── Recursive.swift
│   │   │   │   └── Swizzling.swift
│   │   │   ├── Models/
│   │   │   │   ├── RecoverableViewState.swift
│   │   │   │   └── SkeletonLayer.swift
│   │   │   ├── SkeletonConfigs/
│   │   │   │   ├── SkeletonConfig.swift
│   │   │   │   └── SkeletonMultilinesLayerConfig.swift
│   │   │   ├── SkeletonExtensions/
│   │   │   │   ├── GradientDirection+Animations.swift
│   │   │   │   ├── PrepareViewForSkeleton.swift
│   │   │   │   ├── Recoverable.swift
│   │   │   │   ├── SkeletonTextNode.swift
│   │   │   │   └── SubviewsSkeletonables.swift
│   │   │   ├── SkeletonFlowHandler.swift
│   │   │   ├── SkeletonLayerBuilders/
│   │   │   │   ├── SkeletonLayerBuilder.swift
│   │   │   │   └── SkeletonMultilineLayerBuilder.swift
│   │   │   ├── SkeletonTree/
│   │   │   │   └── SkeletonTreeNode.swift
│   │   │   └── UIKitExtensions/
│   │   │       ├── CALayer+Extensions.swift
│   │   │       ├── SkeletonTreeNode+Extensions.swift
│   │   │       ├── UICollectionView+CollectionSkeleton.swift
│   │   │       ├── UIColor+Skeleton.swift
│   │   │       ├── UILabel+Extensions.swift
│   │   │       ├── UITableView+CollectionSkeleton.swift
│   │   │       ├── UITableView+Extensions.swift
│   │   │       ├── UIView+AppLifecycleNotifications.swift
│   │   │       ├── UIView+AssociatedObjects.swift
│   │   │       ├── UIView+CollectionSkeleton.swift
│   │   │       ├── UIView+Extensions.swift
│   │   │       ├── UIView+SkeletonView.swift
│   │   │       ├── UIView+Swizzling.swift
│   │   │       └── UIView+Transitions.swift
│   │   └── Supporting Files/
│   │       ├── Info.plist
│   │       └── PrivacyInfo.xcprivacy
│   └── Tests/
│       ├── Debug/
│       │   └── SkeletonDebugTests.swift
│       └── Supporting Files/
│           └── Info.plist
├── Translations/
│   ├── README_de.md
│   ├── README_es.md
│   ├── README_fr.md
│   ├── README_ko.md
│   ├── README_pt-br.md
│   └── README_zh.md
└── fastlane/
    ├── Fastfile
    └── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .codebeatsettings
================================================
{
  "SWIFT": {
    "TOO_MANY_FUNCTIONS": [50, 100, 150, 200],
    "TOTAL_LOC": [200, 400, 500, 600]
  }
}

================================================
FILE: .gitattributes
================================================
*.sh linguist-language=Swift
*.podspec linguist-language=Swift


================================================
FILE: .github/FUNDING.yml
================================================
github: [juanpe]


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: "\U0001F41B Bug report"
about: Report a bug or unexpected behavior while using SkeletonView
title: ''
labels: bug
assignees: ''

---

### Description

Describe your issue here.

### What type of issue is this? (place an `x` in one of the `[ ]`)
- [ ] bug
- [ ] enhancement (feature request)
- [ ] question
- [ ] documentation related
- [ ] discussion

### Requirements (place an `x` in each of the `[ ]`)
* [ ] I've read and understood the [Contributing guidelines](https://github.com/Juanpe/SkeletonView/blob/main/CONTRIBUTING.md) and have done my best effort to follow them.
* [ ] I've read and agree to the [Code of Conduct](https://github.com/Juanpe/SkeletonView/blob/main/CODE_OF_CONDUCT.md).
* [ ] I've searched for any related issues and avoided creating a duplicate issue.

---

### Bug Report

Filling out the following details about bugs will help us solve your issue sooner.

### SkeletonView Environment:

**SkeletonView version:**
**Xcode version:**
**Swift version:**

#### Steps to reproduce:

*Please replace this with the steps to reproduce the behavior.*

1.
2.
3.

#### Expected result:

*Please replace this with what you expected to happen.*

#### Actual result:

*Please replace this with of what happened instead.*  

#### Attachments:

Logs, screenshots, sample project, funny gif, etc.


================================================
FILE: .github/ISSUE_TEMPLATE/feedback.md
================================================
---
name: "\U0001F4E3 Feedback"
about: Give us general feedback about the SkeletonView
title: ''
labels: feedback
assignees: ''

---

# SkeletonView Feedback

You can use this template to give us structured feedback or just wipe it and leave us a note. Thank you!

## What have you loved?

_eg "the nice colors"_

## What was confusing or gave you pause?

_eg "it did something unexpected"_

## Are there features you'd like to see added?

_eg "SkeletonView should be compatible with SwiftUI"_

## Anything else?

_eg "have a nice day"_


================================================
FILE: .github/ISSUE_TEMPLATE/submit-a-request.md
================================================
---
name: "⭐ Submit a request"
about: Surface a feature or problem that you think should be solved
title: ''
labels: enhancement
assignees: ''

---

### Describe the feature or problem you’d like to solve

A clear and concise description of what the feature or problem is.

### Proposed solution

How will it benefit SkeletonView and its users?

### Additional context

Add any other context like screenshots or mockups are helpful, if applicable.


================================================
FILE: .github/pull_request_template.md
================================================
### Summary

Describe the goal of this PR. Mention any related Issue numbers.

### Requirements (place an `x` in each of the `[ ]`)
* [ ] I've read and understood the [Contributing guidelines](https://github.com/Juanpe/SkeletonView/blob/main/CONTRIBUTING.md) and have done my best effort to follow them.
* [ ] I've read and agree to the [Code of Conduct](https://github.com/Juanpe/SkeletonView/blob/main/CODE_OF_CONDUCT.md).


================================================
FILE: .github/release-drafter.yml
================================================
name-template: '📦 $RESOLVED_VERSION'
tag-template: '$RESOLVED_VERSION'
category-template: '#### $TITLE'
change-template: '- **#$NUMBER**: $TITLE - @$AUTHOR'
template: |
  $CHANGES
categories:
  - title: '🚨 Breaking'
    label: 'breaking'
  - title: '🔬Improvements'
    label: '💡 enhancement'
  - title: '🙌 New'
    label: 'feature'
  - title: '🩹 Bug fixes'
    label: '🐞 bug'
  - title: '⚙️ Maintenance'
    label: '⚙️ maintenance'
  - title: '📚 Documentation'
    label: '📚 docs'
  - title: '💾 Dependency Updates'
    label: 'dependencies'

version-resolver:
  major:
    labels:
      - 'breaking'
  minor:
    labels:
      - '💡 enhancement'
      - 'feature'
  patch:
    labels:
      - '🐞 bug'
      - '⚙️ maintenance'
      - '📚 docs'
      - 'dependencies'

exclude-labels:
  - 'skip-changelog'


================================================
FILE: .github/workflows/CD.yml
================================================
name: CD

on:
  pull_request_target:
    branches: [main]
    types: [closed]
        
jobs:
  release_version:
    if: github.event.pull_request.milestone == null && github.event.pull_request.merged == true
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v2
            
      - name: Publish release
        id: publish_release
        uses: release-drafter/release-drafter@v5
        with: 
          publish: true
        env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update podspec 
        run: fastlane bump_version next_version:${{ steps.publish_release.outputs.tag_name }}

      - name: Commit changes
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          branch: 'main'
          commit_message: 'Bump version ${{ steps.publish_release.outputs.tag_name }}'
        env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}   

      - name: Deploy to Cocoapods
        continue-on-error: true
        env:
          COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
        run: |
          set -eo pipefail
          pod lib lint --allow-warnings
          pod trunk push --allow-warnings    

      - name: Tweet the release
        uses: ethomson/send-tweet-action@v1
        with:
          consumer-key: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
          consumer-secret: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
          access-token: ${{ secrets.TWITTER_ACCESS_TOKEN }}
          access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
          status: |
            🎉 New release ${{ steps.publish_release.outputs.tag_name }} is out 🚀

            Check out all the changes here: 
            ${{ steps.publish_release.outputs.html_url }} 


================================================
FILE: .github/workflows/main.yml
================================================
name: CI

on:
  pull_request:
    branches: [main]
  workflow_dispatch:

jobs:
  build:
    runs-on: macos-latest
    strategy:
      matrix:
        build-config:    
          - { scheme: 'SkeletonView iOS', destination: 'platform=iOS Simulator,name=iPhone 8', sdk: 'iphonesimulator' }
          - { scheme: 'SkeletonView tvOS', destination: 'platform=tvOS Simulator,name=Apple TV', sdk: 'appletvsimulator' }
          - { scheme: 'iOS Example', destination: 'platform=iOS Simulator,name=iPhone 8', sdk: 'iphonesimulator' }
          - { scheme: 'tvOS Example', destination: 'platform=tvOS Simulator,name=Apple TV', sdk: 'appletvsimulator' }
    steps:
      - uses: actions/checkout@v2
      - name: Build
        run: xcodebuild clean build -workspace 'SkeletonView.xcworkspace' -scheme '${{ matrix.build-config['scheme'] }}' -sdk '${{ matrix.build-config['sdk'] }}' -destination '${{ matrix.build-config['destination'] }}'



================================================
FILE: .github/workflows/needs-attention.yml
================================================
name: Issue Needs Attention
# This workflow is triggered on issue comments.
on:
  issue_comment:
    types: created

jobs:
  applyNeedsAttentionLabel:
    name: Apply Needs Attention Label
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Apply Needs Attention Label
        uses: hramos/needs-attention@v1
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          response-required-label: 'awaiting user info'
          needs-attention-label: 'needs triage'


================================================
FILE: .github/workflows/pod_lib_lint.yml
================================================
name: Pod lint
on: [workflow_dispatch]
        
jobs:
  pod_lib_lint:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v2
   
      - env:
          COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
        run: |
          set -eo pipefail
          pod lib lint --allow-warnings         


================================================
FILE: .github/workflows/pod_trunk.yml
================================================
name: Pod trunk
on: [workflow_dispatch]
        
jobs:
  release_version:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v2

      - name: Deploy to Cocoapods
        env:
          COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
        run: |
          set -eo pipefail
          pod lib lint --allow-warnings
          pod trunk push --allow-warnings  


================================================
FILE: .github/workflows/release.yml
================================================
name: Release
on: [workflow_dispatch]
        
jobs:
  release_version:
    runs-on: macOS-latest
    steps:
      - uses: actions/checkout@v2
          
      - name: Publish release
        id: publish_release
        uses: release-drafter/release-drafter@v5
        with: 
          publish: true
        env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update podspec 
        run: fastlane bump_version next_version:${{ steps.publish_release.outputs.tag_name }}

      - name: Commit changes
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          branch: 'main'
          commit_message: 'Bump version ${{ steps.publish_release.outputs.tag_name }}'
        env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}      

      - name: Deploy to Cocoapods
        env:
          COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }}
        run: |
          set -eo pipefail
          pod lib lint --allow-warnings
          pod trunk push --allow-warnings  
          
      - name: Tweet the release
        uses: ethomson/send-tweet-action@v1
        with:
          consumer-key: ${{ secrets.TWITTER_CONSUMER_API_KEY }}
          consumer-secret: ${{ secrets.TWITTER_CONSUMER_API_SECRET }}
          access-token: ${{ secrets.TWITTER_ACCESS_TOKEN }}
          access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
          status: |
            🎉 New release ${{ steps.publish_release.outputs.tag_name }} is out 🚀
            Check out all the changes here: 
            ${{ steps.publish_release.outputs.html_url }} 


================================================
FILE: .github/workflows/release_notes.yml
================================================
name: Release Notes

on:
  push:
    branches:
      - main

jobs:
  update_release_notes:
    runs-on: ubuntu-latest
    steps:
      - uses: release-drafter/release-drafter@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/stale.yml
================================================
name: 'Close stale issues and PRs'
on:
  schedule:
    - cron: '30 5 * * *'

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v4
        with:
          close-issue-message: 'Closing this issue after a prolonged period of inactivity. If this issue is still present in the latest release, please feel free to create a new issue with up-to-date information.'
          stale-issue-message: '🤖 This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions 🙂'
          days-before-stale: 5
          days-before-close: 3
          enable-statistics: true
          operations-per-run: 60
          only-labels: 'awaiting user input'

================================================
FILE: .github/workflows/validations.yml
================================================
name: Validations

on: 
  pull_request_target:
    branches: [main]
    types: [opened, reoneped, edited, synchronized]

#  workflow_dispatch:
#    inputs:
#      commit hash:
#        description: "Commit hash"
#        required: true
#        default: ""

jobs:
  lint:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v2 
      - name: Run SwiftLint
        run: swiftlint lint --reporter github-actions-logging

  danger: 
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Danger
        uses: docker://frmeloni/danger-swift-with-swiftlint:1.3.1
        with:
            args: --failOnErrors --verbose
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          
          


================================================
FILE: .gitignore
================================================
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
build/
DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata/

## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint
.DS_Store

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

## Playgrounds
timeline.xctimeline
playground.xcworkspace

# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
.build/

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# JetBrains

.idea


================================================
FILE: .swift-version
================================================
5.0


================================================
FILE: .swiftlint.yml
================================================
included:
  - SkeletonViewCore/Sources
disabled_rules:
  - trailing_whitespace
  - line_length
  - type_body_length
  - identifier_name
  - multiple_closures_with_trailing_closure
  - class_delegate_protocol
  - force_unwrapping
  - force_try
  - force_cast
  - function_parameter_count
  - discouraged_optional_collection
  - shorthand_operator
  - reduce_boolean
  - weak_delegate
  - nesting
  - closure_end_indentation 
  - function_default_parameter_at_end
  - unowned_variable_capture
  - legacy_constructor
  - redundant_type_annotation
  - vertical_whitespace_opening_braces
opt_in_rules:
  - multiline_arguments
  - multiline_parameters
  - closure_spacing
  - closure_body_length
  - collection_alignment
  - contains_over_filter_is_empty
  - contains_over_filter_count
  - contains_over_first_not_nil
  - contains_over_range_nil_comparison
  - convenience_type
  - discouraged_object_literal
  - discouraged_optional_boolean
  - empty_count
  - empty_string
  - fallthrough
  - file_name_no_space
  - first_where
  - flatmap_over_map_reduce
  - implicitly_unwrapped_optional
  - joined_default_parameter
  - last_where
  - literal_expression_end_indentation
  - multiline_function_chains
  - operator_usage_whitespace
  - private_action
  - private_outlet
  - redundant_optional_initialization
  - redundant_set_access_control
  - sorted_first_last
  - switch_case_on_newline
  - unneeded_parentheses_in_closure_argument
  - unused_declaration
  - unused_import
  - discouraged_optional_collection
  - enum_case_associated_values_count
  - legacy_multiple
  - legacy_random
indentation: 2
type_name:
    min_length: 2
    max_length:
        warning: 50
        error: 60
file_length:
 - 2500
 - 3000
large_tuple:
 - 5
 - 6

================================================
FILE: .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>


================================================
FILE: CHANGELOG.md
================================================
# Change Log
All notable changes to this project will be documented in this file

### Next version

#### 🙌 New

#### 🔬 Improvements
* [**369**](https://github.com/Juanpe/SkeletonView/pull/369): remove useless corner radius constraint - [@Juanpe](https://github.com/Juanpe)
* [**357**](https://github.com/Juanpe/SkeletonView/pull/357): Removed duplicate code in SkeletonCollectionDelegate. - [@keshavamurthy1](https://github.com/keshavamurthy1)
  
#### 🩹 Bug fixes
* [**359**](https://github.com/Juanpe/SkeletonView/pull/359): SkeletonView respecting Font's height, rather than the `UIView` actual height. - [@keshavamurthy1](https://github.com/keshavamurthy1)


## 📦 [1.11.0](https://github.com/Juanpe/SkeletonView/releases/tag/1.11.0)

#### 🙌 New
* [**339**](https://github.com/Juanpe/SkeletonView/pull/339): Add `hiddenWhenSkeletonIsActive` property - [@mohn93](https://github.com/mohn93)
* [**341**](https://github.com/Juanpe/SkeletonView/pull/341): Support autoreverses in gradient animations - [@Juanpe](https://github.com/Juanpe)

#### 🔬Improvements
* [**344**](https://github.com/Juanpe/SkeletonView/pull/344): Resize labels based on number of lines - [@Juanpe](https://github.com/Juanpe)

#### 🩹 Bug fixes
* [**340**](https://github.com/Juanpe/SkeletonView/pull/340): Fixed incorrect padding, and incorrect multiline layer frame calculation - [@yzhao198](https://github.com/yzhao198)

## 📦 [1.10.0](https://github.com/Juanpe/SkeletonView/releases/tag/1.10.0)

#### 🙌 New
* [**327**](https://github.com/Juanpe/SkeletonView/pull/327): Add SwiftLint - [@Juanpe](https://github.com/Juanpe)
* [**329**](https://github.com/Juanpe/SkeletonView/pull/329): Spanish README 🇪🇸 - [@Juanpe](https://github.com/Juanpe)

#### 🩹 Bug fixes
* [**336**](https://github.com/Juanpe/SkeletonView/pull/336): Not replace text when the skeleton disappears. Solved issues: [#296](https://github.com/Juanpe/SkeletonView/issues/296), [#330](https://github.com/Juanpe/SkeletonView/issues/330) - [@Juanpe](https://github.com/Juanpe)
* [**337**](https://github.com/Juanpe/SkeletonView/pull/337): RTL support. Solved issues: [#143](https://github.com/Juanpe/SkeletonView/issues/143) - [@Juanpe](https://github.com/Juanpe)

## 📦 [1.9](https://github.com/Juanpe/SkeletonView/releases/tag/1.9)

#### 🩹 Bug fixes
* [**319**](https://github.com/Juanpe/SkeletonView/pull/319): Fix to consider the top and bottom edge insets when updating the skeleton layer height - [@xpereta](https://github.com/xpereta)
* [**320**](https://github.com/Juanpe/SkeletonView/pull/320): Fix Single line customisation - [@Juanpe](https://github.com/juanpe)
* [**323**](https://github.com/Juanpe/SkeletonView/pull/323): Save and restore view state for UIButton - [@Juanpe](https://github.com/juanpe)

## 📦 [1.8.8](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.8)

#### 🙌 New
* [**304**](https://github.com/Juanpe/SkeletonView/pull/304): French README 🇫🇷 - [@OmarJalil](https://github.com/OmarJalil)

#### 🔬Improvements
* [**311**](https://github.com/Juanpe/SkeletonView/pull/311): Bump json from 2.2.0 to 2.3.1 - [@dependabot](https://github.com/dependabot)

#### 🩹 Bug fixes
* [**286**](https://github.com/Juanpe/SkeletonView/pull/286): Fix issue when WKWebView calls skeletonLayoutSubviews not on the main thread - [@paulanatoleclaudot-betclic](https://github.com/paulanatoleclaudot-betclic)
* [**292**](https://github.com/Juanpe/SkeletonView/pull/292): Fix IBInspectable support when using Carthage - [@marisalaneous](https://github.com/marisalaneous)
* [**308**](https://github.com/Juanpe/SkeletonView/pull/308): Fix example backgroundColor in DarkMode - [@toshi0383](https://github.com/toshi0383)
* [**307**](https://github.com/Juanpe/SkeletonView/pull/307): Prevent incorrect skeletonLayer to be added when updating skeleton - [@wsalim1610](https://github.com/wsalim1610)

## 📦 [1.8.7](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.7)

#### 🔬Improvements
* [**271**](https://github.com/Juanpe/SkeletonView/pull/271): Add corner radius for skeletonView as IBInspectable (CGFloat) default is 0.0 - [@paulanatoleclaudot-betclic](https://github.com/paulanatoleclaudot-betclic)

#### 🩹 Bug fixes
* [**259**](https://github.com/Juanpe/SkeletonView/issues/259): Prevent isSkeletonActive to be called when isSkeletonable is false - [@wsalim1610](https://github.com/wsalim1610)
* [**274**](https://github.com/Juanpe/SkeletonView/pull/274): Fix: hiding skeleton when header and footer views of section would not hide it - [@darkside999](https://github.com/darkside999)
* [**273**](https://github.com/Juanpe/SkeletonView/pull/273): Fix: in vertical stack view with center alignment show incorrect position - [@koooootake](https://github.com/koooootake)

## 📦 [1.8.6](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.6)

#### 🔬Improvements
* [**242**](https://github.com/Juanpe/SkeletonView/pull/242): Offscreen table view layout issue fixed - [@Cacodemon](https://github.com/Cacodemon)
* [**261**](https://github.com/Juanpe/SkeletonView/pull/261): Fixes removing skeleton layers from table header footer sections - [@darkside999](https://github.com/darkside999)
* [**263**](https://github.com/Juanpe/SkeletonView/pull/263): Feature/set cross dissolve transitions as default - [@Juanpe](https://github.com/Juanpe)
* [**264**](https://github.com/Juanpe/SkeletonView/pull/264): not replace original datasource is running XCTests - [@Juanpe](https://github.com/Juanpe)
* [**265**](https://github.com/Juanpe/SkeletonView/pull/265): call original traitCollectionDidChange method - [@Juanpe](https://github.com/Juanpe)

#### 🩹 Bug fixes
* [**260**](https://github.com/Juanpe/SkeletonView/issues/260): Don't hide skeleton layers on TableViewHeaderFooterView
* [**257**](https://github.com/Juanpe/SkeletonView/issues/257): Unit test problem when using SkeletonView


## 📦 [1.8.3](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.3)

- Support for iOS 13 dark mode. (thanks @Wilsonator5000)

## 📦 [1.8.2](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.2)

#### 🙌 New
- Add ability to customize line spacing per label. (thanks @gshahbazian)

## 📦 [LayoutSkeleton (1.8.1)](https://github.com/Juanpe/SkeletonView/releases/tag/1.8.1)

#### 🔬Improvements
- Fix completion call in .none transition style while hide skeletons. (thanks @aadudyrev)

#### 🙌 New
- Swizzle `layoutSubviews` method.

#### 🔬Improvements
- Fix completion call in .none transition style while hiding skeletons. (thanks @aadudyrev)
- Swift format.

#### 🩹 Bug fixes
- Update layout subviews when the original method is called.
   - Issues: [#88, #149]

## 📦 [Transitions (1.8)](https://github.com/Juanpe/SkeletonView/releases/tag/1.8)

#### 🙌 New

- Adding swift news to mentioned section (thanks @osterbergmarcus).
- Create `SkeletonTransitionStyle`. Now, you can animate transition when you show or hide skeletons. (thanks @pontusjacobsson)

#### 🔬Improvements
- Refactor some methods.

#### 🩹 Bug fixes
- Solved issues.
 [#175](https://github.com/Juanpe/SkeletonView/issues/175) Swift Package Manager version format

## 📦 [Layout update (1.7)](https://github.com/Juanpe/SkeletonView/releases/tag/1.7)

#### 🙌 New

- Allow updating skeleton layout to recalculate skeleton bounds: `layoutSkeletonIfNeeded`. See the examples to know how to use it. (thanks @eduardbosch)

#### 🔬Improvements

- Allow updating skeleton layers without recreating them: `updateSkeleton`, `updateGradientSkeleton`, `updateAnimatedSkeleton`, `updateAnimatedGradientSkeleton`. (thanks @eduardbosch)

## 📦 [Debug (1.4)](https://github.com/Juanpe/SkeletonView/releases/tag/1.4)

#### 🙌 New

- Create `skeletonDescription` print a skeleton representation of the view.
- Create `SKELETON_DEBUG` environment variable, in order to print the view hierarchy when the skeleton appears.

#### 🔬Improvements
- Add two new methods to `SkeletonFlowDelegate` protocol. Now you can know when the skeleton did show and when it did hide.
- `Recursive` protocol

#### 🩹 Bug fixes
- Solved issue [#86](https://github.com/Juanpe/SkeletonView/issues/86) (thanks @reececomo)

## 📦 [Custom defaults (1.3)](https://github.com/Juanpe/SkeletonView/releases/tag/1.3)

#### 🙌 New

- Default values customizables. Now you can set the default values of Skeleton appearance.(thanks @reececomo)
  - issues: [[#50](https://github.com/Juanpe/SkeletonView/issues/50), [#83](https://github.com/Juanpe/SkeletonView/issues/83)]

#### 🩹 Bug fixes
- Solved issue [#41](https://github.com/Juanpe/SkeletonView/issues/41). Now, Skeleton works if UICollectionView cell's Nib is registered in code. (thanks @kjoneandrei)

## 📦 [Typo (1.2.3)](https://github.com/Juanpe/SkeletonView/releases/tag/1.2.3)

####  Fixes

- Fix typo in `SkeletonTableViewDataSource` protocol

#### 🔬Improvements

- Now it takes in account the `UIStackView` to calculate the `SkeletonLayer` bounds (thanks @giantramen)

## 📦 [New face (1.2.2)](https://github.com/Juanpe/SkeletonView/releases/tag/1.2.2)

#### 🙌 New

- Rebranding

#### 🩹 Bug fixes
- Solved issue [#23](https://github.com/Juanpe/SkeletonView/issues/23). Problem with UIStackView. (thanks @giantramen)

## 📦 [State (1.2.1)](https://github.com/Juanpe/SkeletonView/releases/tag/1.2.1)

#### 🙌 New

- You can set the corner radius multiline elements (thanks @B4V4-G)
- Save view state when skeleton appears and recovery when it is hidden (@juanpe)

#### 🩹 Bug fixes
- Solved issue [#51](https://github.com/Juanpe/SkeletonView/issues/51). Support inspectable properties when using Carthage. (thanks @eduardbosch)

## 📦 [On TV (1.2)](https://github.com/Juanpe/SkeletonView/releases/tag/1.2)

#### 🙌 New
- Now ```SkeletonView``` is **tvOS** compatible! 🎉.  (thanks @mihai8804858)

#### 🩹 Bug fixes
- Solved issue [#46](https://github.com/Juanpe/SkeletonView/issues/46). It crashes the application when tap on it, didSelect called and crash.


## 📦 [Hotfix (1.1.1)](https://github.com/Juanpe/SkeletonView/releases/tag/1.1.1)

#### 🩹 Bug fixes
- Now yes, solved issue [#39](https://github.com/Juanpe/SkeletonView/issues/39)

## 📦 [Needed (1.1)](https://github.com/Juanpe/SkeletonView/releases/tag/1.1)

#### 🙌 New
- Now ```SkeletonView```supports **UICollectionViews**! 🎉.  (thanks @Renatdz)

#### 🩹 Bug fixes
- Solved issue [#39](https://github.com/Juanpe/SkeletonView/issues/39). Gradient animation did not work when app becomes active.


## 📦 [Resizable (1.0.5)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0.5)

#### 🙌 New
- Now you can use table views with resizable cells.

#### 🩹 Bug fixes
- Solved issues.
 [#17](https://github.com/Juanpe/SkeletonView/issues/17),
 [#30](https://github.com/Juanpe/SkeletonView/issues/30),
 [#34](https://github.com/Juanpe/SkeletonView/issues/34).

## 📦 [Filled or not (1.0.4)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0.4)

#### 🙌 New
- You can set the filling percent of the last line in multiline elements (thanks @jontelang!)

#### 🩹 Bug fixes
- Solved issue [#14](https://github.com/Juanpe/SkeletonView/issues/14). You could edit text views with skeleton active.

## 📦 [In all directions (1.0.3)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0.3)

#### 🙌 New
- Create ```SkeletonAnimationBuilder```, to facilitate the creation of layer animations.
```GradientDirection``` enum.

## 📦 [Retro (1.0.2)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0.2)

#### 🙌 New
- Change some private keywords, to be Swift 3 compatible

## 📦 [Early bird bug (1.0.1)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0.2)

#### 🩹 Bug fixes
- It was not removing the skeleton layer

## 📦 [Starter (1.0)](https://github.com/Juanpe/SkeletonView/releases/tag/1.0)

- First release


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct

The Code of Conduct governs how we behave in public or in private
whenever the project will be judged by our actions.
We expect it to be honored by everyone who represents the project
officially or informally,
claims affiliation with the project,
or participates directly.

We strive to:

* **Be open**: We invite anybody to participate in any aspect of our projects.
  Our community is open, and any responsibility can be carried
  by any contributor who demonstrates the required capacity and competence.
* **Be empathetic**: We work together to resolve conflict,
  assume good intentions,
  and do our best to act in an empathic fashion.
  By understanding that humanity drops a few packets in online interactions,
  and adjusting accordingly,
  we can create a comfortable environment for everyone to share their ideas.
* **Be collaborative**: We prefer to work transparently
  and to involve interested parties early on in the process.
  Wherever possible, we work closely with others in the open source community
  to coordinate our efforts.
* **Be decisive**: We expect participants in the project to resolve disagreements constructively.
  When they cannot, we escalate the matter to structures
  with designated leaders to arbitrate and provide clarity and direction.
* **Be responsible**: We hold ourselves accountable for our actions.
  When we make mistakes, we take responsibility for them.
  When we need help, we reach out to others.
  When it comes time to move on from a project,
  we take the proper steps to ensure that others can pick up where we left off.

This code is not exhaustive or complete.
It serves to distill our common understanding of a
collaborative, shared environment and goals.
We expect it to be followed in spirit as much as in the letter.

---

The **SkeletonView** Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.

Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).

[homepage]: https://www.contributor-covenant.org

For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.


================================================
FILE: CONTRIBUTING.md
================================================
# Contributors Guide

Interested in contributing? Awesome! Before you do though, please read our
[Code of Conduct](https://github.com/Juanpe/SkeletonView/blob/main/CODE_OF_CONDUCT.md). We take it very seriously, and expect that you will as
well.

There are many ways you can contribute! :heart:

### Bug Reports and Fixes :bug:
-  If you find a bug, please search for it in the [Issues](https://github.com/Juanpe/SkeletonView/issues), and if it isn't already tracked,
   [create a new issue](https://github.com/slackhq/PanModal/issues/new). Fill out the "Bug Report" section of the issue template. Even if an Issue is closed, feel free to comment and add details, it will still
   be reviewed.
-  Issues that have already been identified as a bug (note: able to reproduce) will be labelled `🐞 Bug`.
-  If you'd like to submit a fix for a bug, [send a Pull Request](#creating_a_pull_request) and mention the Issue number.

### New Features :bulb:
-  If you'd like to add new functionality to this project, describe the problem you want to solve in a [new Issue](https://github.com/Juanpe/SkeletonView/issues/new).
-  Issues that have been identified as a feature request will be labelled `💡 Enhancement`.
-  If you'd like to implement the new feature, please wait for feedback from the project
   maintainers before spending too much time writing the code. In some cases, `💡 Enhancement`s may
   not align well with the project objectives at the time.

### Miscellaneous :sparkles:
-  If you have an alternative implementation of something that may have advantages over the way its currently
   done, or you have any other change, we would be happy to hear about it!
  -  If its a trivial change, go ahead and [send a Pull Request](#creating_a_pull_request) with the changes you have in mind.
  -  If not, [open an Issue](https://github.com/Juanpe/SkeletonView/issues/new) to discuss the idea first.

If you're new to our project and looking for some way to make your first contribution, look for
Issues labelled `good first issue`.

## Requirements

For your contribution to be accepted:

- [x] The changes must be approved by code review.
- [x] Commits should be atomic and messages must be descriptive. Related issues should be mentioned by Issue number.

If the contribution doesn't meet the above criteria, you may fail our automated checks or a maintainer will discuss it with you. You can continue to improve a Pull Request by adding commits to the branch from which the PR was created.

## Creating a Pull Request

1.  :fork_and_knife: Fork the repository on GitHub.
2.  :runner: Clone/fetch your fork to your local development machine.
3.  :herb: Create a new branch and check it out.
4.  :crystal_ball: Make your changes and commit them locally.
5.  :arrow_heading_up: Push your new branch to your fork. (e.g. `git push username fix-issue-300`).
6.  :inbox_tray: Open a Pull Request on github.com from your new branch on your fork to `main` in this
    repository.

## Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

- (a) The contribution was created in whole or in part by me and I
      have the right to submit it under the open source license
      indicated in the file; or

- (b) The contribution is based upon previous work that, to the best
      of my knowledge, is covered under an appropriate open source
      license and I have the right under that license to submit that
      work with modifications, whether created in whole or in part
      by me, under the same open source license (unless I am
      permitted to submit under a different license), as indicated
      in the file; or

- (c) The contribution was provided directly to me by some other
      person who certified (a), (b) or (c) and I have not modified
      it.

- (d) I understand and agree that this project and the contribution
      are public and that a record of the contribution (including all
      personal information I submit with it, including my sign-off) is
      maintained indefinitely and may be redistributed consistent with
      this project or the open source license(s) involved.

*Wording of statement copied from [elinux.org](http://elinux.org/Developer_Certificate_Of_Origin)*


================================================
FILE: Dangerfile.swift
================================================
import Danger

let danger = Danger()
let github = danger.github

 // Make it more obvious that a PR is a work in progress and shouldn't be merged yet
if danger.github.pullRequest.title.contains("WIP") {
    warn("PR is classed as Work in Progress")
}

// Warn, asking to update all README files if only English README are updated
let enReameModified = danger.git.modifiedFiles.contains { $0.contains("README.md") }
let zhReameModified = danger.git.modifiedFiles.contains { $0.contains("README_zh.md") }
let koReameModified = danger.git.modifiedFiles.contains { $0.contains("README_ko.md") }
let ptBrReameModified = danger.git.modifiedFiles.contains { $0.contains("README_pt-br.md") }
let otherLanguagesReadmeHaveBeenModified = zhReameModified && koReameModified && ptBrReameModified

if (enReameModified && !otherLanguagesReadmeHaveBeenModified) {
    warn("Consider **also** updating the README for other languages.")
}

// Warn when there is a big PR
if (danger.github.pullRequest.additions ?? 0) > 500 {
    warn("Big PR, try to keep changes smaller if you can")
}

// Added (or removed) library files need to be added (or removed) from the
// Xcode project to avoid breaking things.
let addedSwiftLibraryFiles = danger.git.createdFiles.contains { $0.fileType == .swift && $0.hasPrefix("Sources") }
let deletedSwiftLibraryFiles = danger.git.deletedFiles.contains { $0.fileType == .swift && $0.hasPrefix("Sources") }
let modifiedXcodeProject = danger.git.modifiedFiles.contains { $0.contains(".xcodeproj") }
if (addedSwiftLibraryFiles || deletedSwiftLibraryFiles) && !modifiedXcodeProject {
    fail("Added or removed files require the Xcode project to be updated.")
}


================================================
FILE: Examples/CollectionView/AppDelegate.swift
================================================
//  Copyright © 2018 SkeletonView. All rights reserved.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}



================================================
FILE: Examples/CollectionView/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "83.5x83.5",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/CollectionView/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/CollectionView/Assets.xcassets/avatar.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "avatar.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/CollectionView/Assets.xcassets/picture.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "picture.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/CollectionView/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


================================================
FILE: Examples/CollectionView/CollectionViewCell.swift
================================================
//  Copyright © 2018 SkeletonView. All rights reserved.

import UIKit
import SkeletonView

class CollectionViewCell: UICollectionViewCell {
    
    var label: UILabel!
    var imageView: UIImageView!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        isSkeletonable = true
        createLabel()
        createImageView()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    private func createImageView() {
        imageView = UIImageView(image: UIImage(named: "picture"))
        imageView.isSkeletonable = true
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .scaleAspectFit
        addSubview(imageView)
        NSLayoutConstraint.activate([
            imageView.centerXAnchor.constraint(equalTo: centerXAnchor),
            imageView.topAnchor.constraint(equalTo: topAnchor),
            imageView.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.75),
            imageView.widthAnchor.constraint(equalTo: widthAnchor, multiplier: 0.75)
            ])
        
        
    }
    
    private func createLabel() {
        label = UILabel()
        label.isSkeletonable = true
        label.text = "Lorem ipsum"
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        addSubview(label)
        NSLayoutConstraint.activate([
            label.centerXAnchor.constraint(equalTo: centerXAnchor),
            label.bottomAnchor.constraint(equalTo: bottomAnchor),
            label.heightAnchor.constraint(equalToConstant: 40),
            label.widthAnchor.constraint(equalToConstant: frame.width)
            ])
    }
    
}


================================================
FILE: Examples/CollectionView/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15702" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="irH-dz-xqL">
    <device id="retina4_7" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15704"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="qda-qV-vJk">
            <objects>
                <viewController id="irH-dz-xqL" customClass="ViewController" customModule="SkeletonViewExampleUICollectionView" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Fso-nq-n6t">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="eHI-ka-8vS">
                                <rect key="frame" x="0.0" y="0.0" width="375" height="243"/>
                                <subviews>
                                    <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="obr-b6-dib">
                                        <rect key="frame" x="45" y="142" width="287" height="78"/>
                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="78" id="jx6-c1-U0j"/>
                                        </constraints>
                                        <string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </string>
                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                        <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                            <userDefinedRuntimeAttribute type="number" keyPath="lastLineFillPercent">
                                                <integer key="value" value="40"/>
                                            </userDefinedRuntimeAttribute>
                                        </userDefinedRuntimeAttributes>
                                    </textView>
                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="Ql9-Jy-aWM">
                                        <rect key="frame" x="141" y="20" width="93" height="93"/>
                                        <color key="backgroundColor" red="0.56078431370000004" green="0.59607843140000005" blue="0.7843137255" alpha="0.90709546230000004" colorSpace="calibratedRGB"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="93" id="jlG-7K-wMd"/>
                                            <constraint firstAttribute="width" constant="93" id="xHX-Y1-dvi"/>
                                        </constraints>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                        </userDefinedRuntimeAttributes>
                                    </imageView>
                                </subviews>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                <constraints>
                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="243" id="0g6-3g-uII"/>
                                    <constraint firstAttribute="trailing" secondItem="obr-b6-dib" secondAttribute="trailing" constant="43" id="3ms-Wk-qcn"/>
                                    <constraint firstItem="obr-b6-dib" firstAttribute="centerX" secondItem="eHI-ka-8vS" secondAttribute="centerX" constant="1" id="B5s-DM-eR8"/>
                                    <constraint firstAttribute="height" constant="243" id="GX5-3W-tUt"/>
                                    <constraint firstItem="Ql9-Jy-aWM" firstAttribute="centerX" secondItem="eHI-ka-8vS" secondAttribute="centerX" id="HsA-ID-oSK"/>
                                    <constraint firstItem="Ql9-Jy-aWM" firstAttribute="top" secondItem="eHI-ka-8vS" secondAttribute="top" constant="20" id="Hxu-ae-hXQ"/>
                                    <constraint firstItem="obr-b6-dib" firstAttribute="leading" secondItem="eHI-ka-8vS" secondAttribute="leading" constant="45" id="eop-Gq-7mO"/>
                                    <constraint firstItem="obr-b6-dib" firstAttribute="top" secondItem="eHI-ka-8vS" secondAttribute="top" constant="142" id="inJ-75-hGX"/>
                                </constraints>
                                <viewLayoutGuide key="safeArea" id="36i-gK-pIa"/>
                                <userDefinedRuntimeAttributes>
                                    <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                </userDefinedRuntimeAttributes>
                            </view>
                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="HKL-L0-T2w">
                                <rect key="frame" x="0.0" y="243" width="375" height="264"/>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="10" minimumInteritemSpacing="10" id="mGU-kn-rfE">
                                    <size key="itemSize" width="50" height="50"/>
                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
                                    <size key="footerReferenceSize" width="0.0" height="0.0"/>
                                    <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
                                </collectionViewFlowLayout>
                                <cells/>
                                <connections>
                                    <outlet property="dataSource" destination="irH-dz-xqL" id="wya-hE-ovQ"/>
                                </connections>
                            </collectionView>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JjA-MK-YzZ">
                                <rect key="frame" x="0.0" y="507" width="375" height="160"/>
                                <subviews>
                                    <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="fMR-vj-7de">
                                        <rect key="frame" x="20" y="21" width="145" height="32"/>
                                        <segments>
                                            <segment title="Solid"/>
                                            <segment title="Gradient"/>
                                        </segments>
                                        <connections>
                                            <action selector="changeSkeletonType:" destination="irH-dz-xqL" eventType="valueChanged" id="lfR-JV-DU4"/>
                                        </connections>
                                    </segmentedControl>
                                    <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="KBe-RM-BG8">
                                        <rect key="frame" x="308" y="21" width="51" height="31"/>
                                        <connections>
                                            <action selector="changeAnimated:" destination="irH-dz-xqL" eventType="valueChanged" id="dlH-KK-iee"/>
                                        </connections>
                                    </switch>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Animated" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="GSj-Ze-UIK">
                                        <rect key="frame" x="229" y="26" width="73" height="21"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Color" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Hm-fj-45V">
                                        <rect key="frame" x="20" y="61" width="41.5" height="52"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="HBJ-nh-56V">
                                        <rect key="frame" x="69.5" y="72" width="30" height="30"/>
                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                        <constraints>
                                            <constraint firstAttribute="width" constant="30" id="DVW-Tc-XEQ"/>
                                            <constraint firstAttribute="height" constant="30" id="JfP-3b-yqX"/>
                                        </constraints>
                                    </view>
                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="aUR-Qo-gHK">
                                        <rect key="frame" x="20" y="61" width="100" height="52"/>
                                        <constraints>
                                            <constraint firstAttribute="width" constant="100" id="GvX-hq-2Qn"/>
                                            <constraint firstAttribute="height" constant="52" id="UQe-Cf-riE"/>
                                        </constraints>
                                        <connections>
                                            <action selector="btnChangeColorTouchUpInside:" destination="irH-dz-xqL" eventType="touchUpInside" id="Xca-QC-htl"/>
                                        </connections>
                                    </button>
                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="nPs-17-vfs">
                                        <rect key="frame" x="263" y="72" width="94" height="30"/>
                                        <state key="normal" title="Hide skeleton"/>
                                        <connections>
                                            <action selector="showOrHideSkeleton:" destination="irH-dz-xqL" eventType="touchUpInside" id="lHc-k2-OgV"/>
                                        </connections>
                                    </button>
                                    <stepper opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.25" maximumValue="5" stepValue="0.25" translatesAutoresizingMaskIntoConstraints="NO" id="3mz-9M-e7Q">
                                        <rect key="frame" x="263" y="123" width="94" height="32"/>
                                        <connections>
                                            <action selector="transitionDurationStepperAction:" destination="irH-dz-xqL" eventType="valueChanged" id="Ll0-Pr-d0V"/>
                                        </connections>
                                    </stepper>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Fade Duration: 0.25 sec" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5gN-Jz-44y">
                                        <rect key="frame" x="92.5" y="130" width="162.5" height="18"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                </subviews>
                                <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                <constraints>
                                    <constraint firstItem="3mz-9M-e7Q" firstAttribute="leading" secondItem="5gN-Jz-44y" secondAttribute="trailing" constant="8" id="65e-Nj-bKG"/>
                                    <constraint firstItem="HBJ-nh-56V" firstAttribute="centerY" secondItem="aUR-Qo-gHK" secondAttribute="centerY" id="81M-Wq-Avl"/>
                                    <constraint firstItem="fMR-vj-7de" firstAttribute="leading" secondItem="JjA-MK-YzZ" secondAttribute="leading" constant="20" id="AyG-hI-tte"/>
                                    <constraint firstItem="aUR-Qo-gHK" firstAttribute="leading" secondItem="fMR-vj-7de" secondAttribute="leading" id="C1b-Hl-jEg"/>
                                    <constraint firstItem="3mz-9M-e7Q" firstAttribute="trailing" secondItem="nPs-17-vfs" secondAttribute="trailing" id="KuK-fc-jOQ"/>
                                    <constraint firstItem="nPs-17-vfs" firstAttribute="centerY" secondItem="aUR-Qo-gHK" secondAttribute="centerY" id="MQX-E5-IDE"/>
                                    <constraint firstItem="HBJ-nh-56V" firstAttribute="leading" secondItem="4Hm-fj-45V" secondAttribute="trailing" constant="8" id="MhM-jY-LIA"/>
                                    <constraint firstItem="4Hm-fj-45V" firstAttribute="height" secondItem="aUR-Qo-gHK" secondAttribute="height" id="OSn-RA-wQL"/>
                                    <constraint firstItem="4Hm-fj-45V" firstAttribute="leading" secondItem="aUR-Qo-gHK" secondAttribute="leading" id="PwQ-UR-iMq"/>
                                    <constraint firstAttribute="height" constant="160" id="QDV-wu-e3I"/>
                                    <constraint firstItem="5gN-Jz-44y" firstAttribute="centerY" secondItem="3mz-9M-e7Q" secondAttribute="centerY" id="TGP-Ep-0ob"/>
                                    <constraint firstItem="nPs-17-vfs" firstAttribute="top" secondItem="KBe-RM-BG8" secondAttribute="bottom" constant="20" id="TPg-wY-9bc"/>
                                    <constraint firstItem="4Hm-fj-45V" firstAttribute="centerY" secondItem="aUR-Qo-gHK" secondAttribute="centerY" id="V4i-bF-Jed"/>
                                    <constraint firstItem="KBe-RM-BG8" firstAttribute="leading" secondItem="GSj-Ze-UIK" secondAttribute="trailing" constant="6" id="ehg-tW-7kq"/>
                                    <constraint firstItem="GSj-Ze-UIK" firstAttribute="centerY" secondItem="KBe-RM-BG8" secondAttribute="centerY" id="esk-GV-DBS"/>
                                    <constraint firstAttribute="trailing" secondItem="KBe-RM-BG8" secondAttribute="trailing" constant="18" id="hhE-rV-dV7"/>
                                    <constraint firstItem="KBe-RM-BG8" firstAttribute="top" secondItem="JjA-MK-YzZ" secondAttribute="top" constant="21" id="pBQ-H8-xTK"/>
                                    <constraint firstAttribute="bottom" secondItem="3mz-9M-e7Q" secondAttribute="bottom" constant="5" id="pQ9-a6-hM4"/>
                                    <constraint firstItem="fMR-vj-7de" firstAttribute="centerY" secondItem="GSj-Ze-UIK" secondAttribute="centerY" id="q2v-t1-Zu0"/>
                                    <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="160" id="qR5-cz-YAm"/>
                                    <constraint firstItem="nPs-17-vfs" firstAttribute="trailing" secondItem="KBe-RM-BG8" secondAttribute="trailing" id="yls-k6-ZfC"/>
                                </constraints>
                            </view>
                        </subviews>
                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                        <constraints>
                            <constraint firstItem="eHI-ka-8vS" firstAttribute="trailing" secondItem="2Gq-Y8-1TU" secondAttribute="trailing" id="0dc-Vd-yJY"/>
                            <constraint firstItem="JjA-MK-YzZ" firstAttribute="leading" secondItem="2Gq-Y8-1TU" secondAttribute="leading" id="57i-UV-Wqd"/>
                            <constraint firstItem="eHI-ka-8vS" firstAttribute="leading" secondItem="2Gq-Y8-1TU" secondAttribute="leading" id="5tt-Ne-67Y"/>
                            <constraint firstItem="JjA-MK-YzZ" firstAttribute="bottom" secondItem="2Gq-Y8-1TU" secondAttribute="bottom" id="AAr-ke-R7M"/>
                            <constraint firstItem="JjA-MK-YzZ" firstAttribute="trailing" secondItem="2Gq-Y8-1TU" secondAttribute="trailing" id="DtS-9c-zBC"/>
                            <constraint firstItem="HKL-L0-T2w" firstAttribute="top" secondItem="eHI-ka-8vS" secondAttribute="bottom" id="Jgf-jS-PLT"/>
                            <constraint firstItem="eHI-ka-8vS" firstAttribute="top" secondItem="2Gq-Y8-1TU" secondAttribute="top" id="Ux2-GF-HLK"/>
                            <constraint firstItem="JjA-MK-YzZ" firstAttribute="top" secondItem="HKL-L0-T2w" secondAttribute="bottom" id="XEd-Gf-KFI"/>
                            <constraint firstItem="2Gq-Y8-1TU" firstAttribute="trailing" secondItem="HKL-L0-T2w" secondAttribute="trailing" id="bNo-98-pE4"/>
                            <constraint firstItem="HKL-L0-T2w" firstAttribute="leading" secondItem="2Gq-Y8-1TU" secondAttribute="leading" id="iIq-cx-paX"/>
                        </constraints>
                        <viewLayoutGuide key="safeArea" id="2Gq-Y8-1TU"/>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                        </userDefinedRuntimeAttributes>
                    </view>
                    <connections>
                        <outlet property="avatarImage" destination="Ql9-Jy-aWM" id="VoL-by-ygR"/>
                        <outlet property="collectionView" destination="HKL-L0-T2w" id="HSe-j0-S5d"/>
                        <outlet property="colorSelectedView" destination="HBJ-nh-56V" id="Iiq-iY-Glj"/>
                        <outlet property="showOrHideSkeletonButton" destination="nPs-17-vfs" id="vw4-fW-QoD"/>
                        <outlet property="skeletonTypeSelector" destination="fMR-vj-7de" id="CgX-3A-weo"/>
                        <outlet property="switchAnimated" destination="KBe-RM-BG8" id="emU-g9-NHT"/>
                        <outlet property="transitionDurationLabel" destination="5gN-Jz-44y" id="69y-iR-mbi"/>
                        <outlet property="transitionDurationStepper" destination="3mz-9M-e7Q" id="tzK-W7-A4D"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="PkM-Y0-M5i" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-972" y="-209.14542728635683"/>
        </scene>
    </scenes>
    <resources>
        <image name="avatar" width="215" height="211"/>
    </resources>
</document>


================================================
FILE: Examples/CollectionView/SkeletonViewExampleCollectionview-Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: Examples/CollectionView/ViewController.swift
================================================
//  Copyright © 2018 SkeletonView. All rights reserved.

import UIKit
import SkeletonView

class ViewController: UIViewController {
    @IBOutlet weak var collectionView: UICollectionView! {
        didSet {
            collectionView.isSkeletonable = true
            collectionView.backgroundColor = .clear
            collectionView.showsHorizontalScrollIndicator = false
            collectionView.showsVerticalScrollIndicator = false
            
            collectionView.dataSource = self
            collectionView.delegate = self
            
            collectionView.register(CollectionViewCell.self, forCellWithReuseIdentifier: "CollectionViewCell")
        }
    }
    
    @IBOutlet weak var avatarImage: UIImageView! {
        didSet {
            avatarImage.layer.cornerRadius = avatarImage.frame.width/2
            avatarImage.layer.masksToBounds = true
        }
    }
    
    @IBOutlet weak var colorSelectedView: UIView! {
        didSet {
            colorSelectedView.layer.cornerRadius = 5
            colorSelectedView.layer.masksToBounds = true
            colorSelectedView.backgroundColor = SkeletonAppearance.default.tintColor
        }
    }
    
    @IBOutlet weak var switchAnimated: UISwitch!
    @IBOutlet weak var skeletonTypeSelector: UISegmentedControl!
    @IBOutlet weak var showOrHideSkeletonButton: UIButton!
    @IBOutlet weak var transitionDurationLabel: UILabel!
    @IBOutlet weak var transitionDurationStepper: UIStepper!
    
    var type: SkeletonType {
        return skeletonTypeSelector.selectedSegmentIndex == 0 ? .solid : .gradient
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        transitionDurationStepper.value = 0.25
        collectionView.prepareSkeleton(completion: { done in
            self.view.showAnimatedSkeleton()
        })
    }
    
    @IBAction func changeAnimated(_ sender: Any) {
        if switchAnimated.isOn {
            view.startSkeletonAnimation()
        } else {
            view.stopSkeletonAnimation()
        }
    }
    
    @IBAction func changeSkeletonType(_ sender: Any) {
        refreshSkeleton()
    }
    
    @IBAction func btnChangeColorTouchUpInside(_ sender: Any) {
        showAlertPicker()
    }
    
    @IBAction func showOrHideSkeleton(_ sender: Any) {
        showOrHideSkeletonButton.setTitle((view.isSkeletonActive ? "Show skeleton" : "Hide skeleton"), for: .normal)
        view.isSkeletonActive ? hideSkeleton() : showSkeleton()
    }
    
    @IBAction func transitionDurationStepperAction(_ sender: Any) {
        transitionDurationLabel.text = "transition duration: \(transitionDurationStepper.value) sec"
    }
    
    func showSkeleton() {
        refreshSkeleton()
    }
    
    func hideSkeleton() {
        view.hideSkeleton(transition: .crossDissolve(transitionDurationStepper.value))
    }
    
    func refreshSkeleton() {
        self.view.hideSkeleton()
        if type == .gradient { showGradientSkeleton() }
        else { showSolidSkeleton() }
    }
    
    func showSolidSkeleton() {
        if switchAnimated.isOn {
            view.showAnimatedSkeleton(usingColor: colorSelectedView.backgroundColor!, transition: .crossDissolve(transitionDurationStepper.value))
        } else {
            view.showSkeleton(usingColor: colorSelectedView.backgroundColor!, transition: .crossDissolve(transitionDurationStepper.value))
        }
    }
    
    func showGradientSkeleton() {
        let gradient = SkeletonGradient(baseColor: colorSelectedView.backgroundColor!)
        if switchAnimated.isOn {
            view.showAnimatedGradientSkeleton(usingGradient: gradient, transition: .crossDissolve(transitionDurationStepper.value))
        } else {
            view.showGradientSkeleton(usingGradient: gradient, transition: .crossDissolve(transitionDurationStepper.value))
        }
    }
    
    func showAlertPicker() {
        let alertView = UIAlertController(title: "Select color", message: "\n\n\n\n\n\n", preferredStyle: .alert)
        
        let pickerView = UIPickerView(frame: CGRect(x: 0, y: 50, width: 260, height: 115))
        pickerView.dataSource = self
        pickerView.delegate = self
        
        alertView.view.addSubview(pickerView)
        
        let action = UIAlertAction(title: "OK", style: .default) { [unowned pickerView, unowned self] _ in
            let row = pickerView.selectedRow(inComponent: 0)
            self.colorSelectedView.backgroundColor = colors[row].0
            self.refreshSkeleton()
        }
        alertView.addAction(action)
        
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alertView.addAction(cancelAction)
        
        present(alertView, animated: false, completion: {
            pickerView.frame.size.width = alertView.view.frame.size.width
        })
    }
}
 
 // MARK: - UIPickerViewDelegate, UIPickerViewDataSource

 extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return colors.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return colors[row].1
    }
 }

// MARK: - UICollectionViewDelegateFlowLayout

extension ViewController: UICollectionViewDelegateFlowLayout {
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: view.frame.width/3 - 10, height: view.frame.width/3 - 10)
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 5
    }
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 5
    }
}

// MARK: - SkeletonCollectionViewDataSource

extension ViewController: SkeletonCollectionViewDataSource {
    func collectionSkeletonView(_ skeletonView: UICollectionView, cellIdentifierForItemAt indexPath: IndexPath) -> ReusableCellIdentifier {
        return "CollectionViewCell"
    }
    
    func collectionSkeletonView(_ skeletonView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionSkeletonView(_ skeletonView: UICollectionView, skeletonCellForItemAt indexPath: IndexPath) -> UICollectionViewCell? {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as? CollectionViewCell
        cell?.isSkeletonable = indexPath.row != 0
        return cell
    }
    
    // MARK: - UICollectionViewDataSource
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath) as! CollectionViewCell
        return cell
    }

    func collectionSkeletonView(_ skeletonView: UICollectionView, prepareCellForSkeleton cell: UICollectionViewCell, at indexPath: IndexPath) {
        let cell = cell as? CollectionViewCell
        cell?.isSkeletonable = indexPath.row != 0
    }
}


================================================
FILE: Examples/iOS Example/Sources/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  SkeletonViewExample
//
//  Created by Juanpe Catalán on 02/11/2017.
//  Copyright © 2017 SkeletonView. All rights reserved.
//

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}



================================================
FILE: Examples/iOS Example/Sources/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
  "colors" : [
    {
      "color" : {
        "platform" : "universal",
        "reference" : "systemBlueColor"
      },
      "idiom" : "universal"
    },
    {
      "appearances" : [
        {
          "appearance" : "luminosity",
          "value" : "dark"
        }
      ],
      "color" : {
        "color-space" : "srgb",
        "components" : {
          "alpha" : "1.000",
          "blue" : "1.000",
          "green" : "1.000",
          "red" : "1.000"
        }
      },
      "idiom" : "universal"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/iOS Example/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "20x20",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "29x29",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "40x40",
      "scale" : "3x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "2x"
    },
    {
      "idiom" : "iphone",
      "size" : "60x60",
      "scale" : "3x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "20x20",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "29x29",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "40x40",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "1x"
    },
    {
      "idiom" : "ipad",
      "size" : "76x76",
      "scale" : "2x"
    },
    {
      "idiom" : "ipad",
      "size" : "83.5x83.5",
      "scale" : "2x"
    },
    {
      "idiom" : "ios-marketing",
      "size" : "1024x1024",
      "scale" : "1x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/iOS Example/Sources/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/iOS Example/Sources/Assets.xcassets/avatar.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "universal",
      "filename" : "avatar.png",
      "scale" : "1x"
    },
    {
      "idiom" : "universal",
      "scale" : "2x"
    },
    {
      "idiom" : "universal",
      "scale" : "3x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}

================================================
FILE: Examples/iOS Example/Sources/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="EHf-IW-A2E">
            <objects>
                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="53" y="375"/>
        </scene>
    </scenes>
</document>


================================================
FILE: Examples/iOS Example/Sources/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="Va7-1y-Tel">
    <device id="retina5_9" orientation="portrait" appearance="light"/>
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19454"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="System colors in document resources" minToolsVersion="11.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--Item-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="iOS_Example" customModuleProvider="target" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <subviews>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="F9K-jU-100" userLabel="ContainerView">
                                <rect key="frame" x="0.0" y="44" width="375" height="243"/>
                                <subviews>
                                    <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="e9V-mk-xH0">
                                        <rect key="frame" x="45" y="142" width="287" height="78"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="78" id="gF5-G1-lKI"/>
                                        </constraints>
                                        <string key="text">Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. </string>
                                        <color key="textColor" systemColor="labelColor"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                        <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                            <userDefinedRuntimeAttribute type="number" keyPath="lastLineFillPercent">
                                                <integer key="value" value="40"/>
                                            </userDefinedRuntimeAttribute>
                                            <userDefinedRuntimeAttribute type="number" keyPath="linesCornerRadius">
                                                <integer key="value" value="6"/>
                                            </userDefinedRuntimeAttribute>
                                        </userDefinedRuntimeAttributes>
                                    </textView>
                                    <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="nMj-pU-5wJ">
                                        <rect key="frame" x="45" y="20" width="93" height="93"/>
                                        <color key="backgroundColor" red="0.56078431370000004" green="0.59607843140000005" blue="0.7843137255" alpha="0.90709546230000004" colorSpace="calibratedRGB"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="93" id="gw9-nu-cKo"/>
                                            <constraint firstAttribute="width" constant="93" id="zB6-Lp-IUt"/>
                                        </constraints>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                        </userDefinedRuntimeAttributes>
                                    </imageView>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CJW-A4-Fb8">
                                        <rect key="frame" x="166" y="27" width="166" height="12"/>
                                        <color key="backgroundColor" red="0.92156862750000001" green="0.16862745100000001" blue="0.54901960780000003" alpha="1" colorSpace="calibratedRGB"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="10"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                            <userDefinedRuntimeAttribute type="number" keyPath="linesCornerRadius">
                                                <integer key="value" value="5"/>
                                            </userDefinedRuntimeAttribute>
                                            <userDefinedRuntimeAttribute type="number" keyPath="skeletonLineSpacing">
                                                <real key="value" value="8"/>
                                            </userDefinedRuntimeAttribute>
                                        </userDefinedRuntimeAttributes>
                                    </label>
                                </subviews>
                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                <constraints>
                                    <constraint firstItem="CJW-A4-Fb8" firstAttribute="leading" secondItem="nMj-pU-5wJ" secondAttribute="trailing" constant="28" id="Drg-cD-6E8"/>
                                    <constraint firstItem="e9V-mk-xH0" firstAttribute="leading" secondItem="F9K-jU-100" secondAttribute="leading" constant="45" id="HvQ-HY-zYU"/>
                                    <constraint firstItem="e9V-mk-xH0" firstAttribute="centerX" secondItem="F9K-jU-100" secondAttribute="centerX" constant="1" id="KcB-tG-NXa"/>
                                    <constraint firstAttribute="height" constant="243" id="MIj-xq-gr1"/>
                                    <constraint firstItem="nMj-pU-5wJ" firstAttribute="leading" secondItem="F9K-jU-100" secondAttribute="leading" constant="45" id="TK6-Ws-2xY"/>
                                    <constraint firstItem="e9V-mk-xH0" firstAttribute="top" secondItem="F9K-jU-100" secondAttribute="top" constant="142" id="Wcx-nZ-1lR"/>
                                    <constraint firstAttribute="trailing" secondItem="e9V-mk-xH0" secondAttribute="trailing" constant="43" id="XbU-Og-rht"/>
                                    <constraint firstItem="CJW-A4-Fb8" firstAttribute="top" secondItem="F9K-jU-100" secondAttribute="top" constant="27" id="ceh-gB-7Et"/>
                                    <constraint firstItem="nMj-pU-5wJ" firstAttribute="top" secondItem="F9K-jU-100" secondAttribute="top" constant="20" id="hQL-cr-MaN"/>
                                    <constraint firstAttribute="trailing" secondItem="CJW-A4-Fb8" secondAttribute="trailing" constant="43" id="nfT-a5-z36"/>
                                </constraints>
                                <userDefinedRuntimeAttributes>
                                    <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                </userDefinedRuntimeAttributes>
                            </view>
                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="UCB-SP-lQk">
                                <rect key="frame" x="0.0" y="287" width="375" height="282"/>
                                <color key="separatorColor" red="0.1061807256" green="0.84678786989999999" blue="0.031482450150000001" alpha="1" colorSpace="custom" customColorSpace="displayP3"/>
                                <prototypes>
                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="CellIdentifier" rowHeight="120" id="2dN-Bd-tdy" customClass="Cell" customModule="iOS_Example" customModuleProvider="target">
                                        <rect key="frame" x="0.0" y="44.666666030883789" width="375" height="120"/>
                                        <autoresizingMask key="autoresizingMask"/>
                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="2dN-Bd-tdy" id="7IN-F3-Mr6">
                                            <rect key="frame" x="0.0" y="0.0" width="375" height="120"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <subviews>
                                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="avatar" translatesAutoresizingMaskIntoConstraints="NO" id="oiE-tt-nc2">
                                                    <rect key="frame" x="16" y="18" width="82" height="82"/>
                                                    <color key="backgroundColor" red="0.56078431370000004" green="0.59607843140000005" blue="0.7843137255" alpha="0.90709546230000004" colorSpace="calibratedRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="width" constant="82" id="4j0-PU-CmN"/>
                                                        <constraint firstAttribute="height" constant="82" id="iqE-Lc-FOj"/>
                                                    </constraints>
                                                    <userDefinedRuntimeAttributes>
                                                        <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                                    </userDefinedRuntimeAttributes>
                                                </imageView>
                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VhU-1t-AaI" userLabel="Label">
                                                    <rect key="frame" x="119" y="29" width="235" height="20"/>
                                                    <color key="backgroundColor" red="0.92156862750000001" green="0.16862745100000001" blue="0.54901960780000003" alpha="1" colorSpace="calibratedRGB"/>
                                                    <constraints>
                                                        <constraint firstAttribute="height" constant="20" id="HRL-cI-ieC"/>
                                                    </constraints>
                                                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                                    <nil key="textColor"/>
                                                    <nil key="highlightedColor"/>
                                                    <userDefinedRuntimeAttributes>
                                                        <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                                        <userDefinedRuntimeAttribute type="number" keyPath="linesCornerRadius">
                                                            <integer key="value" value="5"/>
                                                        </userDefinedRuntimeAttribute>
                                                        <userDefinedRuntimeAttribute type="number" keyPath="lastLineFillPercent">
                                                            <integer key="value" value="20"/>
                                                        </userDefinedRuntimeAttribute>
                                                    </userDefinedRuntimeAttributes>
                                                </label>
                                                <textField opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="placeholder" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="dha-bH-Ipf">
                                                    <rect key="frame" x="119" y="57" width="235" height="34"/>
                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                                    <textInputTraits key="textInputTraits"/>
                                                    <userDefinedRuntimeAttributes>
                                                        <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                                    </userDefinedRuntimeAttributes>
                                                </textField>
                                            </subviews>
                                            <constraints>
                                                <constraint firstItem="dha-bH-Ipf" firstAttribute="top" secondItem="VhU-1t-AaI" secondAttribute="bottom" constant="8" symbolic="YES" id="1Ek-1L-ZVs"/>
                                                <constraint firstItem="oiE-tt-nc2" firstAttribute="leading" secondItem="7IN-F3-Mr6" secondAttribute="leadingMargin" id="1be-ak-AH1"/>
                                                <constraint firstAttribute="bottom" secondItem="oiE-tt-nc2" secondAttribute="bottom" constant="20" id="CKt-oA-eBI"/>
                                                <constraint firstItem="oiE-tt-nc2" firstAttribute="top" secondItem="7IN-F3-Mr6" secondAttribute="topMargin" constant="7" id="EKn-ST-LDX"/>
                                                <constraint firstAttribute="trailingMargin" secondItem="VhU-1t-AaI" secondAttribute="trailing" constant="5" id="I7C-Bq-mfK"/>
                                                <constraint firstItem="VhU-1t-AaI" firstAttribute="leading" secondItem="oiE-tt-nc2" secondAttribute="trailing" constant="21" id="Ojr-Kz-1k6"/>
                                                <constraint firstItem="VhU-1t-AaI" firstAttribute="top" secondItem="7IN-F3-Mr6" secondAttribute="topMargin" constant="18" id="ZW6-JY-S4c"/>
                                                <constraint firstItem="dha-bH-Ipf" firstAttribute="trailing" secondItem="VhU-1t-AaI" secondAttribute="trailing" id="baX-Nw-8sB"/>
                                                <constraint firstItem="dha-bH-Ipf" firstAttribute="leading" secondItem="VhU-1t-AaI" secondAttribute="leading" id="kzA-mV-IDt"/>
                                            </constraints>
                                            <userDefinedRuntimeAttributes>
                                                <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                            </userDefinedRuntimeAttributes>
                                        </tableViewCellContentView>
                                        <userDefinedRuntimeAttributes>
                                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                                        </userDefinedRuntimeAttributes>
                                        <connections>
                                            <outlet property="avatar" destination="oiE-tt-nc2" id="Dkh-R5-Qhu"/>
                                            <outlet property="label1" destination="VhU-1t-AaI" id="kUW-HV-KrD"/>
                                            <outlet property="textField" destination="dha-bH-Ipf" id="OHI-6P-tuU"/>
                                        </connections>
                                    </tableViewCell>
                                </prototypes>
                                <userDefinedRuntimeAttributes>
                                    <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="NO"/>
                                </userDefinedRuntimeAttributes>
                                <connections>
                                    <outlet property="dataSource" destination="BYZ-38-t0r" id="Hxi-nC-gbY"/>
                                    <outlet property="delegate" destination="BYZ-38-t0r" id="Z10-Nx-iGb"/>
                                </connections>
                            </tableView>
                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="XgY-1a-UGc">
                                <rect key="frame" x="0.0" y="569" width="375" height="160"/>
                                <subviews>
                                    <segmentedControl opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" translatesAutoresizingMaskIntoConstraints="NO" id="xOL-Sq-r4i">
                                        <rect key="frame" x="20" y="23" width="145" height="32"/>
                                        <segments>
                                            <segment title="Solid"/>
                                            <segment title="Gradient"/>
                                        </segments>
                                        <connections>
                                            <action selector="changeSkeletonType:" destination="BYZ-38-t0r" eventType="valueChanged" id="iAS-ab-0jP"/>
                                        </connections>
                                    </segmentedControl>
                                    <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vz0-qg-GcZ">
                                        <rect key="frame" x="308" y="21" width="51" height="31"/>
                                        <connections>
                                            <action selector="changeAnimated:" destination="BYZ-38-t0r" eventType="valueChanged" id="w1G-gZ-RE0"/>
                                        </connections>
                                    </switch>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Animated" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WHN-wR-TKt">
                                        <rect key="frame" x="229" y="26" width="73" height="21"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Color" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7CF-rV-pK2">
                                        <rect key="frame" x="20" y="73.666666666666629" width="90" height="21"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="iGp-rp-t1d">
                                        <rect key="frame" x="130" y="69" width="30" height="30"/>
                                        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                                        <constraints>
                                            <constraint firstAttribute="width" constant="30" id="Q3k-B1-E88"/>
                                            <constraint firstAttribute="height" constant="30" id="xOD-RY-U4u"/>
                                        </constraints>
                                    </view>
                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Mde-Cm-CoS">
                                        <rect key="frame" x="20" y="58" width="140" height="52"/>
                                        <constraints>
                                            <constraint firstAttribute="height" constant="52" id="3GX-2y-eQj"/>
                                            <constraint firstAttribute="width" constant="140" id="6cC-Y1-RKs"/>
                                        </constraints>
                                        <connections>
                                            <action selector="btnChangeColorTouchUpInside:" destination="BYZ-38-t0r" eventType="touchUpInside" id="cB8-Ik-LIJ"/>
                                        </connections>
                                    </button>
                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Tdu-YQ-saq">
                                        <rect key="frame" x="263" y="69" width="94" height="30"/>
                                        <state key="normal" title="Hide skeleton"/>
                                        <connections>
                                            <action selector="showOrHideSkeleton:" destination="BYZ-38-t0r" eventType="touchUpInside" id="Ma1-WX-Dzy"/>
                                        </connections>
                                    </button>
                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Fade Duration: 0.25 sec" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="mrw-PM-jJJ">
                                        <rect key="frame" x="92.333333333333329" y="130" width="162.66666666666669" height="18"/>
                                        <fontDescription key="fontDescription" type="system" pointSize="15"/>
                                        <nil key="textColor"/>
                                        <nil key="highlightedColor"/>
                                    </label>
                                    <stepper opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" value="0.25" maximumValue="5" stepValue="0.25" translatesAutoresizingMaskIntoConstraints="NO" id="l4N-LL-ZrJ">
                                        <rect key="frame" x="263" y="123" width="94" height="32"/>
                                        <connections>
                                            <action selector="transitionDurationStepperAction:" destination="BYZ-38-t0r" eventType="valueChanged" id="jPN-df-fNs"/>
                                        </connections>
                                    </stepper>
                                </subviews>
                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                <constraints>
                                    <constraint firstItem="l4N-LL-ZrJ" firstAttribute="leading" secondItem="mrw-PM-jJJ" secondAttribute="trailing" constant="8" id="5iU-dO-qVc"/>
                                    <constraint firstItem="mrw-PM-jJJ" firstAttribute="centerY" secondItem="l4N-LL-ZrJ" secondAttribute="centerY" id="9OM-mx-4Jo"/>
                                    <constraint firstAttribute="trailing" secondItem="Tdu-YQ-saq" secondAttribute="trailing" constant="18" id="BQ0-S0-YMp"/>
                                    <constraint firstItem="iGp-rp-t1d" firstAttribute="trailing" secondItem="Mde-Cm-CoS" secondAttribute="trailing" id="IJ3-CC-5M7"/>
                                    <constraint firstAttribute="height" constant="160" id="OH5-ja-ZlB"/>
                                    <constraint firstItem="Mde-Cm-CoS" firstAttribute="leading" secondItem="XgY-1a-UGc" secondAttribute="leading" constant="20" id="Rek-hz-pDw"/>
                                    <constraint firstItem="xOL-Sq-r4i" firstAttribute="top" secondItem="XgY-1a-UGc" secondAttribute="top" constant="23" id="Udf-0g-bZm"/>
                                    <constraint firstItem="Tdu-YQ-saq" firstAttribute="top" secondItem="vz0-qg-GcZ" secondAttribute="bottom" constant="17" id="WiR-yP-dyv"/>
                                    <constraint firstItem="Mde-Cm-CoS" firstAttribute="centerY" secondItem="7CF-rV-pK2" secondAttribute="centerY" id="eaN-FA-4mF"/>
                                    <constraint firstItem="iGp-rp-t1d" firstAttribute="centerY" secondItem="7CF-rV-pK2" secondAttribute="centerY" id="hBb-mp-AjF"/>
                                    <constraint firstItem="l4N-LL-ZrJ" firstAttribute="top" secondItem="Tdu-YQ-saq" secondAttribute="bottom" constant="24" id="iA5-RB-pW2"/>
                                    <constraint firstItem="vz0-qg-GcZ" firstAttribute="top" secondItem="XgY-1a-UGc" secondAttribute="top" constant="21" id="iad-6N-wNf"/>
                                    <constraint firstItem="vz0-qg-GcZ" firstAttribute="leading" secondItem="WHN-wR-TKt" secondAttribute="trailing" constant="6" id="jgu-tV-gqO"/>
                                    <constraint firstItem="WHN-wR-TKt" firstAttribute="centerY" secondItem="vz0-qg-GcZ" secondAttribute="centerY" id="kTu-fb-Bc8"/>
                                    <constraint firstAttribute="trailing" secondItem="vz0-qg-GcZ" secondAttribute="trailing" constant="18" id="ktq-JT-uoR"/>
                                    <constraint firstItem="xOL-Sq-r4i" firstAttribute="leading" secondItem="XgY-1a-UGc" secondAttribute="leading" constant="20" id="pY0-qd-xmK"/>
                                    <constraint firstItem="l4N-LL-ZrJ" firstAttribute="trailing" secondItem="Tdu-YQ-saq" secondAttribute="trailing" id="ql2-Z9-dnv"/>
                                    <constraint firstItem="iGp-rp-t1d" firstAttribute="leading" secondItem="7CF-rV-pK2" secondAttribute="trailing" constant="20" id="vWD-0m-dMp"/>
                                    <constraint firstItem="7CF-rV-pK2" firstAttribute="centerY" secondItem="Tdu-YQ-saq" secondAttribute="centerY" id="x0d-LB-A4q"/>
                                    <constraint firstItem="7CF-rV-pK2" firstAttribute="leading" secondItem="xOL-Sq-r4i" secondAttribute="leading" id="yEL-Nv-z76"/>
                                </constraints>
                            </view>
                        </subviews>
                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                        <constraints>
                            <constraint firstItem="F9K-jU-100" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="1es-nY-bd3"/>
                            <constraint firstItem="F9K-jU-100" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="A3E-iv-1qp"/>
                            <constraint firstItem="XgY-1a-UGc" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="Luk-cg-4Ez"/>
                            <constraint firstItem="UCB-SP-lQk" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="Qbw-Rq-Rhw"/>
                            <constraint firstItem="F9K-jU-100" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="VLb-cX-ZHC"/>
                            <constraint firstItem="XgY-1a-UGc" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="Y8A-sq-fmq"/>
                            <constraint firstItem="XgY-1a-UGc" firstAttribute="top" secondItem="UCB-SP-lQk" secondAttribute="bottom" id="eof-MM-DrW"/>
                            <constraint firstItem="UCB-SP-lQk" firstAttribute="top" secondItem="F9K-jU-100" secondAttribute="bottom" id="hwL-ec-fKo"/>
                            <constraint firstItem="UCB-SP-lQk" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="o6z-Dj-ppC"/>
                            <constraint firstItem="XgY-1a-UGc" firstAttribute="bottom" secondItem="6Tk-OE-BBY" secondAttribute="bottom" id="vnZ-9k-MfI"/>
                        </constraints>
                        <userDefinedRuntimeAttributes>
                            <userDefinedRuntimeAttribute type="boolean" keyPath="isSkeletonable" value="YES"/>
                        </userDefinedRuntimeAttributes>
                    </view>
                    <tabBarItem key="tabBarItem" title="Item" id="wQY-ap-3n3"/>
                    <navigationItem key="navigationItem" id="BEI-dU-kr2"/>
                    <connections>
                        <outlet property="avatarImage" destination="nMj-pU-5wJ" id="9fa-Z7-vYi"/>
                        <outlet property="colorSelectedView" destination="iGp-rp-t1d" id="0Zm-9d-jRU"/>
                        <outlet property="showOrHideSkeletonButton" destination="Tdu-YQ-saq" id="gkm-mB-zYD"/>
                        <outlet property="skeletonTypeSelector" destination="xOL-Sq-r4i" id="yTr-8L-I4Y"/>
                        <outlet property="switchAnimated" destination="vz0-qg-GcZ" id="d2R-8x-lRb"/>
                        <outlet property="tableview" destination="UCB-SP-lQk" id="XV0-KX-lAN"/>
                        <outlet property="transitionDurationLabel" destination="mrw-PM-jJJ" id="BVK-Kl-5Q3"/>
                        <outlet property="transitionDurationStepper" destination="l4N-LL-ZrJ" id="OJr-Ul-7XR"/>
                    </connections>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-2682.4000000000001" y="339.90147783251234"/>
        </scene>
        <!--Item-->
        <scene sceneID="Cfc-AT-AS1">
            <objects>
                <viewController id="dv8-ph-Ehg" customClass="UITextViewByCodeViewController" customModule="iOS_Example" customModuleProvider="target" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="Jwx-gI-Qod">
                        <rect key="frame" x="0.0" y="0.0" width="375" height="812"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <viewLayoutGuide key="safeArea" id="Ao1-hk-zrH"/>
                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                    </view>
                    <tabBarItem key="tabBarItem" title="Item" id="iKp-9S-aib"/>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="M03-a6-GOC" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-1644" y="340"/>
        </scene>
        <!--Tab Bar Controller-->
        <scene sceneID="U6k-MC-AHH">
            <objects>
                <tabBarController automaticallyAdjustsScrollViewInsets="NO" id="Va7-1y-Tel" sceneMemberID="viewController">
                    <toolbarItems/>
                    <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="HSI-2O-RyO">
                        <rect key="frame" x="0.0" y="0.0" width="1000" height="1000"/>
                        <autoresizingMask key="autoresizingMask"/>
                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
                    </tabBar>
                    <connections>
                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="viewControllers" id="dL3-9L-KNU"/>
                        <segue destination="dv8-ph-Ehg" kind="relationship" relationship="viewControllers" id="8QB-uV-gaF"/>
                    </connections>
                </tabBarController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="huq-Fh-0sW" userLabel="First Responder" sceneMemberID="firstResponder"/>
            </objects>
            <point key="canvasLocation" x="-2172" y="-555"/>
        </scene>
    </scenes>
    <resources>
        <image name="avatar" width="215" height="211"/>
        <systemColor name="labelColor">
            <color white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
        <systemColor name="systemBackgroundColor">
            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
        </systemColor>
    </resources>
</document>


================================================
FILE: Examples/iOS Example/Sources/Cell.swift
================================================
//
//  Cell.swift
//  SkeletonViewExample
//
//  Created by Juanpe Catalán on 03/11/2017.
//  Copyright © 2017 SkeletonView. All rights reserved.
//

import UIKit

class Cell: UITableViewCell {

    @IBOutlet weak var avatar: UIImageView!
    @IBOutlet weak var label1: UILabel!
    @IBOutlet weak var textField: UITextField!

    override func awakeFromNib() {
        super.awakeFromNib()
        setUpInputAccessoryView()
    }

    func setUpInputAccessoryView() {
        let bar = UIToolbar()
        let reset = UIBarButtonItem(title: "InputAccessoryView", style: .plain, target: self, action: #selector(resetTapped))
        bar.items = [reset]
        bar.sizeToFit()
        textField.inputAccessoryView = bar
    }

    @objc func resetTapped() {

    }
}


================================================
FILE: Examples/iOS Example/Sources/Constants.swift
================================================
//  Copyright © 2018 SkeletonView. All rights reserved.

import UIKit

let colors = [(UIColor.skeletonDefault,"skeletonDefault"),(UIColor.turquoise,"turquoise"), (UIColor.emerald,"emerald"), (UIColor.peterRiver,"peterRiver"), (UIColor.amethyst,"amethyst"),(UIColor.wetAsphalt,"wetAsphalt"), (UIColor.nephritis,"nephritis"), (UIColor.belizeHole,"belizeHole"), (UIColor.wisteria,"wisteria"), (UIColor.midnightBlue,"midnightBlue"), (UIColor.sunFlower,"sunFlower"), (UIColor.carrot,"carrot"), (UIColor.alizarin,"alizarin"),(UIColor.clouds,"clouds"), (UIColor.concrete,"concrete"), (UIColor.flatOrange,"flatOrange"), (UIColor.pumpkin,"pumpkin"), (UIColor.pomegranate,"pomegranate"), (UIColor.silver,"silver"), (UIColor.asbestos,"asbestos")]


================================================
FILE: Examples/iOS Example/Sources/HeaderFooterSection.swift
================================================
// Copyright © 2020 SkeletonView. All rights reserved.

import UIKit

class HeaderFooterSection: UITableViewHeaderFooterView {
    
    lazy var titleLabel: UILabel = {
        let label =  UILabel()

        label.text = "      "
        label.isSkeletonable = true
        label.linesCornerRadius = 10

        return label
    }()
    
    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
        
        isSkeletonable = true
        
        contentView.addSubview(titleLabel)

        titleLabel.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10),
            titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
            titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
            titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10)
        ])
        
        backgroundView = UIView()
        if #available(iOS 13.0, *) {
            backgroundView?.backgroundColor = .systemBackground
        } else {
            backgroundView?.backgroundColor = .white
        }
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}


================================================
FILE: Examples/iOS Example/Sources/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UIApplicationSupportsIndirectInputEvents</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>armv7</string>
	</array>
	<key>UISupportedInterfaceOrientations</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
	<key>UISupportedInterfaceOrientations~ipad</key>
	<array>
		<string>UIInterfaceOrientationPortrait</string>
		<string>UIInterfaceOrientationPortraitUpsideDown</string>
		<string>UIInterfaceOrientationLandscapeLeft</string>
		<string>UIInterfaceOrientationLandscapeRight</string>
	</array>
</dict>
</plist>


================================================
FILE: Examples/iOS Example/Sources/UITextViewByCodeViewController.swift
================================================
//  Copyright © 2022 SkeletonView. All rights reserved.

import UIKit
import SkeletonView

class UITextViewByCodeViewController: UIViewController {
    lazy var textView: UITextView = {
        let tv = UITextView()
        
        tv.text = "              "
        tv.linesCornerRadius = 10
        tv.isSkeletonable = true
        tv.translatesAutoresizingMaskIntoConstraints = false
        
        return tv
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()
        setupElementsConstraints()
        showSkeletonForElements()
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }
    
    func setupUI() {
        view.addSubview(textView)
    }
    
    func setupElementsConstraints() {
        textView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
        textView.leftAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leftAnchor, constant: 10).isActive = true
        textView.rightAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.rightAnchor, constant: -10).isActive = true
        textView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    }
    
    func showSkeletonForElements() {
        textView.showSkeleton()
    }
}


================================================
FILE: Examples/iOS Example/Sources/ViewController.swift
================================================
//
//  ViewController.swift
//  SkeletonViewExample
//
//  Created by Juanpe Catalán on 02/11/2017.
//  Copyright © 2017 SkeletonView. All rights reserved.
//

import UIKit
import SkeletonView

class ViewController: UIViewController {
    @IBOutlet weak var tableview: UITableView! {
        didSet {
            tableview.rowHeight = UITableView.automaticDimension
            tableview.sectionHeaderHeight = UITableView.automaticDimension
            tableview.sectionFooterHeight = UITableView.automaticDimension
            tableview.estimatedRowHeight = 120.0
            tableview.estimatedSectionFooterHeight = 20.0
            tableview.estimatedSectionHeaderHeight = 20.0
            tableview.register(HeaderFooterSection.self, forHeaderFooterViewReuseIdentifier: "HeaderIdentifier")
            tableview.register(HeaderFooterSection.self, forHeaderFooterViewReuseIdentifier: "FooterIdentifier")
        }
    }
    
    @IBOutlet weak var avatarImage: UIImageView! {
        didSet {
            avatarImage.layer.cornerRadius = avatarImage.frame.width/2
            avatarImage.layer.masksToBounds = true
        } 
    }
    
    @IBOutlet weak var colorSelectedView: UIView! {
        didSet {
            colorSelectedView.layer.cornerRadius = 5
            colorSelectedView.layer.masksToBounds = true
            colorSelectedView.backgroundColor = SkeletonAppearance.default.tintColor
        }
    }

    @IBOutlet weak var switchAnimated: UISwitch!
    @IBOutlet weak var skeletonTypeSelector: UISegmentedControl!
    @IBOutlet weak var showOrHideSkeletonButton: UIButton!
    @IBOutlet weak var transitionDurationLabel: UILabel!
    @IBOutlet weak var transitionDurationStepper: UIStepper!
    
    var type: SkeletonType {
        return skeletonTypeSelector.selectedSegmentIndex == 0 ? .solid : .gradient
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableview.isSkeletonable = true
        transitionDurationStepper.value = 0.25
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        view.showAnimatedSkeleton()
    }

    @IBAction func changeAnimated(_ sender: Any) {
        if switchAnimated.isOn {
            view.startSkeletonAnimation()
        } else {
            view.stopSkeletonAnimation()
        }
    }
    
    @IBAction func changeSkeletonType(_ sender: Any) {
        refreshSkeleton()
    }
    
    @IBAction func btnChangeColorTouchUpInside(_ sender: Any) {
        showAlertPicker()
    }
    
    @IBAction func showOrHideSkeleton(_ sender: Any) {
        showOrHideSkeletonButton.setTitle((view.sk.isSkeletonActive ? "Show skeleton" : "Hide skeleton"), for: .normal)
        view.sk.isSkeletonActive ? hideSkeleton() : showSkeleton()
    }
    
    @IBAction func transitionDurationStepperAction(_ sender: Any) {
        transitionDurationLabel.text = "Transition duration: \(transitionDurationStepper.value) sec"
    }
    
    func showSkeleton() {
        if type == .gradient {
            let gradient = SkeletonGradient(baseColor: colorSelectedView.backgroundColor!)
            if switchAnimated.isOn {
                view.showAnimatedGradientSkeleton(usingGradient: gradient, transition: .crossDissolve(transitionDurationStepper.value))
            }
            else {
                view.showGradientSkeleton(usingGradient: gradient, transition: .crossDissolve(transitionDurationStepper.value))
            }
        }
        else {
            if switchAnimated.isOn {
                view.showAnimatedSkeleton(transition: .crossDissolve(transitionDurationStepper.value))
            }
            else {
                view.showSkeleton(transition: .crossDissolve(transitionDurationStepper.value))
            }
        }
    }
    
    func hideSkeleton() {
        view.hideSkeleton(transition: .crossDissolve(transitionDurationStepper.value))
    }
    
    func refreshSkeleton() {
        if type == .gradient { showOrUpdateGradientSkeleton() }
        else { showOrUpdatepdateSolidSkeleton() }
    }
    
    func showOrUpdatepdateSolidSkeleton() {
        if switchAnimated.isOn {
            view.updateAnimatedSkeleton(usingColor: colorSelectedView.backgroundColor!)
        } else {
            view.updateSkeleton(usingColor: colorSelectedView.backgroundColor!)
        }
    }
    
    func showOrUpdateGradientSkeleton() {
        let gradient = SkeletonGradient(baseColor: colorSelectedView.backgroundColor!)
        if switchAnimated.isOn {
            view.updateAnimatedGradientSkeleton(usingGradient: gradient)
        } else {
            view.updateGradientSkeleton(usingGradient: gradient)
        }
    }
    
    func showAlertPicker() {
        let alertView = UIAlertController(title: "Select color", message: "\n\n\n\n\n\n", preferredStyle: .alert)
        
        let pickerView = UIPickerView(frame: CGRect(x: 0, y: 50, width: 260, height: 115))
        pickerView.dataSource = self
        pickerView.delegate = self
        
        alertView.view.addSubview(pickerView)
        
        let action = UIAlertAction(title: "OK", style: .default) { [unowned pickerView, unowned self] _ in
            let row = pickerView.selectedRow(inComponent: 0)
            self.colorSelectedView.backgroundColor = colors[row].0
            self.refreshSkeleton()
        }
        alertView.addAction(action)
        
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alertView.addAction(cancelAction)
        
        present(alertView, animated: false, completion: {
            pickerView.frame.size.width = alertView.view.frame.size.width
        })
    }
}

extension ViewController: UIPickerViewDelegate, UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
       return colors.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return colors[row].1
    }
}

extension ViewController: SkeletonTableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
    }
    
    func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier {
        return "CellIdentifier"
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as! Cell
        cell.label1.text = "cell -> \(indexPath.row)"
        return cell
    }
    
    func collectionSkeletonView(_ skeletonView: UITableView, skeletonCellForRowAt indexPath: IndexPath) -> UITableViewCell? {
        let cell = skeletonView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as? Cell
        cell?.textField.isHidden = indexPath.row == 0
        return cell
    }

    func collectionSkeletonView(_ skeletonView: UITableView, prepareCellForSkeleton cell: UITableViewCell, at indexPath: IndexPath) {
        let cell = cell as? Cell
        cell?.textField.isHidden = indexPath.row == 0
    }
}

extension ViewController: SkeletonTableViewDelegate {
    func collectionSkeletonView(_ skeletonView: UITableView, identifierForHeaderInSection section: Int) -> ReusableHeaderFooterIdentifier? {
        return "HeaderIdentifier"
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let header = tableView
            .dequeueReusableHeaderFooterView(withIdentifier: "HeaderIdentifier") as! HeaderFooterSection
        header.titleLabel.text = "header -> \(section)"
        return header
    }

    func collectionSkeletonView(_ skeletonView: UITableView, identifierForFooterInSection section: Int) -> ReusableHeaderFooterIdentifier? {
        return "FooterIdentifier"
    }

    func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
        let footer = tableView
            .dequeueReusableHeaderFooterView(withIdentifier: "FooterIdentifier") as! HeaderFooterSection
        footer.titleLabel.text = "footer -> \(section)"
        return footer
    }
}


================================================
FILE: Examples/iOS Example/iOS Example.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 50;
	objects = {

/* Begin PBXBuildFile section */
		E21D8BB727888D050041DBCE /* UITextViewByCodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E21D8BB627888D050041DBCE /* UITextViewByCodeViewController.swift */; };
		F556F5C026CD20A300A80B83 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F5B726CD20A300A80B83 /* ViewController.swift */; };
		F556F5C126CD20A300A80B83 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F556F5B826CD20A300A80B83 /* Assets.xcassets */; };
		F556F5C226CD20A300A80B83 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F556F5B926CD20A300A80B83 /* LaunchScreen.storyboard */; };
		F556F5C326CD20A300A80B83 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F556F5BB26CD20A300A80B83 /* Main.storyboard */; };
		F556F5C426CD20A300A80B83 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F5BD26CD20A300A80B83 /* AppDelegate.swift */; };
		F556F5E626CD21D300A80B83 /* SkeletonView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F556F5E026CD21CB00A80B83 /* SkeletonView.framework */; };
		F556F6EE26CE813F00A80B83 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F6E626CE813F00A80B83 /* Cell.swift */; };
		F556F6EF26CE813F00A80B83 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F6EC26CE813F00A80B83 /* Constants.swift */; };
		F556F6F026CE813F00A80B83 /* HeaderFooterSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F6ED26CE813F00A80B83 /* HeaderFooterSection.swift */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		F556F5DF26CD21CB00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = "SkeletonView::SkeletonView::Product";
			remoteInfo = "SkeletonView iOS";
		};
		F556F5E126CD21CB00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = "SkeletonView::SkeletonViewTests::Product";
			remoteInfo = SkeletonViewTests;
		};
		F556F5E326CD21CB00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = F556F59426CD1F3900A80B83;
			remoteInfo = "SkeletonView tvOS";
		};
		F556F5E926CD21DA00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = "SkeletonView::SkeletonView";
			remoteInfo = "SkeletonView iOS";
		};
		F556F6EA26CE813F00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = F556F67126CD458500A80B83;
			remoteInfo = "SkeletonView tvOS Tests";
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		E21D8BB627888D050041DBCE /* UITextViewByCodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UITextViewByCodeViewController.swift; sourceTree = "<group>"; };
		F556F59F26CD201B00A80B83 /* iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
		F556F5B726CD20A300A80B83 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
		F556F5B826CD20A300A80B83 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		F556F5BA26CD20A300A80B83 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		F556F5BC26CD20A300A80B83 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		F556F5BD26CD20A300A80B83 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		F556F5BE26CD20A300A80B83 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SkeletonView.xcodeproj; path = ../../SkeletonView.xcodeproj; sourceTree = "<group>"; };
		F556F6E626CE813F00A80B83 /* Cell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = "<group>"; };
		F556F6EC26CE813F00A80B83 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
		F556F6ED26CE813F00A80B83 /* HeaderFooterSection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderFooterSection.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		F556F59C26CD201B00A80B83 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F5E626CD21D300A80B83 /* SkeletonView.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		F556F59626CD201B00A80B83 = {
			isa = PBXGroup;
			children = (
				F556F5B626CD20A300A80B83 /* Sources */,
				F556F5A026CD201B00A80B83 /* Products */,
				F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */,
			);
			sourceTree = "<group>";
		};
		F556F5A026CD201B00A80B83 /* Products */ = {
			isa = PBXGroup;
			children = (
				F556F59F26CD201B00A80B83 /* iOS Example.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		F556F5B626CD20A300A80B83 /* Sources */ = {
			isa = PBXGroup;
			children = (
				F556F6E626CE813F00A80B83 /* Cell.swift */,
				F556F6EC26CE813F00A80B83 /* Constants.swift */,
				F556F6ED26CE813F00A80B83 /* HeaderFooterSection.swift */,
				F556F5B726CD20A300A80B83 /* ViewController.swift */,
				E21D8BB627888D050041DBCE /* UITextViewByCodeViewController.swift */,
				F556F5B826CD20A300A80B83 /* Assets.xcassets */,
				F556F5B926CD20A300A80B83 /* LaunchScreen.storyboard */,
				F556F5BB26CD20A300A80B83 /* Main.storyboard */,
				F556F5BD26CD20A300A80B83 /* AppDelegate.swift */,
				F556F5BE26CD20A300A80B83 /* Info.plist */,
			);
			path = Sources;
			sourceTree = "<group>";
		};
		F556F5DA26CD21CB00A80B83 /* Products */ = {
			isa = PBXGroup;
			children = (
				F556F5E026CD21CB00A80B83 /* SkeletonView.framework */,
				F556F5E226CD21CB00A80B83 /* SkeletonViewTests.xctest */,
				F556F5E426CD21CB00A80B83 /* SkeletonView.framework */,
				F556F6EB26CE813F00A80B83 /* SkeletonView tvOS Tests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		F556F59E26CD201B00A80B83 /* iOS Example */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = F556F5B326CD201C00A80B83 /* Build configuration list for PBXNativeTarget "iOS Example" */;
			buildPhases = (
				F556F59B26CD201B00A80B83 /* Sources */,
				F556F59C26CD201B00A80B83 /* Frameworks */,
				F556F59D26CD201B00A80B83 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				F556F5EA26CD21DA00A80B83 /* PBXTargetDependency */,
			);
			name = "iOS Example";
			productName = "iOS Example";
			productReference = F556F59F26CD201B00A80B83 /* iOS Example.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		F556F59726CD201B00A80B83 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 1250;
				LastUpgradeCheck = 1300;
				TargetAttributes = {
					F556F59E26CD201B00A80B83 = {
						CreatedOnToolsVersion = 12.5.1;
					};
				};
			};
			buildConfigurationList = F556F59A26CD201B00A80B83 /* Build configuration list for PBXProject "iOS Example" */;
			compatibilityVersion = "Xcode 9.3";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = F556F59626CD201B00A80B83;
			productRefGroup = F556F5A026CD201B00A80B83 /* Products */;
			projectDirPath = "";
			projectReferences = (
				{
					ProductGroup = F556F5DA26CD21CB00A80B83 /* Products */;
					ProjectRef = F556F5D926CD21CB00A80B83 /* SkeletonView.xcodeproj */;
				},
			);
			projectRoot = "";
			targets = (
				F556F59E26CD201B00A80B83 /* iOS Example */,
			);
		};
/* End PBXProject section */

/* Begin PBXReferenceProxy section */
		F556F5E026CD21CB00A80B83 /* SkeletonView.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = SkeletonView.framework;
			remoteRef = F556F5DF26CD21CB00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F5E226CD21CB00A80B83 /* SkeletonViewTests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = SkeletonViewTests.xctest;
			remoteRef = F556F5E126CD21CB00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F5E426CD21CB00A80B83 /* SkeletonView.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = SkeletonView.framework;
			remoteRef = F556F5E326CD21CB00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F6EB26CE813F00A80B83 /* SkeletonView tvOS Tests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "SkeletonView tvOS Tests.xctest";
			remoteRef = F556F6EA26CE813F00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
/* End PBXReferenceProxy section */

/* Begin PBXResourcesBuildPhase section */
		F556F59D26CD201B00A80B83 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F5C326CD20A300A80B83 /* Main.storyboard in Resources */,
				F556F5C126CD20A300A80B83 /* Assets.xcassets in Resources */,
				F556F5C226CD20A300A80B83 /* LaunchScreen.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		F556F59B26CD201B00A80B83 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F6EF26CE813F00A80B83 /* Constants.swift in Sources */,
				F556F5C426CD20A300A80B83 /* AppDelegate.swift in Sources */,
				F556F6EE26CE813F00A80B83 /* Cell.swift in Sources */,
				F556F5C026CD20A300A80B83 /* ViewController.swift in Sources */,
				F556F6F026CE813F00A80B83 /* HeaderFooterSection.swift in Sources */,
				E21D8BB727888D050041DBCE /* UITextViewByCodeViewController.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		F556F5EA26CD21DA00A80B83 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = "SkeletonView iOS";
			targetProxy = F556F5E926CD21DA00A80B83 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		F556F5B926CD20A300A80B83 /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				F556F5BA26CD20A300A80B83 /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
		F556F5BB26CD20A300A80B83 /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				F556F5BC26CD20A300A80B83 /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		F556F5B126CD201C00A80B83 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 14.5;
				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
				MTL_FAST_MATH = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = iphoneos;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
			};
			name = Debug;
		};
		F556F5B226CD201C00A80B83 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				IPHONEOS_DEPLOYMENT_TARGET = 14.5;
				MTL_ENABLE_DEBUG_INFO = NO;
				MTL_FAST_MATH = YES;
				SDKROOT = iphoneos;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		F556F5B426CD201C00A80B83 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.skeletonview.iOS-Example";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Debug;
		};
		F556F5B526CD201C00A80B83 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
				IPHONEOS_DEPLOYMENT_TARGET = 12.0;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.skeletonview.iOS-Example";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = "1,2";
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		F556F59A26CD201B00A80B83 /* Build configuration list for PBXProject "iOS Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				F556F5B126CD201C00A80B83 /* Debug */,
				F556F5B226CD201C00A80B83 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		F556F5B326CD201C00A80B83 /* Build configuration list for PBXNativeTarget "iOS Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				F556F5B426CD201C00A80B83 /* Debug */,
				F556F5B526CD201C00A80B83 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = F556F59726CD201B00A80B83 /* Project object */;
}


================================================
FILE: Examples/iOS Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>


================================================
FILE: Examples/iOS Example/iOS Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: Examples/tvOS Example/Sources/AppDelegate.swift
================================================
//
//  AppDelegate.swift
//  tvOS Example
//
//  Created by Juanpe Catalán on 18/8/21.
//

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }


}



================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/AccentColor.colorset/Contents.json
================================================
{
  "colors" : [
    {
      "idiom" : "universal"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  },
  "layers" : [
    {
      "filename" : "Front.imagestacklayer"
    },
    {
      "filename" : "Middle.imagestacklayer"
    },
    {
      "filename" : "Back.imagestacklayer"
    }
  ]
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv",
      "scale" : "1x"
    },
    {
      "idiom" : "tv",
      "scale" : "2x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  },
  "layers" : [
    {
      "filename" : "Front.imagestacklayer"
    },
    {
      "filename" : "Middle.imagestacklayer"
    },
    {
      "filename" : "Back.imagestacklayer"
    }
  ]
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv",
      "scale" : "1x"
    },
    {
      "idiom" : "tv",
      "scale" : "2x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv",
      "scale" : "1x"
    },
    {
      "idiom" : "tv",
      "scale" : "2x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json
================================================
{
  "assets" : [
    {
      "filename" : "App Icon - App Store.imagestack",
      "idiom" : "tv",
      "role" : "primary-app-icon",
      "size" : "1280x768"
    },
    {
      "filename" : "App Icon.imagestack",
      "idiom" : "tv",
      "role" : "primary-app-icon",
      "size" : "400x240"
    },
    {
      "filename" : "Top Shelf Image Wide.imageset",
      "idiom" : "tv",
      "role" : "top-shelf-image-wide",
      "size" : "2320x720"
    },
    {
      "filename" : "Top Shelf Image.imageset",
      "idiom" : "tv",
      "role" : "top-shelf-image",
      "size" : "1920x720"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv",
      "scale" : "1x"
    },
    {
      "idiom" : "tv",
      "scale" : "2x"
    },
    {
      "idiom" : "tv-marketing",
      "scale" : "1x"
    },
    {
      "idiom" : "tv-marketing",
      "scale" : "2x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json
================================================
{
  "images" : [
    {
      "idiom" : "tv",
      "scale" : "1x"
    },
    {
      "idiom" : "tv",
      "scale" : "2x"
    },
    {
      "idiom" : "tv-marketing",
      "scale" : "1x"
    },
    {
      "idiom" : "tv-marketing",
      "scale" : "2x"
    }
  ],
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Assets.xcassets/Contents.json
================================================
{
  "info" : {
    "author" : "xcode",
    "version" : 1
  }
}


================================================
FILE: Examples/tvOS Example/Sources/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder.AppleTV.Storyboard" version="3.0" toolsVersion="13122.16" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" sceneMemberID="viewController">
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="1920" height="1080"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
                        <viewLayoutGuide key="safeArea" id="wu6-TO-1qx"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
        </scene>
    </scenes>
</document>


================================================
FILE: Examples/tvOS Example/Sources/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder.AppleTV.Storyboard" version="3.0" toolsVersion="13122.16" targetRuntime="AppleTV" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
    <dependencies>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
    </dependencies>
    <scenes>
        <!--View Controller-->
        <scene sceneID="tne-QT-ifu">
            <objects>
                <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
                    <layoutGuides>
                        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
                        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
                    </layoutGuides>
                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
                        <rect key="frame" x="0.0" y="0.0" width="1920" height="1080"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
                        <viewLayoutGuide key="safeArea" id="wu6-TO-1qx"/>
                    </view>
                </viewController>
                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
            </objects>
        </scene>
    </scenes>
</document>


================================================
FILE: Examples/tvOS Example/Sources/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>CFBundleDevelopmentRegion</key>
	<string>$(DEVELOPMENT_LANGUAGE)</string>
	<key>CFBundleExecutable</key>
	<string>$(EXECUTABLE_NAME)</string>
	<key>CFBundleIdentifier</key>
	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>$(PRODUCT_NAME)</string>
	<key>CFBundlePackageType</key>
	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSRequiresIPhoneOS</key>
	<true/>
	<key>UILaunchStoryboardName</key>
	<string>LaunchScreen</string>
	<key>UIMainStoryboardFile</key>
	<string>Main</string>
	<key>UIRequiredDeviceCapabilities</key>
	<array>
		<string>arm64</string>
	</array>
	<key>UIUserInterfaceStyle</key>
	<string>Automatic</string>
</dict>
</plist>


================================================
FILE: Examples/tvOS Example/Sources/ViewController.swift
================================================
//
//  ViewController.swift
//  tvOS Example
//
//  Created by Juanpe Catalán on 18/8/21.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }


}



================================================
FILE: Examples/tvOS Example/tvOS Example.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 50;
	objects = {

/* Begin PBXBuildFile section */
		F556F61226CD224900A80B83 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F60A26CD224900A80B83 /* ViewController.swift */; };
		F556F61326CD224900A80B83 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F556F60B26CD224900A80B83 /* Assets.xcassets */; };
		F556F61426CD224900A80B83 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F556F60C26CD224900A80B83 /* LaunchScreen.storyboard */; };
		F556F61526CD224900A80B83 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F556F60E26CD224900A80B83 /* Main.storyboard */; };
		F556F61626CD224900A80B83 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F556F61026CD224900A80B83 /* AppDelegate.swift */; };
		F556F62526CD225C00A80B83 /* SkeletonView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F556F62326CD224F00A80B83 /* SkeletonView.framework */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
		F556F61E26CD224F00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = "SkeletonView::SkeletonView::Product";
			remoteInfo = "SkeletonView iOS";
		};
		F556F62026CD224F00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = "SkeletonView::SkeletonViewTests::Product";
			remoteInfo = SkeletonViewTests;
		};
		F556F62226CD224F00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = F556F59426CD1F3900A80B83;
			remoteInfo = "SkeletonView tvOS";
		};
		F556F62826CD226600A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 1;
			remoteGlobalIDString = F556F56426CD1F3900A80B83;
			remoteInfo = "SkeletonView tvOS";
		};
		F556F6FE26CE88DC00A80B83 /* PBXContainerItemProxy */ = {
			isa = PBXContainerItemProxy;
			containerPortal = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
			proxyType = 2;
			remoteGlobalIDString = F556F67126CD458500A80B83;
			remoteInfo = "SkeletonView tvOS Tests";
		};
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
		F556F5F426CD221300A80B83 /* tvOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "tvOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; };
		F556F60A26CD224900A80B83 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
		F556F60B26CD224900A80B83 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
		F556F60D26CD224900A80B83 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
		F556F60F26CD224900A80B83 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
		F556F61026CD224900A80B83 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
		F556F61126CD224900A80B83 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
		F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SkeletonView.xcodeproj; path = ../../SkeletonView.xcodeproj; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		F556F5F126CD221300A80B83 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F62526CD225C00A80B83 /* SkeletonView.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		F556F5EB26CD221300A80B83 = {
			isa = PBXGroup;
			children = (
				F556F60926CD224900A80B83 /* Sources */,
				F556F5F526CD221300A80B83 /* Products */,
				F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */,
			);
			sourceTree = "<group>";
		};
		F556F5F526CD221300A80B83 /* Products */ = {
			isa = PBXGroup;
			children = (
				F556F5F426CD221300A80B83 /* tvOS Example.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		F556F60926CD224900A80B83 /* Sources */ = {
			isa = PBXGroup;
			children = (
				F556F60A26CD224900A80B83 /* ViewController.swift */,
				F556F60B26CD224900A80B83 /* Assets.xcassets */,
				F556F60C26CD224900A80B83 /* LaunchScreen.storyboard */,
				F556F60E26CD224900A80B83 /* Main.storyboard */,
				F556F61026CD224900A80B83 /* AppDelegate.swift */,
				F556F61126CD224900A80B83 /* Info.plist */,
			);
			path = Sources;
			sourceTree = "<group>";
		};
		F556F61926CD224F00A80B83 /* Products */ = {
			isa = PBXGroup;
			children = (
				F556F61F26CD224F00A80B83 /* SkeletonView.framework */,
				F556F62126CD224F00A80B83 /* SkeletonViewTests.xctest */,
				F556F62326CD224F00A80B83 /* SkeletonView.framework */,
				F556F6FF26CE88DC00A80B83 /* SkeletonView tvOS Tests.xctest */,
			);
			name = Products;
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		F556F5F326CD221300A80B83 /* tvOS Example */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = F556F60626CD221400A80B83 /* Build configuration list for PBXNativeTarget "tvOS Example" */;
			buildPhases = (
				F556F5F026CD221300A80B83 /* Sources */,
				F556F5F126CD221300A80B83 /* Frameworks */,
				F556F5F226CD221300A80B83 /* Resources */,
			);
			buildRules = (
			);
			dependencies = (
				F556F62926CD226600A80B83 /* PBXTargetDependency */,
			);
			name = "tvOS Example";
			productName = "tvOS Example";
			productReference = F556F5F426CD221300A80B83 /* tvOS Example.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		F556F5EC26CD221300A80B83 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastSwiftUpdateCheck = 1250;
				LastUpgradeCheck = 1300;
				TargetAttributes = {
					F556F5F326CD221300A80B83 = {
						CreatedOnToolsVersion = 12.5.1;
					};
				};
			};
			buildConfigurationList = F556F5EF26CD221300A80B83 /* Build configuration list for PBXProject "tvOS Example" */;
			compatibilityVersion = "Xcode 9.3";
			developmentRegion = en;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
				Base,
			);
			mainGroup = F556F5EB26CD221300A80B83;
			productRefGroup = F556F5F526CD221300A80B83 /* Products */;
			projectDirPath = "";
			projectReferences = (
				{
					ProductGroup = F556F61926CD224F00A80B83 /* Products */;
					ProjectRef = F556F61826CD224F00A80B83 /* SkeletonView.xcodeproj */;
				},
			);
			projectRoot = "";
			targets = (
				F556F5F326CD221300A80B83 /* tvOS Example */,
			);
		};
/* End PBXProject section */

/* Begin PBXReferenceProxy section */
		F556F61F26CD224F00A80B83 /* SkeletonView.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = SkeletonView.framework;
			remoteRef = F556F61E26CD224F00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F62126CD224F00A80B83 /* SkeletonViewTests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = SkeletonViewTests.xctest;
			remoteRef = F556F62026CD224F00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F62326CD224F00A80B83 /* SkeletonView.framework */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.framework;
			path = SkeletonView.framework;
			remoteRef = F556F62226CD224F00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
		F556F6FF26CE88DC00A80B83 /* SkeletonView tvOS Tests.xctest */ = {
			isa = PBXReferenceProxy;
			fileType = wrapper.cfbundle;
			path = "SkeletonView tvOS Tests.xctest";
			remoteRef = F556F6FE26CE88DC00A80B83 /* PBXContainerItemProxy */;
			sourceTree = BUILT_PRODUCTS_DIR;
		};
/* End PBXReferenceProxy section */

/* Begin PBXResourcesBuildPhase section */
		F556F5F226CD221300A80B83 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F61526CD224900A80B83 /* Main.storyboard in Resources */,
				F556F61326CD224900A80B83 /* Assets.xcassets in Resources */,
				F556F61426CD224900A80B83 /* LaunchScreen.storyboard in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		F556F5F026CD221300A80B83 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				F556F61626CD224900A80B83 /* AppDelegate.swift in Sources */,
				F556F61226CD224900A80B83 /* ViewController.swift in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXTargetDependency section */
		F556F62926CD226600A80B83 /* PBXTargetDependency */ = {
			isa = PBXTargetDependency;
			name = "SkeletonView tvOS";
			targetProxy = F556F62826CD226600A80B83 /* PBXContainerItemProxy */;
		};
/* End PBXTargetDependency section */

/* Begin PBXVariantGroup section */
		F556F60C26CD224900A80B83 /* LaunchScreen.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				F556F60D26CD224900A80B83 /* Base */,
			);
			name = LaunchScreen.storyboard;
			sourceTree = "<group>";
		};
		F556F60E26CD224900A80B83 /* Main.storyboard */ = {
			isa = PBXVariantGroup;
			children = (
				F556F60F26CD224900A80B83 /* Base */,
			);
			name = Main.storyboard;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		F556F60426CD221400A80B83 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = dwarf;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				ENABLE_TESTABILITY = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
				MTL_FAST_MATH = YES;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = appletvos;
				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
				TVOS_DEPLOYMENT_TARGET = 12.0;
			};
			name = Debug;
		};
		F556F60526CD221400A80B83 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				CLANG_ANALYZER_NONNULL = YES;
				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
				CLANG_CXX_LIBRARY = "libc++";
				CLANG_ENABLE_MODULES = YES;
				CLANG_ENABLE_OBJC_ARC = YES;
				CLANG_ENABLE_OBJC_WEAK = YES;
				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_COMMA = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INFINITE_RECURSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
				CLANG_WARN_STRICT_PROTOTYPES = YES;
				CLANG_WARN_SUSPICIOUS_MOVE = YES;
				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
				CLANG_WARN_UNREACHABLE_CODE = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				ENABLE_NS_ASSERTIONS = NO;
				ENABLE_STRICT_OBJC_MSGSEND = YES;
				GCC_C_LANGUAGE_STANDARD = gnu11;
				GCC_NO_COMMON_BLOCKS = YES;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MTL_ENABLE_DEBUG_INFO = NO;
				MTL_FAST_MATH = YES;
				SDKROOT = appletvos;
				SWIFT_COMPILATION_MODE = wholemodule;
				SWIFT_OPTIMIZATION_LEVEL = "-O";
				TVOS_DEPLOYMENT_TARGET = 12.0;
				VALIDATE_PRODUCT = YES;
			};
			name = Release;
		};
		F556F60726CD221400A80B83 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = Sources/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.skeletonview.tvOS-Example";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 3;
				TVOS_DEPLOYMENT_TARGET = 12.0;
			};
			name = Debug;
		};
		F556F60826CD221400A80B83 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
				CODE_SIGN_STYLE = Automatic;
				INFOPLIST_FILE = Sources/Info.plist;
				LD_RUNPATH_SEARCH_PATHS = (
					"$(inherited)",
					"@executable_path/Frameworks",
				);
				PRODUCT_BUNDLE_IDENTIFIER = "com.skeletonview.tvOS-Example";
				PRODUCT_NAME = "$(TARGET_NAME)";
				SWIFT_VERSION = 5.0;
				TARGETED_DEVICE_FAMILY = 3;
				TVOS_DEPLOYMENT_TARGET = 12.0;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		F556F5EF26CD221300A80B83 /* Build configuration list for PBXProject "tvOS Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				F556F60426CD221400A80B83 /* Debug */,
				F556F60526CD221400A80B83 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		F556F60626CD221400A80B83 /* Build configuration list for PBXNativeTarget "tvOS Example" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				F556F60726CD221400A80B83 /* Debug */,
				F556F60826CD221400A80B83 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = F556F5EC26CD221300A80B83 /* Project object */;
}


================================================
FILE: Examples/tvOS Example/tvOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:">
   </FileRef>
</Workspace>


================================================
FILE: Examples/tvOS Example/tvOS Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>IDEDidComputeMac32BitWarning</key>
	<true/>
</dict>
</plist>


================================================
FILE: Gemfile
================================================
source "https://rubygems.org"

gem "fastlane"
gem 'cocoapods', '~> 1.7.0.beta.2'


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2017 Juanpe Catalán

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: Package.swift
================================================
// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "SkeletonView",
    platforms: [
        .iOS(.v9),
        .tvOS(.v9)
    ],
    products: [
        .library(
            name: "SkeletonView",
            targets: ["SkeletonView"]
        )
    ],
    targets: [
        .target(
            name: "SkeletonView",
            path: "SkeletonViewCore/Sources",
            resources: [.copy("Supporting Files/PrivacyInfo.xcprivacy")]
        ),
        .testTarget(
            name: "SkeletonViewTests",
            dependencies: ["SkeletonView"],
            path: "SkeletonViewCore/Tests"
        )
    ],
    swiftLanguageVersions: [.v5]
)


================================================
FILE: README.md
================================================
![](Assets/header2.jpg)

<p align="center">
    <a href="https://github.com/Juanpe/SkeletonView/actions?query=workflow%3ACI">
      <img src="https://github.com/Juanpe/SkeletonView/workflows/CI/badge.svg">
    </a>
    <a href="https://codebeat.co/projects/github-com-juanpe-skeletonview-main"><img alt="codebeat badge" src="https://codebeat.co/badges/1f37bbab-a1c8-4a4a-94d7-f21740d461e9" /></a>
    <a href="https://cocoapods.org/pods/SkeletonView"><img src="https://img.shields.io/cocoapods/v/SkeletonView.svg?style=flat"></a>
    <a href="https://github.com/Carthage/Carthage/"><img src="https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat"></a>
    <a href="https://swift.org/package-manager/"><img src="https://img.shields.io/badge/SPM-supported-Green.svg?style=flat"></a>
    <img src="https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2FJuanpe%2FSkeletonView%2Fbadge%3Ftype%3Dplatforms"/>
    <a href="https://badge.bow-swift.io/recipe?name=SkeletonView&description=An%20elegant%20way%20to%20show%20users%20that%20something%20is%20happening%20and%20also%20prepare%20them%20to%20which%20contents%20he%20is%20waiting&url=https://github.com/juanpe/skeletonview&owner=Juanpe&avatar=https://avatars0.githubusercontent.com/u/1409041?v=4&tag=1.20.0"><img src="https://raw.githubusercontent.com/bow-swift/bow-art/master/badges/nef-playgrounds-badge.svg" alt="SkeletonView Playground" style="height:20px"></a>   
</p>

<p align="center">
    <a href="#-features">Features</a>
  • <a href="#-guides">Guides</a>
  • <a href="#-installation">Installation</a>
  • <a href="#-usage">Usage</a>
  • <a href="#-miscellaneous">Miscellaneous</a>
  • <a href="#️-contributing">Contributing</a>
</p>

**🌎 README is available in other languages:  [🇪🇸](Translations/README_es.md) . [🇨🇳](Translations/README_zh.md) . [🇧🇷](Translations/README_pt-br.md) . [🇰🇷](Translations/README_ko.md) . [🇫🇷](Translations/README_fr.md) . [🇩🇪](Translations/README_de.md)**

Today almost all apps have async processes, such as API requests, long running processes, etc. While the processes are working, usually developers place a loading view to show users that something is going on.

**SkeletonView** has been conceived to address this need, an elegant way to show users that something is happening and also prepare them for which contents are waiting.

Enjoy it! 🙂


##
- [🌟 Features](#-features)
- [🎬 Guides](#-guides)
- [📲 Installation](#-installation)
- [🐒 Usage](#-usage)
  - [🌿 Collections](#-collections)
  - [🔠 Texts](#-texts)
  - [🦋 Appearance](#-appearance)
  - [🎨 Custom colors](#-custom-colors)
  - [🏃‍♀️ Animations](#️-animations)
  - [🏄 Transitions](#-transitions)
- [✨ Miscellaneous](#-miscellaneous)
- [❤️ Contributing](#️-contributing)
- [📢 Mentions](#-mentions)
- [🏆 Sponsors](#-sponsors)
- [👨🏻‍💻 Author](#-author)
- [👮🏻 License](#-license)



## 🌟 Features

* Easy to use
* All UIViews are skeletonables
* Fully customizable
* Universal (iPhone & iPad)
* Interface Builder friendly
* Simple Swift syntax
* Lightweight readable codebase


## 🎬 Guides

| [![](https://img.youtube.com/vi/75kgOhWsPNA/maxresdefault.jpg)](https://youtu.be/75kgOhWsPNA)|[![](https://img.youtube.com/vi/MVCiM_VdxVA/maxresdefault.jpg)](https://youtu.be/MVCiM_VdxVA)|[![](https://img.youtube.com/vi/Qq3Evspeea8/maxresdefault.jpg)](https://youtu.be/Qq3Evspeea8)|[![](https://img.youtube.com/vi/Zx1Pg1gPfxA/maxresdefault.jpg)](https://www.youtube.com/watch?v=Zx1Pg1gPfxA)
|:---:  | :---:  | :---: | :---:
|[**SkeletonView Guides - Getting started**](https://youtu.be/75kgOhWsPNA)|[**How to Create Loading View with Skeleton View in Swift 5.2**](https://youtu.be/MVCiM_VdxVA)    by iKh4ever Studio|[**Create Skeleton Loading View in App (Swift 5) - Xcode 11, 2020**](https://youtu.be/Qq3Evspeea8)    by iOS Academy| [**Cómo crear una ANIMACIÓN de CARGA de DATOS en iOS**](https://www.youtube.com/watch?v=Zx1Pg1gPfxA) by MoureDev


## 📲 Installation

* [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html):

```ruby
pod 'SkeletonView'
```

* [Carthage](https://github.com/Carthage/Carthage):

```ruby
github "Juanpe/SkeletonView"
```

* [Swift Package Manager](https://swift.org/package-manager/):

```swift
dependencies: [
  .package(url: "https://github.com/Juanpe/SkeletonView.git", from: "1.7.0")
]
```

> 📣 **IMPORTANT!** 
>
> Since version 1.30.0, `SkeletonView` supports **XCFrameworks**, so if you want to install it as a **XCFramework**, please use [this repo](https://github.com/Juanpe/SkeletonView-XCFramework.git) instead.


## 🐒 Usage

Only **3** steps needed to use `SkeletonView`:

1️⃣ Import SkeletonView in proper place.
```swift
import SkeletonView
```

2️⃣ Now, set which views will be `skeletonables`. You achieve this in two ways:

**Using code:**
```swift
avatarImageView.isSkeletonable = true
```
**Using IB/Storyboards:**

![](Assets/storyboard.png)

3️⃣ Once you've set the views, you can show the **skeleton**. To do so, you have **4** choices:

```swift
(1) view.showSkeleton()                 // Solid
(2) view.showGradientSkeleton()         // Gradient
(3) view.showAnimatedSkeleton()         // Solid animated
(4) view.showAnimatedGradientSkeleton() // Gradient animated
```

**Preview**

<table>
<tr>
<td width="25%">
<center>Solid</center>
</td>
<td width="25%">
<center>Gradient</center>
</td>
<td width="25%">
<center>Solid Animated</center>
</td>
<td width="25%">
<center>Gradient Animated</center>
</td>
</tr>
<tr>
<td width="25%">
<img src="Assets/solid.png"></img>
</td>
<td width="25%">
<img src="Assets/gradient.png"></img>
</td>
<td width="25%">
<img src="Assets/solid_animated.gif"></img>
</td>
<td width="25%">
<img src="Assets/gradient_animated.gif"></img>
</td>
</tr>
</table>


> 📣 **IMPORTANT!** 
>
> `SkeletonView` is recursive, so if you want show the skeleton in all skeletonable views, you only need to call the show method in the main container view. For example, with `UIViewControllers`.

  


### 🌿 Collections

```SkeletonView``` is compatible with ```UITableView``` and ```UICollectionView```.


**UITableView**

If you want to show the skeleton in a ```UITableView```, you need to conform to ```SkeletonTableViewDataSource``` protocol.

``` swift
public protocol SkeletonTableViewDataSource: UITableViewDataSource {
    func numSections(in collectionSkeletonView: UITableView) -> Int // Default: 1
    func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int
    func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier
    func collectionSkeletonView(_ skeletonView: UITableView, skeletonCellForRowAt indexPath: IndexPath) -> UITableViewCell? // Default: nil
    func collectionSkeletonView(_ skeletonView: UITableView, prepareCellForSkeleton cell: UITableViewCell, at indexPath: IndexPath)
}
```
As you can see, this protocol inherits from ```UITableViewDataSource```, so you can replace this protocol with the skeleton protocol.

This protocol has a default implementation for some methods. For example, the number of rows for each section is calculated in runtime:

``` swift
func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int
// Default:
// It calculates how many cells need to populate whole tableview
```

> 📣 **IMPORTANT!** 
>
> If you return `UITableView.automaticNumberOfSkeletonRows` in the above method, it acts like the default behavior (i.e. it calculates how many cells needed to populate the whole tableview).

There is only one method you need to implement to let Skeleton know the cell identifier. This method doesn't have default implementation:
 ``` swift
 func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier {
    return "CellIdentifier"
}
 ```
 
 By default, the library dequeues the cells from each indexPath, but you can also do this if you want to make some changes before the skeleton appears:
 ``` swift
 func collectionSkeletonView(_ skeletonView: UITableView, skel
Download .txt
gitextract_9ngk7ec7/

├── .codebeatsettings
├── .gitattributes
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.md
│   │   ├── feedback.md
│   │   └── submit-a-request.md
│   ├── pull_request_template.md
│   ├── release-drafter.yml
│   └── workflows/
│       ├── CD.yml
│       ├── main.yml
│       ├── needs-attention.yml
│       ├── pod_lib_lint.yml
│       ├── pod_trunk.yml
│       ├── release.yml
│       ├── release_notes.yml
│       ├── stale.yml
│       └── validations.yml
├── .gitignore
├── .swift-version
├── .swiftlint.yml
├── .swiftpm/
│   └── xcode/
│       └── package.xcworkspace/
│           └── contents.xcworkspacedata
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Dangerfile.swift
├── Examples/
│   ├── CollectionView/
│   │   ├── AppDelegate.swift
│   │   ├── Assets.xcassets/
│   │   │   ├── AppIcon.appiconset/
│   │   │   │   └── Contents.json
│   │   │   ├── Contents.json
│   │   │   ├── avatar.imageset/
│   │   │   │   └── Contents.json
│   │   │   └── picture.imageset/
│   │   │       └── Contents.json
│   │   ├── Base.lproj/
│   │   │   └── LaunchScreen.storyboard
│   │   ├── CollectionViewCell.swift
│   │   ├── Main.storyboard
│   │   ├── SkeletonViewExampleCollectionview-Info.plist
│   │   └── ViewController.swift
│   ├── iOS Example/
│   │   ├── Sources/
│   │   │   ├── AppDelegate.swift
│   │   │   ├── Assets.xcassets/
│   │   │   │   ├── AccentColor.colorset/
│   │   │   │   │   └── Contents.json
│   │   │   │   ├── AppIcon.appiconset/
│   │   │   │   │   └── Contents.json
│   │   │   │   ├── Contents.json
│   │   │   │   └── avatar.imageset/
│   │   │   │       └── Contents.json
│   │   │   ├── Base.lproj/
│   │   │   │   ├── LaunchScreen.storyboard
│   │   │   │   └── Main.storyboard
│   │   │   ├── Cell.swift
│   │   │   ├── Constants.swift
│   │   │   ├── HeaderFooterSection.swift
│   │   │   ├── Info.plist
│   │   │   ├── UITextViewByCodeViewController.swift
│   │   │   └── ViewController.swift
│   │   └── iOS Example.xcodeproj/
│   │       ├── project.pbxproj
│   │       └── project.xcworkspace/
│   │           ├── contents.xcworkspacedata
│   │           └── xcshareddata/
│   │               └── IDEWorkspaceChecks.plist
│   └── tvOS Example/
│       ├── Sources/
│       │   ├── AppDelegate.swift
│       │   ├── Assets.xcassets/
│       │   │   ├── AccentColor.colorset/
│       │   │   │   └── Contents.json
│       │   │   ├── App Icon & Top Shelf Image.brandassets/
│       │   │   │   ├── App Icon - App Store.imagestack/
│       │   │   │   │   ├── Back.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   ├── Contents.json
│       │   │   │   │   ├── Front.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   └── Middle.imagestacklayer/
│       │   │   │   │       ├── Content.imageset/
│       │   │   │   │       │   └── Contents.json
│       │   │   │   │       └── Contents.json
│       │   │   │   ├── App Icon.imagestack/
│       │   │   │   │   ├── Back.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   ├── Contents.json
│       │   │   │   │   ├── Front.imagestacklayer/
│       │   │   │   │   │   ├── Content.imageset/
│       │   │   │   │   │   │   └── Contents.json
│       │   │   │   │   │   └── Contents.json
│       │   │   │   │   └── Middle.imagestacklayer/
│       │   │   │   │       ├── Content.imageset/
│       │   │   │   │       │   └── Contents.json
│       │   │   │   │       └── Contents.json
│       │   │   │   ├── Contents.json
│       │   │   │   ├── Top Shelf Image Wide.imageset/
│       │   │   │   │   └── Contents.json
│       │   │   │   └── Top Shelf Image.imageset/
│       │   │   │       └── Contents.json
│       │   │   └── Contents.json
│       │   ├── Base.lproj/
│       │   │   ├── LaunchScreen.storyboard
│       │   │   └── Main.storyboard
│       │   ├── Info.plist
│       │   └── ViewController.swift
│       └── tvOS Example.xcodeproj/
│           ├── project.pbxproj
│           └── project.xcworkspace/
│               ├── contents.xcworkspacedata
│               └── xcshareddata/
│                   └── IDEWorkspaceChecks.plist
├── Gemfile
├── LICENSE
├── Package.swift
├── README.md
├── SkeletonVIew.xcworkspace/
│   ├── contents.xcworkspacedata
│   └── xcshareddata/
│       └── IDEWorkspaceChecks.plist
├── SkeletonView.podspec
├── SkeletonView.xcodeproj/
│   ├── project.pbxproj
│   ├── project.xcworkspace/
│   │   ├── contents.xcworkspacedata
│   │   └── xcshareddata/
│   │       ├── IDEWorkspaceChecks.plist
│   │       └── WorkspaceSettings.xcsettings
│   └── xcshareddata/
│       ├── IDETemplateMacros.plist
│       └── xcschemes/
│           ├── SkeletonView iOS.xcscheme
│           └── SkeletonView tvOS.xcscheme
├── SkeletonViewCore/
│   ├── Sources/
│   │   ├── API/
│   │   │   ├── AnimationBuilder/
│   │   │   │   └── SkeletonAnimationBuilder.swift
│   │   │   ├── Appearance/
│   │   │   │   └── SkeletonAppearance.swift
│   │   │   ├── Collections/
│   │   │   │   ├── CollectionViews/
│   │   │   │   │   └── SkeletonCollectionViewProtocols.swift
│   │   │   │   └── TableViews/
│   │   │   │       └── SkeletonTableViewProtocols.swift
│   │   │   ├── Deprecated.swift
│   │   │   ├── FoundationExtensions/
│   │   │   │   └── Notification+SkeletonFlow.swift
│   │   │   ├── Models/
│   │   │   │   ├── GradientDirection.swift
│   │   │   │   ├── SkeletonGradient.swift
│   │   │   │   ├── SkeletonTextLineHeight.swift
│   │   │   │   ├── SkeletonTextNumberOfLines.swift
│   │   │   │   ├── SkeletonTransitionStyle.swift
│   │   │   │   └── SkeletonType.swift
│   │   │   ├── SkeletonExtended.swift
│   │   │   ├── SkeletonView.swift
│   │   │   └── UIKitExtensions/
│   │   │       ├── CALayer+Animations.swift
│   │   │       ├── UICollectionView+Extensions.swift
│   │   │       ├── UILabel+IBInspectable.swift
│   │   │       ├── UILabel+SKExtensions.swift
│   │   │       ├── UITextView+IBInspectable.swift
│   │   │       ├── UITextView+SKExtensions.swift
│   │   │       ├── UIView+IBInspectable.swift
│   │   │       └── UIView+SKExtensions.swift
│   │   ├── Internal/
│   │   │   ├── Collections/
│   │   │   │   ├── CollectionSkeleton.swift
│   │   │   │   ├── SkeletonCollectionDataSource.swift
│   │   │   │   ├── SkeletonCollectionDelegate.swift
│   │   │   │   └── SkeletonReusableCell.swift
│   │   │   ├── Debug/
│   │   │   │   └── SkeletonDebug.swift
│   │   │   ├── FoundationExtensions/
│   │   │   │   ├── DispatchQueue+Extensions.swift
│   │   │   │   ├── Int+Extensions.swift
│   │   │   │   ├── Notification+Extensions.swift
│   │   │   │   └── ProcessInfo+Extensions.swift
│   │   │   ├── Helpers/
│   │   │   │   ├── AssociationPolicy.swift
│   │   │   │   ├── Recursive.swift
│   │   │   │   └── Swizzling.swift
│   │   │   ├── Models/
│   │   │   │   ├── RecoverableViewState.swift
│   │   │   │   └── SkeletonLayer.swift
│   │   │   ├── SkeletonConfigs/
│   │   │   │   ├── SkeletonConfig.swift
│   │   │   │   └── SkeletonMultilinesLayerConfig.swift
│   │   │   ├── SkeletonExtensions/
│   │   │   │   ├── GradientDirection+Animations.swift
│   │   │   │   ├── PrepareViewForSkeleton.swift
│   │   │   │   ├── Recoverable.swift
│   │   │   │   ├── SkeletonTextNode.swift
│   │   │   │   └── SubviewsSkeletonables.swift
│   │   │   ├── SkeletonFlowHandler.swift
│   │   │   ├── SkeletonLayerBuilders/
│   │   │   │   ├── SkeletonLayerBuilder.swift
│   │   │   │   └── SkeletonMultilineLayerBuilder.swift
│   │   │   ├── SkeletonTree/
│   │   │   │   └── SkeletonTreeNode.swift
│   │   │   └── UIKitExtensions/
│   │   │       ├── CALayer+Extensions.swift
│   │   │       ├── SkeletonTreeNode+Extensions.swift
│   │   │       ├── UICollectionView+CollectionSkeleton.swift
│   │   │       ├── UIColor+Skeleton.swift
│   │   │       ├── UILabel+Extensions.swift
│   │   │       ├── UITableView+CollectionSkeleton.swift
│   │   │       ├── UITableView+Extensions.swift
│   │   │       ├── UIView+AppLifecycleNotifications.swift
│   │   │       ├── UIView+AssociatedObjects.swift
│   │   │       ├── UIView+CollectionSkeleton.swift
│   │   │       ├── UIView+Extensions.swift
│   │   │       ├── UIView+SkeletonView.swift
│   │   │       ├── UIView+Swizzling.swift
│   │   │       └── UIView+Transitions.swift
│   │   └── Supporting Files/
│   │       ├── Info.plist
│   │       └── PrivacyInfo.xcprivacy
│   └── Tests/
│       ├── Debug/
│       │   └── SkeletonDebugTests.swift
│       └── Supporting Files/
│           └── Info.plist
├── Translations/
│   ├── README_de.md
│   ├── README_es.md
│   ├── README_fr.md
│   ├── README_ko.md
│   ├── README_pt-br.md
│   └── README_zh.md
└── fastlane/
    ├── Fastfile
    └── README.md
Condensed preview — 165 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (587K chars).
[
  {
    "path": ".codebeatsettings",
    "chars": 105,
    "preview": "{\n  \"SWIFT\": {\n    \"TOO_MANY_FUNCTIONS\": [50, 100, 150, 200],\n    \"TOTAL_LOC\": [200, 400, 500, 600]\n  }\n}"
  },
  {
    "path": ".gitattributes",
    "chars": 63,
    "preview": "*.sh linguist-language=Swift\n*.podspec linguist-language=Swift\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 17,
    "preview": "github: [juanpe]\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 1321,
    "preview": "---\nname: \"\\U0001F41B Bug report\"\nabout: Report a bug or unexpected behavior while using SkeletonView\ntitle: ''\nlabels: "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feedback.md",
    "chars": 537,
    "preview": "---\nname: \"\\U0001F4E3 Feedback\"\nabout: Give us general feedback about the SkeletonView\ntitle: ''\nlabels: feedback\nassign"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/submit-a-request.md",
    "chars": 448,
    "preview": "---\nname: \"⭐ Submit a request\"\nabout: Surface a feature or problem that you think should be solved\ntitle: ''\nlabels: enh"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 425,
    "preview": "### Summary\n\nDescribe the goal of this PR. Mention any related Issue numbers.\n\n### Requirements (place an `x` in each of"
  },
  {
    "path": ".github/release-drafter.yml",
    "chars": 803,
    "preview": "name-template: '📦 $RESOLVED_VERSION'\ntag-template: '$RESOLVED_VERSION'\ncategory-template: '#### $TITLE'\nchange-template:"
  },
  {
    "path": ".github/workflows/CD.yml",
    "chars": 1749,
    "preview": "name: CD\n\non:\n  pull_request_target:\n    branches: [main]\n    types: [closed]\n        \njobs:\n  release_version:\n    if: "
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 929,
    "preview": "name: CI\n\non:\n  pull_request:\n    branches: [main]\n  workflow_dispatch:\n\njobs:\n  build:\n    runs-on: macos-latest\n    st"
  },
  {
    "path": ".github/workflows/needs-attention.yml",
    "chars": 511,
    "preview": "name: Issue Needs Attention\n# This workflow is triggered on issue comments.\non:\n  issue_comment:\n    types: created\n\njob"
  },
  {
    "path": ".github/workflows/pod_lib_lint.yml",
    "chars": 319,
    "preview": "name: Pod lint\non: [workflow_dispatch]\n        \njobs:\n  pod_lib_lint:\n    runs-on: macOS-latest\n    steps:\n      - uses:"
  },
  {
    "path": ".github/workflows/pod_trunk.yml",
    "chars": 389,
    "preview": "name: Pod trunk\non: [workflow_dispatch]\n        \njobs:\n  release_version:\n    runs-on: macOS-latest\n    steps:\n      - u"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1589,
    "preview": "name: Release\non: [workflow_dispatch]\n        \njobs:\n  release_version:\n    runs-on: macOS-latest\n    steps:\n      - use"
  },
  {
    "path": ".github/workflows/release_notes.yml",
    "chars": 247,
    "preview": "name: Release Notes\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  update_release_notes:\n    runs-on: ubuntu-latest\n  "
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 771,
    "preview": "name: 'Close stale issues and PRs'\non:\n  schedule:\n    - cron: '30 5 * * *'\n\njobs:\n  stale:\n    runs-on: ubuntu-latest\n "
  },
  {
    "path": ".github/workflows/validations.yml",
    "chars": 749,
    "preview": "name: Validations\n\non: \n  pull_request_target:\n    branches: [main]\n    types: [opened, reoneped, edited, synchronized]\n"
  },
  {
    "path": ".gitignore",
    "chars": 1476,
    "preview": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n"
  },
  {
    "path": ".swift-version",
    "chars": 4,
    "preview": "5.0\n"
  },
  {
    "path": ".swiftlint.yml",
    "chars": 1734,
    "preview": "included:\n  - SkeletonViewCore/Sources\ndisabled_rules:\n  - trailing_whitespace\n  - line_length\n  - type_body_length\n  - "
  },
  {
    "path": ".swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 11655,
    "preview": "# Change Log\nAll notable changes to this project will be documented in this file\n\n### Next version\n\n#### 🙌 New\n\n#### 🔬 I"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 2373,
    "preview": "# Code of Conduct\n\nThe Code of Conduct governs how we behave in public or in private\nwhenever the project will be judged"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 4245,
    "preview": "# Contributors Guide\n\nInterested in contributing? Awesome! Before you do though, please read our\n[Code of Conduct](https"
  },
  {
    "path": "Dangerfile.swift",
    "chars": 1671,
    "preview": "import Danger\n\nlet danger = Danger()\nlet github = danger.github\n\n // Make it more obvious that a PR is a work in progres"
  },
  {
    "path": "Examples/CollectionView/AppDelegate.swift",
    "chars": 2090,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder"
  },
  {
    "path": "Examples/CollectionView/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1590,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "Examples/CollectionView/Assets.xcassets/Contents.json",
    "chars": 62,
    "preview": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Examples/CollectionView/Assets.xcassets/avatar.imageset/Contents.json",
    "chars": 303,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"avatar.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n "
  },
  {
    "path": "Examples/CollectionView/Assets.xcassets/picture.imageset/Contents.json",
    "chars": 304,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"picture.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n"
  },
  {
    "path": "Examples/CollectionView/Base.lproj/LaunchScreen.storyboard",
    "chars": 1681,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "Examples/CollectionView/CollectionViewCell.swift",
    "chars": 1771,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\nimport SkeletonView\n\nclass CollectionViewCell: UIC"
  },
  {
    "path": "Examples/CollectionView/Main.storyboard",
    "chars": 22296,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "Examples/CollectionView/SkeletonViewExampleCollectionview-Info.plist",
    "chars": 1463,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Examples/CollectionView/ViewController.swift",
    "chars": 7630,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\nimport SkeletonView\n\nclass ViewController: UIViewC"
  },
  {
    "path": "Examples/iOS Example/Sources/AppDelegate.swift",
    "chars": 2190,
    "preview": "//\n//  AppDelegate.swift\n//  SkeletonViewExample\n//\n//  Created by Juanpe Catalán on 02/11/2017.\n//  Copyright © 2017 Sk"
  },
  {
    "path": "Examples/iOS Example/Sources/Assets.xcassets/AccentColor.colorset/Contents.json",
    "chars": 590,
    "preview": "{\n  \"colors\" : [\n    {\n      \"color\" : {\n        \"platform\" : \"universal\",\n        \"reference\" : \"systemBlueColor\"\n     "
  },
  {
    "path": "Examples/iOS Example/Sources/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "chars": 1590,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\""
  },
  {
    "path": "Examples/iOS Example/Sources/Assets.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/iOS Example/Sources/Assets.xcassets/avatar.imageset/Contents.json",
    "chars": 303,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"avatar.png\",\n      \"scale\" : \"1x\"\n    },\n    {\n "
  },
  {
    "path": "Examples/iOS Example/Sources/Base.lproj/LaunchScreen.storyboard",
    "chars": 1681,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
  },
  {
    "path": "Examples/iOS Example/Sources/Base.lproj/Main.storyboard",
    "chars": 35897,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
  },
  {
    "path": "Examples/iOS Example/Sources/Cell.swift",
    "chars": 767,
    "preview": "//\n//  Cell.swift\n//  SkeletonViewExample\n//\n//  Created by Juanpe Catalán on 03/11/2017.\n//  Copyright © 2017 SkeletonV"
  },
  {
    "path": "Examples/iOS Example/Sources/Constants.swift",
    "chars": 736,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\nlet colors = [(UIColor.skeletonDefault,\"skeletonD"
  },
  {
    "path": "Examples/iOS Example/Sources/HeaderFooterSection.swift",
    "chars": 1386,
    "preview": "// Copyright © 2020 SkeletonView. All rights reserved.\n\nimport UIKit\n\nclass HeaderFooterSection: UITableViewHeaderFooter"
  },
  {
    "path": "Examples/iOS Example/Sources/Info.plist",
    "chars": 1551,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Examples/iOS Example/Sources/UITextViewByCodeViewController.swift",
    "chars": 1332,
    "preview": "//  Copyright © 2022 SkeletonView. All rights reserved.\n\nimport UIKit\nimport SkeletonView\n\nclass UITextViewByCodeViewCon"
  },
  {
    "path": "Examples/iOS Example/Sources/ViewController.swift",
    "chars": 8379,
    "preview": "//\n//  ViewController.swift\n//  SkeletonViewExample\n//\n//  Created by Juanpe Catalán on 02/11/2017.\n//  Copyright © 2017"
  },
  {
    "path": "Examples/iOS Example/iOS Example.xcodeproj/project.pbxproj",
    "chars": 18686,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Examples/iOS Example/iOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "Examples/iOS Example/iOS Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Examples/tvOS Example/Sources/AppDelegate.swift",
    "chars": 1763,
    "preview": "//\n//  AppDelegate.swift\n//  tvOS Example\n//\n//  Created by Juanpe Catalán on 18/8/21.\n//\n\nimport UIKit\n\n@main\nclass App"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/AccentColor.colorset/Contents.json",
    "chars": 123,
    "preview": "{\n  \"colors\" : [\n    {\n      \"idiom\" : \"universal\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "chars": 116,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Back.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Contents.json",
    "chars": 250,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestackl"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "chars": 116,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Front.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "chars": 116,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - App Store.imagestack/Middle.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "chars": 194,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Back.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Contents.json",
    "chars": 250,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  },\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestackl"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "chars": 194,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Front.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "chars": 194,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon.imagestack/Middle.imagestacklayer/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json",
    "chars": 663,
    "preview": "{\n  \"assets\" : [\n    {\n      \"filename\" : \"App Icon - App Store.imagestack\",\n      \"idiom\" : \"tv\",\n      \"role\" : \"prima"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json",
    "chars": 326,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json",
    "chars": 326,
    "preview": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x"
  },
  {
    "path": "Examples/tvOS Example/Sources/Assets.xcassets/Contents.json",
    "chars": 63,
    "preview": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Examples/tvOS Example/Sources/Base.lproj/LaunchScreen.storyboard",
    "chars": 1568,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.Storyboard\" ve"
  },
  {
    "path": "Examples/tvOS Example/Sources/Base.lproj/Main.storyboard",
    "chars": 1826,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.Storyboard\" version=\"3.0\" tool"
  },
  {
    "path": "Examples/tvOS Example/Sources/Info.plist",
    "chars": 1035,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Examples/tvOS Example/Sources/ViewController.swift",
    "chars": 282,
    "preview": "//\n//  ViewController.swift\n//  tvOS Example\n//\n//  Created by Juanpe Catalán on 18/8/21.\n//\n\nimport UIKit\n\nclass ViewCo"
  },
  {
    "path": "Examples/tvOS Example/tvOS Example.xcodeproj/project.pbxproj",
    "chars": 16786,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "Examples/tvOS Example/tvOS Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 135,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "Examples/tvOS Example/tvOS Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "Gemfile",
    "chars": 81,
    "preview": "source \"https://rubygems.org\"\n\ngem \"fastlane\"\ngem 'cocoapods', '~> 1.7.0.beta.2'\n"
  },
  {
    "path": "LICENSE",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2017 Juanpe Catalán\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "Package.swift",
    "chars": 684,
    "preview": "// swift-tools-version:5.3\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"SkeletonView\",\n    platforms: ["
  },
  {
    "path": "README.md",
    "chars": 25931,
    "preview": "![](Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflow%3"
  },
  {
    "path": "SkeletonVIew.xcworkspace/contents.xcworkspacedata",
    "chars": 350,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:SkeletonView.x"
  },
  {
    "path": "SkeletonVIew.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "SkeletonView.podspec",
    "chars": 1132,
    "preview": "Pod::Spec.new do |s|\n  s.name         = \"SkeletonView\"\n  s.version      = \"1.31.0\"\n  s.summary      = \"An elegant way to"
  },
  {
    "path": "SkeletonView.xcodeproj/project.pbxproj",
    "chars": 79343,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "SkeletonView.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 134,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef"
  },
  {
    "path": "SkeletonView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "chars": 238,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "SkeletonView.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "chars": 269,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "SkeletonView.xcodeproj/xcshareddata/IDETemplateMacros.plist",
    "chars": 578,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "SkeletonView.xcodeproj/xcshareddata/xcschemes/SkeletonView iOS.xcscheme",
    "chars": 2496,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "SkeletonView.xcodeproj/xcshareddata/xcschemes/SkeletonView tvOS.xcscheme",
    "chars": 3488,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1300\"\n   version = \"1.3\">\n   <BuildAction\n      "
  },
  {
    "path": "SkeletonViewCore/Sources/API/AnimationBuilder/SkeletonAnimationBuilder.swift",
    "chars": 1434,
    "preview": "//\n//  SkeletonAnimationBuilder.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 17/11/2017.\n//  Copyright"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Appearance/SkeletonAppearance.swift",
    "chars": 1131,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Collections/CollectionViews/SkeletonCollectionViewProtocols.swift",
    "chars": 2221,
    "preview": "//\n//  SkeletonCollectionViewProtocols.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 06/11/2017.\n//  Co"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Collections/TableViews/SkeletonTableViewProtocols.swift",
    "chars": 2754,
    "preview": "//\n//  SkeletonTableViewProtocols.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 06/11/2017.\n//  Copyrig"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Deprecated.swift",
    "chars": 2734,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/FoundationExtensions/Notification+SkeletonFlow.swift",
    "chars": 954,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/GradientDirection.swift",
    "chars": 798,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/SkeletonGradient.swift",
    "chars": 887,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/SkeletonTextLineHeight.swift",
    "chars": 858,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/SkeletonTextNumberOfLines.swift",
    "chars": 754,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/SkeletonTransitionStyle.swift",
    "chars": 172,
    "preview": "// Copyright © 2019 SkeletonView. All rights reserved.\n\nimport UIKit\n\npublic enum SkeletonTransitionStyle: Equatable {\n "
  },
  {
    "path": "SkeletonViewCore/Sources/API/Models/SkeletonType.swift",
    "chars": 917,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/SkeletonExtended.swift",
    "chars": 1336,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/SkeletonView.swift",
    "chars": 8093,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/CALayer+Animations.swift",
    "chars": 1047,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UICollectionView+Extensions.swift",
    "chars": 1028,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UILabel+IBInspectable.swift",
    "chars": 877,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UILabel+SKExtensions.swift",
    "chars": 1229,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UITextView+IBInspectable.swift",
    "chars": 871,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UITextView+SKExtensions.swift",
    "chars": 1231,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UIView+IBInspectable.swift",
    "chars": 1054,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/API/UIKitExtensions/UIView+SKExtensions.swift",
    "chars": 1101,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Collections/CollectionSkeleton.swift",
    "chars": 1304,
    "preview": "//\n//  CollectionSkeleton.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/11/2017.\n//  Copyright © 201"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Collections/SkeletonCollectionDataSource.swift",
    "chars": 5965,
    "preview": "//\n//  SkeletonCollectionDataSource.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/11/2017.\n//  Copyr"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Collections/SkeletonCollectionDelegate.swift",
    "chars": 3049,
    "preview": "//\n//  SkeletonCollectionDelegate.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 30/03/2018.\n//  Copyrig"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Collections/SkeletonReusableCell.swift",
    "chars": 329,
    "preview": "//\n//  SkeletonReusableCell.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 30/03/2018.\n//  Copyright © 2"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Debug/SkeletonDebug.swift",
    "chars": 786,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/FoundationExtensions/DispatchQueue+Extensions.swift",
    "chars": 971,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/FoundationExtensions/Int+Extensions.swift",
    "chars": 486,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/FoundationExtensions/Notification+Extensions.swift",
    "chars": 702,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/FoundationExtensions/ProcessInfo+Extensions.swift",
    "chars": 647,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Helpers/AssociationPolicy.swift",
    "chars": 1496,
    "preview": "//  Copyright © 2017 SkeletonView. All rights reserved.\n\nimport Foundation\n\n// Partially copy/pasted from https://github"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Helpers/Recursive.swift",
    "chars": 706,
    "preview": "//  Copyright © 2017 SkeletonView. All rights reserved.\n\nimport UIKit\n\ntypealias VoidBlock = () -> Void\ntypealias Recurs"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Helpers/Swizzling.swift",
    "chars": 755,
    "preview": "// Copyright © 2019 SkeletonView. All rights reserved.\n\nimport Foundation\n\nfunc swizzle(selector originalSelector: Selec"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Models/RecoverableViewState.swift",
    "chars": 2301,
    "preview": "//\n//  RecoverableViewState.swift\n//  SkeletonView\n//\n//  Created by Juanpe Catalán on 13/05/2018.\n//  Copyright © 2018 "
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/Models/SkeletonLayer.swift",
    "chars": 4792,
    "preview": "//\n//  SkeletonLayer.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/11/2017.\n//  Copyright © 2017 Ske"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonConfigs/SkeletonConfig.swift",
    "chars": 1124,
    "preview": "// Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\n/// Used to store all config needed to activate th"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonConfigs/SkeletonMultilinesLayerConfig.swift",
    "chars": 1106,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonExtensions/GradientDirection+Animations.swift",
    "chars": 1947,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonExtensions/PrepareViewForSkeleton.swift",
    "chars": 2682,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonExtensions/Recoverable.swift",
    "chars": 6660,
    "preview": "//\n//  Recoverable.swift\n//  SkeletonView\n//\n//  Created by Juanpe Catalán on 13/05/2018.\n//  Copyright © 2018 SkeletonV"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonExtensions/SkeletonTextNode.swift",
    "chars": 7647,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonExtensions/SubviewsSkeletonables.swift",
    "chars": 1539,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\nextension UIView {\n    \n    @objc var subviewsSke"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonFlowHandler.swift",
    "chars": 1938,
    "preview": "//  Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\nprotocol SkeletonFlowDelegate: AnyObject {\n    fu"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonLayerBuilders/SkeletonLayerBuilder.swift",
    "chars": 1108,
    "preview": "// Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\n/// Object that facilitates the creation of skelet"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonLayerBuilders/SkeletonMultilineLayerBuilder.swift",
    "chars": 2902,
    "preview": "// Copyright © 2018 SkeletonView. All rights reserved.\n\nimport UIKit\n\n/// Object that facilitates the creation of skelet"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/SkeletonTree/SkeletonTreeNode.swift",
    "chars": 598,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/CALayer+Extensions.swift",
    "chars": 9122,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/SkeletonTreeNode+Extensions.swift",
    "chars": 1261,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UICollectionView+CollectionSkeleton.swift",
    "chars": 2244,
    "preview": "//\n//  UICollectionView+CollectionSkeleton.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/02/2018.\n//"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIColor+Skeleton.swift",
    "chars": 2964,
    "preview": "//  Copyright © 2017 SkeletonView. All rights reserved.\n\nimport UIKit\n\n// codebeat:disable[TOO_MANY_IVARS]\npublic extens"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UILabel+Extensions.swift",
    "chars": 1819,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UITableView+CollectionSkeleton.swift",
    "chars": 3039,
    "preview": "//\n//  UITableView+CollectionSkeleton.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/02/2018.\n//  Cop"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UITableView+Extensions.swift",
    "chars": 1285,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+AppLifecycleNotifications.swift",
    "chars": 1942,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+AssociatedObjects.swift",
    "chars": 3733,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+CollectionSkeleton.swift",
    "chars": 1026,
    "preview": "//\n//  UIView+CollectionSkeleton.swift\n//  SkeletonView-iOS\n//\n//  Created by Juanpe Catalán on 02/02/2018.\n//  Copyrigh"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+Extensions.swift",
    "chars": 5572,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+SkeletonView.swift",
    "chars": 4379,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+Swizzling.swift",
    "chars": 2896,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Sources/Internal/UIKitExtensions/UIView+Transitions.swift",
    "chars": 697,
    "preview": "// Copyright © 2019 SkeletonView. All rights reserved.\n\nimport UIKit\n\nextension UIView {\n    \n    func startTransition(t"
  },
  {
    "path": "SkeletonViewCore/Sources/Supporting Files/Info.plist",
    "chars": 723,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en<"
  },
  {
    "path": "SkeletonViewCore/Sources/Supporting Files/PrivacyInfo.xcprivacy",
    "chars": 598,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "SkeletonViewCore/Tests/Debug/SkeletonDebugTests.swift",
    "chars": 979,
    "preview": "//\n//  Copyright SkeletonView. All Rights Reserved.\n//\n//  Licensed under the MIT License (the \"License\");\n//  you may n"
  },
  {
    "path": "SkeletonViewCore/Tests/Supporting Files/Info.plist",
    "chars": 723,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n  <key>CFBundleDevelopmentRegion</key>\n  <string>en<"
  },
  {
    "path": "Translations/README_de.md",
    "chars": 27467,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "Translations/README_es.md",
    "chars": 19643,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "Translations/README_fr.md",
    "chars": 23671,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "Translations/README_ko.md",
    "chars": 16657,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "Translations/README_pt-br.md",
    "chars": 17374,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "Translations/README_zh.md",
    "chars": 13035,
    "preview": "![](../Assets/header2.jpg)\n\n<p align=\"center\">\n    <a href=\"https://github.com/Juanpe/SkeletonView/actions?query=workflo"
  },
  {
    "path": "fastlane/Fastfile",
    "chars": 533,
    "preview": "default_platform(:ios)\npodspec_name = \"SkeletonView.podspec\"\n\nlane :bump_version do |options|\n   version_bump_podspec(pa"
  },
  {
    "path": "fastlane/README.md",
    "chars": 757,
    "preview": "fastlane documentation\n----\n\n# Installation\n\nMake sure you have the latest version of the Xcode command line tools insta"
  }
]

About this extraction

This page contains the full source code of the Juanpe/SkeletonView GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 165 files (530.4 KB), approximately 149.0k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!