Skip to content

Commit 6f8cc9f

Browse files
Merge pull request #94 from componentskit/dev
v1.5.2
2 parents 34c4690 + 4c62994 commit 6f8cc9f

File tree

11 files changed

+114
-23
lines changed

11 files changed

+114
-23
lines changed

Examples/DemosApp/DemosApp/ComponentsPreview/PreviewPages/ButtonPreview.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ struct ButtonPreview: View {
3535
Text("Leading").tag(ButtonVM.ImageLocation.leading)
3636
Text("Trailing").tag(ButtonVM.ImageLocation.trailing)
3737
}
38+
Picker("Image Rendering Mode", selection: self.$model.imageRenderingMode) {
39+
Text("Default").tag(Optional<ImageRenderingMode>.none)
40+
Text("Template").tag(ImageRenderingMode.template)
41+
Text("Original").tag(ImageRenderingMode.original)
42+
}
3843
Picker("Image Source", selection: self.$model.imageSrc) {
3944
Text("SF Symbol").tag(ButtonVM.ImageSource.sfSymbol("camera.fill"))
4045
Text("Local").tag(ButtonVM.ImageSource.local("avatar_placeholder"))

Sources/ComponentsKit/Components/Avatar/Models/AvatarVM.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ extension AvatarVM {
9595
self.placeholderBackgroundColor.setFill()
9696
UIBezierPath(rect: CGRect(origin: .zero, size: size)).fill()
9797

98-
icon?.withTintColor(self.placeholderForegroundColor, renderingMode: .alwaysOriginal).draw(in: CGRect(
98+
icon?.withTintColor(self.placeholderForegroundColor).draw(in: CGRect(
9999
x: (size.width - iconSize.width) / 2,
100100
y: (size.height - iconSize.height) / 2,
101101
width: iconSize.width,

Sources/ComponentsKit/Components/Button/Models/ButtonImageSource.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import Foundation
22

3-
/// Defines the image source options for a button.
43
extension ButtonVM {
4+
/// Defines the image source options for a button.
55
public enum ImageSource: Hashable {
66
/// An image loaded from a system SF Symbol.
77
///

Sources/ComponentsKit/Components/Button/Models/ButtonVM.swift

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ public struct ButtonVM: ComponentVM {
3030
/// Defaults to `.leading`.
3131
public var imageLocation: ImageLocation = .leading
3232

33+
/// Defines how image is rendered.
34+
public var imageRenderingMode: ImageRenderingMode?
35+
3336
/// The source of the image to be displayed.
3437
public var imageSrc: ImageSource?
3538

@@ -164,10 +167,18 @@ extension ButtonVM {
164167
case .minimal:
165168
return 0
166169
case .light, .filled, .bordered, .plain:
167-
return switch self.size {
168-
case .small: 16
169-
case .medium: 20
170-
case .large: 24
170+
if self.title.isNotEmpty || self.isLoading {
171+
return switch self.size {
172+
case .small: 16
173+
case .medium: 20
174+
case .large: 24
175+
}
176+
} else {
177+
return switch self.size {
178+
case .small: 8
179+
case .medium: 10
180+
case .large: 12
181+
}
171182
}
172183
}
173184
}
@@ -176,15 +187,14 @@ extension ButtonVM {
176187
extension ButtonVM {
177188
var image: UIImage? {
178189
guard let imageSrc else { return nil }
179-
switch imageSrc {
190+
191+
let image = switch imageSrc {
180192
case .sfSymbol(let name):
181-
return UIImage(systemName: name)?.withTintColor(
182-
self.foregroundColor.uiColor,
183-
renderingMode: .alwaysOriginal
184-
)
193+
UIImage(systemName: name)
185194
case .local(let name, let bundle):
186-
return UIImage(named: name, in: bundle, compatibleWith: nil)
195+
UIImage(named: name, in: bundle, compatibleWith: nil)
187196
}
197+
return image?.withRenderingMode(self.imageRenderingMode)
188198
}
189199
}
190200

Sources/ComponentsKit/Components/Button/SUButton.swift

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,31 @@ public struct SUButton: View {
5959
SULoading(model: self.model.preferredLoadingVM)
6060
Text(self.model.title)
6161
case (false, let uiImage?, .leading) where self.model.title.isEmpty:
62-
ButtonImageView(image: uiImage)
63-
.frame(width: self.model.imageSide, height: self.model.imageSide)
62+
ButtonImageView(
63+
image: uiImage,
64+
tintColor: self.model.foregroundColor.uiColor
65+
)
66+
.frame(width: self.model.imageSide, height: self.model.imageSide)
6467
case (false, let uiImage?, .leading):
65-
ButtonImageView(image: uiImage)
66-
.frame(width: self.model.imageSide, height: self.model.imageSide)
68+
ButtonImageView(
69+
image: uiImage,
70+
tintColor: self.model.foregroundColor.uiColor
71+
)
72+
.frame(width: self.model.imageSide, height: self.model.imageSide)
6773
Text(self.model.title)
6874
case (false, let uiImage?, .trailing) where self.model.title.isEmpty:
69-
ButtonImageView(image: uiImage)
70-
.frame(width: self.model.imageSide, height: self.model.imageSide)
75+
ButtonImageView(
76+
image: uiImage,
77+
tintColor: self.model.foregroundColor.uiColor
78+
)
79+
.frame(width: self.model.imageSide, height: self.model.imageSide)
7180
case (false, let uiImage?, .trailing):
7281
Text(self.model.title)
73-
ButtonImageView(image: uiImage)
74-
.frame(width: self.model.imageSide, height: self.model.imageSide)
82+
ButtonImageView(
83+
image: uiImage,
84+
tintColor: self.model.foregroundColor.uiColor
85+
)
86+
.frame(width: self.model.imageSide, height: self.model.imageSide)
7587
case (false, _, _):
7688
Text(self.model.title)
7789
}
@@ -88,16 +100,20 @@ private struct ButtonImageView: UIViewRepresentable {
88100
}
89101

90102
let image: UIImage
103+
let tintColor: UIColor
91104

92105
func makeUIView(context: Context) -> UIImageView {
93106
let imageView = InternalImageView()
94107
imageView.image = self.image
108+
imageView.tintColor = self.tintColor
95109
imageView.contentMode = .scaleAspectFit
110+
imageView.isUserInteractionEnabled = true
96111
return imageView
97112
}
98113

99114
func updateUIView(_ imageView: UIImageView, context: Context) {
100115
imageView.image = self.image
116+
imageView.tintColor = self.tintColor
101117
}
102118
}
103119

@@ -108,10 +124,10 @@ private struct CustomButtonStyle: SwiftUI.ButtonStyle {
108124
configuration.label
109125
.font(self.model.preferredFont.font)
110126
.lineLimit(1)
111-
.contentShape(.rect)
112127
.padding(.horizontal, self.model.horizontalPadding)
113128
.frame(maxWidth: self.model.width)
114129
.frame(height: self.model.height)
130+
.contentShape(.rect)
115131
.foregroundStyle(self.model.foregroundColor.color)
116132
.background(self.model.backgroundColor?.color ?? .clear)
117133
.clipShape(

Sources/ComponentsKit/Components/Button/UKButton.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,8 @@ extension UKButton {
250250
imageView.image = model.image
251251
imageView.contentMode = .scaleAspectFit
252252
imageView.isHidden = model.isLoading || model.imageSrc.isNil
253+
imageView.tintColor = model.foregroundColor.uiColor
254+
imageView.isUserInteractionEnabled = true
253255
}
254256
}
255257
}

Sources/ComponentsKit/Components/Modal/SwiftUI/Helpers/ModalPresentationModifier.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ struct ModalPresentationModifier<Modal: View>: ViewModifier {
3838
}
3939
}
4040
.fullScreenCover(
41-
isPresented: self.$isPresented,
41+
isPresented: .init(
42+
get: { self.isPresented },
43+
set: { self.isContentVisible = $0 }
44+
),
4245
onDismiss: self.onDismiss,
4346
content: {
4447
self.content()

Sources/ComponentsKit/Components/Modal/SwiftUI/Helpers/ModalPresentationWithItemModifier.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ struct ModalPresentationWithItemModifier<Modal: View, Item: Identifiable>: ViewM
3939
}
4040
}
4141
.fullScreenCover(
42-
item: self.$presentedItem,
42+
item: .init(
43+
get: { self.presentedItem },
44+
set: { self.visibleItem = $0 }
45+
),
4346
onDismiss: self.onDismiss,
4447
content: { item in
4548
self.content(item)

Sources/ComponentsKit/Components/Modal/SwiftUI/SUBottomModal.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ extension View {
309309
return self.bottomModal(
310310
item: item,
311311
model: model,
312+
onDismiss: onDismiss,
312313
header: { _ in EmptyView() },
313314
body: body,
314315
footer: { _ in EmptyView() }

Sources/ComponentsKit/Components/Modal/SwiftUI/SUCenterModal.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ extension View {
271271
return self.centerModal(
272272
item: item,
273273
model: model,
274+
onDismiss: onDismiss,
274275
header: { _ in EmptyView() },
275276
body: body,
276277
footer: { _ in EmptyView() }
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import SwiftUI
2+
import UIKit
3+
4+
/// A type that indicates how images are rendered.
5+
public enum ImageRenderingMode {
6+
/// A mode that renders all non-transparent pixels as the foreground
7+
/// color.
8+
case template
9+
/// A mode that renders pixels of bitmap images as-is.
10+
///
11+
/// For system images created from the SF Symbol set, multicolor symbols
12+
/// respect the current foreground and accent colors.
13+
case original
14+
}
15+
16+
// MARK: - UIKit Helpers
17+
18+
extension ImageRenderingMode {
19+
var uiImageRenderingMode: UIImage.RenderingMode {
20+
switch self {
21+
case .template:
22+
return .alwaysTemplate
23+
case .original:
24+
return .alwaysOriginal
25+
}
26+
}
27+
}
28+
29+
extension UIImage {
30+
func withRenderingMode(_ mode: ImageRenderingMode?) -> UIImage {
31+
if let mode {
32+
return self.withRenderingMode(mode.uiImageRenderingMode)
33+
} else {
34+
return self
35+
}
36+
}
37+
}
38+
39+
// MARK: - SwiftUI Helpers
40+
41+
extension ImageRenderingMode {
42+
var imageRenderingModel: Image.TemplateRenderingMode {
43+
switch self {
44+
case .template:
45+
return .template
46+
case .original:
47+
return .original
48+
}
49+
}
50+
}

0 commit comments

Comments
 (0)