diff --git a/README.md b/README.md
index 8594d4cf..140132cc 100755
--- a/README.md
+++ b/README.md
@@ -520,7 +520,7 @@ override func viewDidLayoutSubviews() {
**Update skeleton**
-You can change the skeleton configuration at any time like its colour, animation, etc. with the following methods:
+You can change the skeleton configuration at any time like its color, animation, etc. with the following methods:
```swift
(1) view.updateSkeleton() // Solid
diff --git a/Translations/README_ko.md b/Translations/README_ko.md
index c63a30ff..e549ecc1 100644
--- a/Translations/README_ko.md
+++ b/Translations/README_ko.md
@@ -25,35 +25,29 @@
**๐ ๋ฒ์ญ์ ๋์์ ์ฃผ์ ๋ถ๋ค: [๐ฌ๐ง](../README.md) . [๐จ๐ณ](README_zh.md) . [๐ง๐ท](README_pt-br.md) . [๐ฐ๐ท](README_ko.md) . [๐ซ๐ท](README_fr.md) . [๐ฉ๐ช](README_de.md)**
-์ค๋๋ ๊ฑฐ์ ๋๋ถ๋ถ์ ์ฑ๋ค์ ๋น๋๊ธฐ ๋ฐฉ์์ API ํธ์ถ์ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
-ํ๋ก์ธ์ค๊ฐ ์๋ํ๋๋์ ๊ฐ๋ฐ์๋ค์ ์์
์ด ์คํ๋๊ณ ์๋ค๋๊ฒ์ ์ฌ์ฉ์๋ค์๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ๋ก๋ฉ ๋ทฐ๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
+์ต๊ทผ ์ฑ๋ค์ ๋๋ถ๋ถ ๋น๋๊ธฐ ๋ฐฉ์์ API ํธ์ถ์ ์ฌ์ฉํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
+ํ๋ก์ธ์ค๊ฐ ์๋ํ๋ ๋์ ๊ฐ๋ฐ์๋ค์ ์์
์ด ์คํ๋๊ณ ์๋ค๋๊ฒ์ ์ฌ์ฉ์๋ค์๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ๋ก๋ฉ ๋ทฐ๋ฅผ ๋ฐฐ์นํฉ๋๋ค.
```SkeletonView```๋ ์ด๋ฌํ ํ์์ ์ํด ๊ณ ์๋์๊ณ , ์ฌ์ฉ์๋ค์๊ฒ ๋ฌด์์ธ๊ฐ ๋ก๋ฉ์ด ๋๊ณ ์๋ค๋๊ฒ์ ๋ณด์ฌ์ฃผ๋ฉด์ ๊ธฐ๋ค๋ฆฌ๋ ์ฝํ
์ธ ์ ๋ํด์๋ ๋ฏธ๋ฆฌ ์ค๋นํ ์ ์๊ฒ ํด์ฃผ๋ ์ฐ์ํ๊ฒ ํํํ ์ ์๋ ๋ฐฉ๋ฒ์
๋๋ค
๋ง๊ป ๋๋ฆฌ์ธ์ ๐
-* [๊ธฐ๋ฅ](#-features)
-* [๊ฐ์ด๋](#-guides)
-* [์ค์น๋ฐฉ๋ฒ](#-installation)
- * [Cocoapods](#using-cocoapods)
- * [Carthage](#using-carthage)
- * [SPM](#using-swift-package-manager)
-* [์ด๋ป๊ฒ ์ฌ์ฉํ๋์?](#-how-to-use)
- * [Collections](#-collections)
- * [Multiline text](#-multiline-text)
- * [Custom colors](#-custom-colors)
- * [Appearance](#-appearance)
- * [Custom animations](#-custom-animations)
- * [Hierarchy](#-hierarchy)
- * [Debug](#-debug)
-* [๋ฌธ์ํ](#-documentation)
-* [์ง์๋๋ OS์ SDK ๋ฒ์ ](#-supported-os--sdk-versions)
-* [Next steps](#-next-steps)
-* [Contributing](#-contributing)
-* [Mentions](#-mentions)
-* [๊ฐ๋ฐ์](#-author)
-* [๋ผ์ด์ผ์ค](#-license)
-
+- [๐ ๊ธฐ๋ฅ](#-๊ธฐ๋ฅ)
+- [๐ฌ ์ฌ์ฉ ๊ฐ์ด๋](#-์ฌ์ฉ-๊ฐ์ด๋)
+- [๐ฒ ์ค์น ๋ฐฉ๋ฒ](#-์ค์น-๋ฐฉ๋ฒ)
+- [๐ ์ฌ์ฉ๋ฒ](#-์ฌ์ฉ๋ฒ)
+ - [๐ฟ Collections](#-collections)
+ - [๐ Text](#-text)
+ - [๐ฆ Appearance](#-appearance)
+ - [๐จ Custom colors](#-custom-colors)
+ - [๐โโ๏ธ Animations](#๏ธ-animations)
+ - [๐ Transitions](#-transitions)
+- [โจ ๊ธฐํ](#-๊ธฐํ)
+- [โค๏ธ ๊ธฐ์ฌํ๊ธฐ](#๏ธ-๊ธฐ์ฌํ๊ธฐ)
+- [๐ข ์์](#-์์)
+- [๐ ์คํฐ์](#-์คํฐ์)
+- [๐จ๐ปโ๐ป ๊ฐ๋ฐ์](#-๊ฐ๋ฐ์)
+- [๐ฎ๐ป ๋ผ์ด์ผ์ค](#-๋ผ์ด์ผ์ค)
## ๐ ๊ธฐ๋ฅ
@@ -65,9 +59,13 @@
- [x] ๊ฐ๋จํ ์ค์ํํธ ๋ฌธ๋ฒ
- [x] ๊ฐ๋ณ๊ณ ๊ฐ๋
์ฑ ์ข์ ์ฝ๋
-## ๐ฌ ์ฌ์ฉ๊ฐ์ด๋
+## ๐ฌ ์ฌ์ฉ ๊ฐ์ด๋
[](https://youtu.be/75kgOhWsPNA)
+| [](https://youtu.be/75kgOhWsPNA)|[](https://youtu.be/MVCiM_VdxVA)|[](https://youtu.be/Qq3Evspeea8)|[](https://www.youtube.com/watch?v=Zx1Pg1gPfxA)
+|:---: | :---: | :---: | :---:
+|[**SkeletonView ๊ฐ์ด๋ - ์์ํ๊ธฐ**](https://youtu.be/75kgOhWsPNA)|[**SkeletonView๋ฅผ ์ฌ์ฉํด ๋ก๋ฉ ๋ทฐ ๋ง๋ค๊ธฐ (Swift 5.2)**](https://youtu.be/MVCiM_VdxVA) by iKh4ever Studio|[**์ฑ์์ ์ค์ผ๋ ํค ๋ก๋ฉ ๋ทฐ ๋ง๋ค๊ธฐ (Swift 5) - Xcode 11, 2020**](https://youtu.be/Qq3Evspeea8) by iOS Academy| [**iOS์์ ๋ฐ์ดํฐ ๋ก๋ฉ ์ ๋๋ฉ์ด์
๋ง๋ค๊ธฐ (์คํ์ธ์ด)**](https://www.youtube.com/watch?v=Zx1Pg1gPfxA) by MoureDev
+
## ๐ฒ ์ค์น ๋ฐฉ๋ฒ
@@ -99,9 +97,11 @@ github "Juanpe/SkeletonView"
]
```
+> ๐ฃ **์ค์!**
+>
+> ๋ฒ์ 1.30.0 ๋ถํฐ, `SkeletonView`๊ฐ **XCFrameworks** ๋ฅผ ์ง์ํฉ๋๋ค. **XCFramework** ๋ฅผ ์ค์นํ๊ณ ์ถ๋ค๋ฉด, ์ด [๋ ํฌ์งํ ๋ฆฌ](https://github.com/Juanpe/SkeletonView-XCFramework.git) ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
-
-## ๐ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์?
+## ๐ ์ฌ์ฉ๋ฒ
`SkeletonView` ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ฑ **3** ๋จ๊ณ๋ง ๊ธฐ์ตํ์ธ์:
@@ -166,7 +166,6 @@ avatarImageView.isSkeletonable = true
>>```SkeletonView``` ๋ ์ฌ๊ท์ ์ผ๋ก ๋์ด์์ต๋๋ค, ๋ง์ฝ ๋ชจ๋ ๋ทฐ์ ๋ํด์ skeleton์ ํธ์ถํ๊ณ ์ถ๋ค๋ฉด, ๋ฉ์ธ ์ปจํ
์ด๋ ๋ทฐ์์ show `method`๋ฅผ ํธ์ถํ์ฌ์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์๋ฉด UIViewControllers๊ฐ ์์ต๋๋ค.
-
### ๐ฟ Collections
ํ์ฌ, ```SkeletonView``` ๋ ```UITableView``` ์ ```UICollectionView```์์ ํธํ๋ฉ๋๋ค.
@@ -177,20 +176,17 @@ avatarImageView.isSkeletonable = true
``` swift
public protocol SkeletonTableViewDataSource: UITableViewDataSource {
- func numSections(in collectionSkeletonView: UITableView) -> Int
+ 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)
}
```
ํด๋น ํ๋กํ ํด์ ๋ณด์๋ค์ํผ ```UITableViewDataSource```๋ฅผ ์์๋ฐ์ ๊ตฌํํ์์ผ๋ฏ๋ก, skeleton์ protocol๊ณผ ๋์ฒด ๊ฐ๋ฅํฉ๋๋ค.
-ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
-``` swift
-func numSections(in collectionSkeletonView: UITableView) -> Int
-// Default: 1
-```
+ํ๋กํ ์ฝ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ ์น์
์ ๋ช ๊ฐ์ ์
(=rows)์ด ๋ค์ด๊ฐ๋์ง ๋ฐํ์์ ๊ณ์ฐ๋ฉ๋๋ค.
``` swift
func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection section: Int) -> Int
@@ -198,21 +194,56 @@ func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection s
// ์ ์ฒด ํ
์ด๋ธ ๋ทฐ๋ฅผ ์ฑ์ฐ๋๋ฐ ํ์ํ ์
์๋ฅผ ๊ณ์ฐํฉ๋๋ค
```
-ํด๋น ๋ฉ์๋๋ ๋น์ ์ด ๊ตฌํํ์ฌ์ผํ cell identifier์ ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํฉ๋๋ค, ํด๋น ๋ฉ์๋๋ ๊ธฐ๋ณธ์ผ๋ก ๊ตฌํํ์ง ์์๋๋ฉ๋๋ค :
+> **์ค์!**
+>> ์ ๋ฉ์๋์์ ```UITableView.automaticNumberOfSkeletonRows``` ๋ฅผ ๋ฆฌํดํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ๊ฐ(default)๊ณผ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. (์ฆ ์ ์ฒด ํ
์ด๋ธ ๋ทฐ๋ฅผ ์ฑ์ฐ๋๋ฐ ํ์ํ ์
์๋ฅผ ๊ณ์ฐํฉ๋๋ค)
+
- ``` swift
- func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier
- ```
+Skeleton ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ cell identifier๋ฅผ ์๊ธฐ ์ํด ๊ตฌํํด์ผ ํ ๋ฉ์๋๋ 1๊ฐ์
๋๋ค. ์ด ๋ฉ์๋๋ ๊ธฐ๋ณธ ๊ฐ์ด ์์ต๋๋ค.
**Example**
- ``` swift
+``` swift
func collectionSkeletonView(_ skeletonView: UITableView, cellIdentifierForRowAt indexPath: IndexPath) -> ReusableCellIdentifier {
return "CellIdentifier"
}
- ```
+```
-> **์ค์!**
-> ๋ง์ฝ ์ฌ์ด์ฆ๊ฐ ๋ณํ๋ ์
์ ์ฌ์ฉํ๋ค๋ฉด (`tableView.rowHeight = UITableViewAutomaticDimension` ),`estimatedRowHeight`๋ฅผ ๋ฌด์กฐ๊ฑด ์ ์ํด์ฃผ์ธ์.
+๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ indexPath์์ cell์ dequeue ํฉ๋๋ค. ํ์ง๋ง skeleton์ด ๋ํ๋๊ธฐ ์ ์ ๋ณํ๋ฅผ ์ฃผ๊ณ ์ถ๋ค๋ฉด ์๋ ์ฝ๋์ ๊ฐ์ด ์์ฑํ๋ฉด ๋ฉ๋๋ค.
+
+``` swift
+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
+}
+```
+
+deque ๋ถ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๊ฒ ๋งก๊ธฐ๋ ๊ฒฝ์ฐ, ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด cell์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
+
+``` swift
+func collectionSkeletonView(_ skeletonView: UITableView, prepareCellForSkeleton cell: UITableViewCell, at indexPath: IndexPath) {
+ let cell = cell as? Cell
+ cell?.textField.isHidden = indexPath.row == 0
+}
+```
+
+Tableview์ header์ footer์๋ skeleton์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด ```SkeletonTableViewDelegate```๋ฅผ ์ฑํํ์ธ์.
+
+``` swift
+public protocol SkeletonTableViewDelegate: UITableViewDelegate {
+ func collectionSkeletonView(_ skeletonView: UITableView, identifierForHeaderInSection section: Int) -> ReusableHeaderFooterIdentifier? // default: nil
+ func collectionSkeletonView(_ skeletonView: UITableView, identifierForFooterInSection section: Int) -> ReusableHeaderFooterIdentifier? // default: nil
+}
+```
+
+> ๐ฃ **์ค์!**
+>
+> 1๏ธโฃ ๋ง์ฝ ์ฌ์ด์ฆ๊ฐ ๋ณํ๋ ์
์ ์ฌ์ฉํ๋ค๋ฉด (`tableView.rowHeight = UITableViewAutomaticDimension` ),`estimatedRowHeight`๋ฅผ ๋ฌด์กฐ๊ฑด ์ ์ํด์ฃผ์ธ์.
+>
+> 2๏ธโฃ **`UITableViewCell`**์ ํญ๋ชฉ์ ์ถ๊ฐํ ๊ฒฝ์ฐ, cell์ ์ง์ ์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ **`contentView`** ์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค.
+> ```swift
+> self.contentView.addSubview(titleLabel) โ
+> self.addSubview(titleLabel) โ
+> ```
๐ฉ๐ผโ๐ซ **์ด๋ป๊ฒ ํน์ ์์์ skeleton ์ ์ง์ ํ ๊น์?**
@@ -229,47 +260,109 @@ func collectionSkeletonView(_ skeletonView: UITableView, numberOfRowsInSection s
``` swift
public protocol SkeletonCollectionViewDataSource: UICollectionViewDataSource {
- func numSections(in collectionSkeletonView: UICollectionView) -> Int
+ func numSections(in collectionSkeletonView: UICollectionView) -> Int // default: 1
func collectionSkeletonView(_ skeletonView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionSkeletonView(_ skeletonView: UICollectionView, cellIdentifierForItemAt indexPath: IndexPath) -> ReusableCellIdentifier
+ func collectionSkeletonView(_ skeletonView: UICollectionView, supplementaryViewIdentifierOfKind: String, at indexPath: IndexPath) -> ReusableCellIdentifier? // default: nil
+ func collectionSkeletonView(_ skeletonView: UICollectionView, skeletonCellForItemAt indexPath: IndexPath) -> UICollectionViewCell? // default: nil
+ func collectionSkeletonView(_ skeletonView: UICollectionView, prepareCellForSkeleton cell: UICollectionViewCell, at indexPath: IndexPath)
+ func collectionSkeletonView(_ skeletonView: UICollectionView, prepareViewForSkeleton view: UICollectionReusableView, at indexPath: IndexPath)
}
```
-```UITableView``` ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๊ฐ์ต๋๋ค.
+์ฌ์ฉ๋ฐฉ๋ฒ์ ```UITableView``` ์ ๊ฐ์ต๋๋ค.
-### ๐ฐ Multiline text
+### ๐ Text

ํ
์คํธ๊ฐ ๋ค์ด์๋ ์์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ```SkeletonView``` ์์ ํ
์คํธ์ ๋ผ์ธ์ ๊ทธ๋ ค์ค๋๋ค.
-๊ทธ๋ฆฌ๊ณ , ์ํ๋ ๋ผ์ธ ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ```numberOfLines``` ์ 0์ผ๋ก ์ค์ ํ๋ค๋ฉด, ์๋์ผ๋ก ํ์ํ ๋ผ์ธ์๋ฅผ ๊ณ์ฐํด์ ๊ทธ๋ ค์ค๋๋ค. ๋์ ๊ฐ์ด ์ค์ ๋์ด์๋ค๋ฉด ์ค์ ๋ ์๋งํผ์ ๋ผ์ธ์ด ๊ทธ๋ ค์ง๋๋ค.
-##### ๐ Customize
+| ํ๋กํผํฐ | ํ์
| ๊ธฐ๋ณธ๊ฐ | Preview
+| ------- | ------- |------- | -------
+| **lastLineFillPercent** | `CGFloat` | `70`| 
+| **linesCornerRadius** | `Int` | `0` | 
+| **skeletonLineSpacing** | `CGFloat` | `10` | 
+| **skeletonPaddingInsets** | `UIEdgeInsets` | `.zero` | 
+| **skeletonTextLineHeight** | `SkeletonTextLineHeight` | `.fixed(15)` | 
+| **skeletonTextNumberOfLines** | `SkeletonTextNumberOfLines` | `.inherited` | 
-๋น์ ์ ๋ฉํฐ๋ผ์ธ์ ์ํด ๋ช๊ฐ์ง ์ต์
์ ์ค์ ํ ์ ์์ต๋๋ค.
+์ฝ๋๋ฅผ ํตํด radius์ ๋น์จ์ ์กฐ์ ํ๊ณ ์ถ๋ค๋ฉด, ํ๋กํผํฐ๋ฅผ ์ค์ ํ์ธ์.
+``` swift
+descriptionTextView.lastLineFillPercent = 50
+descriptionTextView.linesCornerRadius = 5
+```
-| ์์ฑ | ๊ฐ | ๊ธฐ๋ณธ๊ฐ | ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
-| ----------------------------------------------- | --------- | ----- | ---------------------------------- |
-| ๋ง์ง๋ง ๋ผ์ธ์ **ํผ์ผํธ** ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. | `0...100` | `70%` |  |
-| ๋ผ์ธ์ **Corner radius** ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. (**์๋ก์ด๊ธฐ๋ฅ**) | `0...10` | `0` |  |
+**IB/Storyboard**๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ทธ๋ฆผ๊ณผ ๊ฐ์ต๋๋ค.
+
+
-๋ผ์ธ์ radius๋ฅผ ์ง์ ํ๊ธฐ ์ํด์๋ **์ฝ๋** ๋ฅผ ์ด์ฉํฉ๋๋ค, ์๋ ์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค:
-```swift
-descriptionTextView.lastLineFillPercent = 50
-descriptionTextView.linesCornerRadius = 5
+**์ด๋ป๊ฒ ์ํ๋ ๋ผ์ธ ์๋ฅผ ์ค์ ํ ๊น์?**
+
+๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ธ ์๋ `numberofLines` ํ๋กํผํฐ ๊ฐ๊ณผ ๋์ผํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ํ๋ ๋ผ์ธ ์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ `numberOfLines` ์ 0์ผ๋ก ์ค์ ํ๋ค๋ฉด, ์๋์ผ๋ก ํ์ํ ๋ผ์ธ์๋ฅผ ๊ณ์ฐํด์ ๊ทธ๋ ค์ค๋๋ค.
+
+๋ง์ฝ ํน์ ๋ผ์ธ ์๋ก ์ค์ ํ๊ณ ์ถ๋ค๋ฉด `skeletonTextNumberOfLines`๋ฅผ ์ค์ ํฉ๋๋ค. ์ด ํ๋กํผํฐ๋ 2๊ฐ์ ๊ฐ์ ๊ฐ์ง๋๋ค. `inherited`๋ `numberOfLine` ๊ฐ์ ๋ฆฌํดํฉ๋๋ค. `custom(Int)`๋ ์ฐ๊ด ๊ฐ(associated value)์ผ๋ก ํน์ ๋ผ์ธ ์๋ฅผ ๋ฆฌํดํฉ๋๋ค.
+
+์๋ฅผ ๋ค์ด
+
+``` swift
+label.skeletonTextNumberOfLines = 3 // .custom(3)
```
-ํน์ **IB/Storyboard** ๋ฅผ ์ด์ฉํ์ค ์ ์์ต๋๋ค:
+
-
+> **โ ๏ธ ์ฌ๋ผ์ง ์ฃผ์!**
+>
+> **useFontLineHeight** ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋์ **skeletonTextLineHeight**๋ฅผ ์ฌ์ฉํฉ๋๋ค.:
+> ```swift
+> descriptionTextView.skeletonTextLineHeight = .relativeToFont
+> ```
+
+> **๐ฃ ์ค์!**
+>
+> ์ฌ๋ฌ ์ค์ด ์๋ View์ ๊ฒฝ์ฐ , ํ๋์ ์ค์ด ๋ง์ง๋ง ์ค๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
+
+### ๐ฆ Appearance
+
+skeletons์ ๊ธฐ๋ณธ appearance(=์ธํ)์ ๊ฐ์ง๋๋ค. ์, ๊ทธ๋ผ๋์ธํธ, ์ค ์ต์
์ ์ค์ ํ์ง ์์ผ๋ฉด, ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
+
+๊ธฐ๋ณธ ๊ฐ:
+- **tintColor**: `UIColor`
+ - *default: `.skeletonDefault` (`.clouds`์ ๋์ผํ์ง๋ง, ๋คํฌ๋ชจ๋์๋ ์ ์ฉ๋ฉ๋๋ค.)*
+- **gradient**: SkeletonGradient
+ - *default: `SkeletonGradient(baseColor: .skeletonDefault)`*
+- **multilineHeight**: `CGFloat`
+ - *default: 15*
+- **multilineSpacing**: `CGFloat`
+ - *default: 10*
+- **multilineLastLineFillPercent**: `Int`
+ - *default: 70*
+- **multilineCornerRadius**: `Int`
+ - *default: 0*
+- **skeletonCornerRadius**: `CGFloat` (IBInspectable) (์ค์ผ๋ ํค view ๋ชจ์๋ฆฌ๋ฅผ ๋ฅ๊ธ๊ฒ ๋ง๋ค์ด๋ณด์ธ์)
+ - *default: 0*
+
+`SkeletonAppearance.default`๋ฅผ ์ฌ์ฉํด ์ด ๊ธฐ๋ณธ ๊ฐ๋ค์ ์ป์ ์ ์์ต๋๋ค. ์ด ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
+
+``` swift
+SkeletonAppearance.default.multilineHeight = 20
+SkeletonAppearance.default.tintColor = .green
+```
+
+> **โ ๏ธ ์ฌ๋ผ์ง ์ฃผ์!**
+>
+> **useFontLineHeight** ๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๋์ **textLineHeight**๋ฅผ ์ฌ์ฉํฉ๋๋ค.:
+> ```swift
+> SkeletonAppearance.default.textLineHeight = .relativeToFont
+> ```
### ๐จ Custom colors
-๋น์ ์ skeleton์ ์์์ ์ง์ ํ ์ ์์ต๋๋ค. ๊ฐ๋จํ๊ฒ ์ํ๋ ์์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ์๋ฉด ๋ฉ๋๋ค.
+skeleton์ ์์์ ์ง์ ํ ์ ์์ต๋๋ค. ๋จ์ง ์ํ๋ ์์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ฃผ์๋ฉด ๋ฉ๋๋ค.
**๋จ์ ์ด์ฉ๋ฐฉ๋ฒ**
``` swift
@@ -277,6 +370,7 @@ view.showSkeleton(usingColor: UIColor.gray) // Solid
// or
view.showSkeleton(usingColor: UIColor(red: 25.0, green: 30.0, blue: 255.0, alpha: 1.0))
```
+
**๊ทธ๋ผ๋์ธํธ ์ด์ฉ ๋ฐฉ๋ฒ**
``` swift
let gradient = SkeletonGradient(baseColor: UIColor.midnightBlue)
@@ -288,39 +382,14 @@ view.showGradientSkeleton(usingGradient: gradient) // Gradient
```UIColor.turquoise, UIColor.greenSea, UIColor.sunFlower, UIColor.flatOrange ...```

-###### ์ ์ด๋ฏธ์ง๋ [https://flatuicolors.com](https://flatuicolors.com) ์ฌ์ดํธ์์ ๋ฐ์ทํ์ต๋๋ค.
-
-### ๐ฆ Appearance
-
-**์๋ก์ด ์ฌํญ** skeleton ์ ๊ธฐ๋ณธ์ค์ ๊ฐ์ด ์ ํด์ ธ ์์ต๋๋ค. ๋ง์ฝ ์ปค์คํ
์ปฌ๋ฌ๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ฉด, `SkeletonView` ์ ์ง์ ๋์ด์๋ ๊ธฐ๋ณธ์ค์ ์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
-๊ธฐ๋ณธ ์ค์ ๊ฐ:
-- **tintColor**: UIColor
- - *๊ธฐ๋ณธ๊ฐ: .clouds*
-- **gradient**: SkeletonGradient
- - *๊ธฐ๋ณธ๊ฐ: SkeletonGradient(baseColor: .clouds)*
-- **multilineHeight**: CGFloat
- - *๊ธฐ๋ณธ๊ฐ: 15*
-- **multilineSpacing**: CGFloat
- - *๊ธฐ๋ณธ๊ฐ: 10*
-- **multilineLastLineFillPercent**: Int
- - *๊ธฐ๋ณธ๊ฐ: 70*
-- **multilineCornerRadius**: Int
- - *๊ธฐ๋ณธ๊ฐ: 0*
-
-`SkeletonAppearance.default` ์๋ ์ฌ์ฉ ๋์ด์ง๋ ๊ธฐ๋ณธ ๊ฐ๋ค์ด ์ค์ ๋์ด ์์ต๋๋ค . ์๋์ ์ฝ๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค:
-```Swift
-SkeletonAppearance.default.multilineHeight = 20
-SkeletonAppearance.default.tintColor = .green
-```
-
-
-### ๐ค ์ปค์คํ
์ ๋๋ฉ์ด์
+###### ์ ์ด๋ฏธ์ง๋ [https://flatuicolors.com](https://flatuicolors.com) ์ฌ์ดํธ์์ ๋ฐ์ทํ์ต๋๋ค.
-```SkeletonView``` ์๋ ๋๊ฐ์ง ์ ๋๋ฉ์ด์
์ด ๋ด์ฅ๋์ด ์์ต๋๋ค, ๋จ์ *๋ฐ์ด์ค* ์ ๋๋ฉ์ด์
๊ณผ ๊ทธ๋ผ๋์ธํธ *์ฌ๋ผ์ด๋* ์ ๋๋ฉ์ด์
์
๋๋ค .
+### ๐โโ๏ธ Animations
-๊ฒ๋ค๊ฐ, ์ง์ ์ ๋๋ฉ์ด์
์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ ๋ง ๊ฐ๋จํฉ๋๋ค.
+```SkeletonView``` ์๋ ๋ ๊ฐ์ง ์ ๋๋ฉ์ด์
์ด ๋ด์ฅ๋์ด ์์ต๋๋ค, ๋จ์ *๋ฐ์ด์ค* ์ ๋๋ฉ์ด์
๊ณผ ๊ทธ๋ผ๋์ธํธ *์ฌ๋ผ์ด๋* ์ ๋๋ฉ์ด์
์
๋๋ค .
+์ง์ ์ ๋๋ฉ์ด์
์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด ์ ๋ง ๊ฐ๋จํฉ๋๋ค.
Skeleton ์์๋ `showAnimatedSkeleton` ํจ์๋ฅผ ```SkeletonLayerAnimation```์ ์ ์ํ์ฌ ๋ง์ถคํ ์ ๋๋ฉ์ด์
์ ์ ์ํ ์ ์๋๋ก ๋์ด ์์ต๋๋ค.
@@ -351,7 +420,7 @@ view.showAnimatedGradientSkeleton(usingGradient: gradient, animation: animation)
```
-```GradientDirection``` ๋ enum ์ผ๋ก ์ ์ ๋์ด์์ต๋๋ค., ์๋์ ์ผ์ด์ค๋ฅผ ์ฐธ์กฐํ์ธ์:
+```GradientDirection``` ๋ enum ์ผ๋ก ์ ์ ๋์ด์์ต๋๋ค. ์๋์ ์ผ์ด์ค๋ฅผ ์ฐธ์กฐํ์ธ์:
| ๋ฐฉํฅ | ๋ฏธ๋ฆฌ๋ณด๊ธฐ |
| ------------------- | ---------------------------------------------- |
@@ -366,70 +435,166 @@ view.showAnimatedGradientSkeleton(usingGradient: gradient, animation: animation)
์ฌ๋ผ์ด๋ฉ ์ ๋๋ฉ์ด์
์ ๋ง๋ค๊ธฐ ์ํ ๋๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค, ์๋์ ์ฝ๋๋ฅผ ์ฐธ์กฐํ์ธ์:
>>```let animation = GradientDirection.leftToRight.slidingAnimation()```
-### ๐จโ๐งโ๐ฆ ๊ณ์ธต ๊ตฌ์กฐ
+### ๐ Transitions
+
+**SkeletonView** ์๋ ๋ถ๋๋ฝ๊ฒ **show** ํ๊ฑฐ๋ **hide** ํ๋ transition์ด ๋ด์ฅ๋์ด ์์ต๋๋ค.
-```SkeletonView```๋ ์ฌ๊ท์ ์
๋๋ค , ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ skeleton์ด ํจ์จ์ ์ผ๋ก ์๋ํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฅํ ๋นจ๋ฆฌ ์ฌ๊ท์์
์ ์ค๋จํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๋ฌํ ์ด์ ๋๋ฌธ์ ๋ฐ๋์ ์ปจํ
์ด๋ ๋ทฐ๋ฅผ `Skeletonable` ๋ก ์ค์ ํด์ผ ํฉ๋๋ค, `skeletonable` ๋์ง ์๋ ๋ทฐ๋ฅผ ๋ง๋๋ ์๊ฐ ์ฌ๊ท ์์
์ ์ค๋จํ๊ธฐ ๋๋ฌธ์
๋๋ค.
+Transition์ ์ฌ์ฉํ๊ธฐ ์ํด, ```showSkeleton()```๋ ```hideSkeleton()``` ํจ์์ ```transition```ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
+
+```swift
+view.showSkeleton(transition: .crossDissolve(0.25)) //Show skeleton cross dissolve transition with 0.25 seconds fade time
+view.hideSkeleton(transition: .crossDissolve(0.25)) //Hide skeleton cross dissolve transition with 0.25 seconds fade time
+
+```
+
+๊ธฐ๋ณธ ๊ฐ์ `crossDissolve(0.25)` ์
๋๋ค.
+
+**Preview**
+
+
+ |
+
+ |
+
+![]() |
+
+![]() |
+