Skip to content

Commit 93a1363

Browse files
authored
Merge pull request #39 from OlegEremenko991/develop/cachedAsyncImagePackage
Вынес CachedAsyncImage в отдельный пакет
2 parents a0486f5 + b086dd5 commit 93a1363

File tree

23 files changed

+98
-92
lines changed

23 files changed

+98
-92
lines changed

SwiftUI-WorkoutApp.xcodeproj/project.pbxproj

Lines changed: 19 additions & 38 deletions
Large diffs are not rendered by default.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.DS_Store
2+
/.build
3+
/Packages
4+
/*.xcodeproj
5+
xcuserdata/
6+
DerivedData/
7+
.swiftpm/config/registries.json
8+
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
9+
.netrc
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// swift-tools-version: 5.6
2+
// The swift-tools-version declares the minimum version of Swift required to build this package.
3+
4+
import PackageDescription
5+
6+
let package = Package(
7+
name: "CachedAcyncImage",
8+
platforms: [.iOS(.v15)],
9+
products: [
10+
// Products define the executables and libraries a package produces, and make them visible to other packages.
11+
.library(
12+
name: "CachedAcyncImage",
13+
targets: ["CachedAcyncImage"]),
14+
],
15+
dependencies: [
16+
// Dependencies declare other packages that this package depends on.
17+
// .package(url: /* package url */, from: "1.0.0"),
18+
],
19+
targets: [
20+
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
21+
// Targets can depend on other targets in this package, and on products in packages this package depends on.
22+
.target(
23+
name: "CachedAcyncImage",
24+
dependencies: [])
25+
]
26+
)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# CachedAcyncImage
2+
3+
Простое решение для кэширования картинок без дополнительных опций

SwiftUI-WorkoutApp/Screens/Common/CacheImage/CacheAsyncImage.swift renamed to SwiftUI-WorkoutApp/CachedAcyncImage/Sources/CachedAcyncImage/CachedAsyncImage.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
11
import SwiftUI
22

33
/// Картинка с возможностью кэширования
4-
struct CacheAsyncImage<Content: View>: View {
4+
public struct CachedAsyncImage<Content: View, Placeholder: View>: View {
55
@StateObject private var loader: ImageLoader
6-
private let placeholderSize: CGSize
6+
private var placeholder: () -> Placeholder
77
private let content: (UIImage) -> Content
88

9-
init(
9+
public init(
1010
url: URL?,
11-
placeholderSize: CGSize = .init(width: 100, height: 100),
12-
@ViewBuilder content: @escaping (UIImage) -> Content
11+
@ViewBuilder content: @escaping (UIImage) -> Content,
12+
@ViewBuilder placeholder: @escaping () -> Placeholder
1313
) {
14-
self.placeholderSize = placeholderSize
1514
self.content = content
15+
self.placeholder = placeholder
1616
_loader = StateObject(wrappedValue: .init(url: url, cache: Environment(\.imageCache).wrappedValue))
1717
}
1818

19-
var body: some View {
19+
public var body: some View {
2020
ZStack {
2121
if let result = loader.image {
2222
content(result)
2323
.transition(.opacity.combined(with: .scale).combined(with: .move(edge: .bottom)))
2424
} else {
25-
RoundedDefaultImage(size: placeholderSize)
25+
placeholder()
2626
}
2727
}
2828
.animation(.easeInOut, value: loader.image)

SwiftUI-WorkoutApp/Screens/Common/CacheImage/ProfileImageRectangle.swift

Lines changed: 0 additions & 19 deletions
This file was deleted.

SwiftUI-WorkoutApp/Screens/Common/CacheImage/CacheImageView.swift renamed to SwiftUI-WorkoutApp/Screens/Common/CachedImage.swift

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
import SwiftUI
2+
import CachedAcyncImage
23

3-
struct CacheImageView: View {
4+
struct CachedImage: View {
45
let url: URL?
56
var mode = Mode.userListItem
67

78
var body: some View {
8-
CacheAsyncImage(url: url, placeholderSize: mode.size) {
9-
Image(uiImage: $0).resizable()
9+
CachedAsyncImage(url: url) { uiImage in
10+
Image(uiImage: uiImage).resizable()
11+
} placeholder: {
12+
RoundedDefaultImage(size: mode.size)
1013
}
11-
.applySpecificSize(mode.size)
14+
.scaledToFit()
15+
.cornerRadius(8)
16+
.frame(width: mode.size.width, height: mode.size.height)
1217
}
1318
}
1419

15-
extension CacheImageView {
20+
extension CachedImage {
1621
enum Mode {
1722
case userListItem, groundListItem, eventListItem,
1823
dialogListItem, genericListItem, journalEntry,
@@ -36,8 +41,8 @@ extension CacheImageView {
3641
struct SmallProfileCacheImageView_Previews: PreviewProvider {
3742
static var previews: some View {
3843
Group {
39-
CacheImageView(url: .init(string: "https://workout.su/img/avatar_default.jpg")!)
40-
CacheImageView(
44+
CachedImage(url: .init(string: "https://workout.su/img/avatar_default.jpg")!)
45+
CachedImage(
4146
url: .init(string: "https://workout.su/img/avatar_default.jpg")!,
4247
mode: .profileAvatar
4348
)

0 commit comments

Comments
 (0)