Skip to content

Commit 56e0e1b

Browse files
authored
[NL-8]: 홈 화면 이벤트 핸들링, Ball 컴포넌트 구현 (#26)
* [NL-8]: 추천 영역 버튼 이벤트 핸들링 * [NL-8]: Ball 컴포넌트 구현
1 parent 39c103a commit 56e0e1b

File tree

16 files changed

+504
-5
lines changed

16 files changed

+504
-5
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
//
2+
// Gesture+Combine.swift
3+
// Extension
4+
//
5+
// Created by ttozzi on 8/6/25.
6+
//
7+
8+
import UIKit
9+
import Combine
10+
11+
private final class GesturePublisher: Publisher {
12+
typealias Output = UIGestureRecognizer
13+
typealias Failure = Never
14+
15+
private let view: UIView
16+
private let gestureRecognizer: UIGestureRecognizer
17+
18+
init(view: UIView, gestureRecognizer: UIGestureRecognizer) {
19+
self.view = view
20+
self.gestureRecognizer = gestureRecognizer
21+
}
22+
23+
func receive<S>(subscriber: S) where S: Subscriber, Failure == S.Failure, Output == S.Input {
24+
let subscription = GestureSubscription(
25+
subscriber: subscriber,
26+
view: view,
27+
gestureRecognizer: gestureRecognizer
28+
)
29+
subscriber.receive(subscription: subscription)
30+
}
31+
}
32+
33+
private final class GestureSubscription<S: Subscriber>: Subscription where S.Input == UIGestureRecognizer {
34+
35+
private var subscriber: S?
36+
private weak var view: UIView?
37+
private let gestureRecognizer: UIGestureRecognizer
38+
39+
init(subscriber: S, view: UIView, gestureRecognizer: UIGestureRecognizer) {
40+
self.subscriber = subscriber
41+
self.view = view
42+
self.gestureRecognizer = gestureRecognizer
43+
view.isUserInteractionEnabled = true
44+
view.addGestureRecognizer(gestureRecognizer)
45+
gestureRecognizer.addTarget(self, action: #selector(handleGesture))
46+
}
47+
48+
func request(_ demand: Subscribers.Demand) { }
49+
50+
func cancel() {
51+
subscriber = nil
52+
gestureRecognizer.removeTarget(self, action: #selector(handleGesture))
53+
}
54+
55+
@objc private func handleGesture() {
56+
_ = subscriber?.receive(gestureRecognizer)
57+
}
58+
}
59+
60+
public extension UIView {
61+
func gesturePublisher<T: UIGestureRecognizer>(gestureRecognizer: T) -> AnyPublisher<UIGestureRecognizer, Never> {
62+
return GesturePublisher(view: self, gestureRecognizer: gestureRecognizer).eraseToAnyPublisher()
63+
}
64+
}

DesignSystem/DesignSystem/Resources/Images.xcassets/number_ball.imageset/Contents.json renamed to DesignSystem/DesignSystem/Resources/Images.xcassets/ball_blue.imageset/Contents.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"images" : [
33
{
4-
"filename" : "number_ball.png",
4+
"filename" : "ball_blue.svg",
55
"idiom" : "universal"
66
}
77
],
Lines changed: 51 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "ball_gray.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 51 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "ball_green.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 51 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "ball_red.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 51 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "ball_yellow.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}

0 commit comments

Comments
 (0)