Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?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>SchemeUserState</key>
<dict>
<key>SnapKitPlayground (Playground) 1.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>SnapKitPlayground (Playground) 2.xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>SnapKitPlayground (Playground).xcscheme</key>
<dict>
<key>isShown</key>
<false/>
<key>orderHint</key>
<integer>1</integer>
</dict>
<key>Week3.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//
// AppDelegate.swift
// iOS-Assignment
// Week3
//
// Created by 오서영 on 2024/04/04.
// Created by 오서영 on 2024/04/21.
//

import UIKit
Expand Down
35 changes: 35 additions & 0 deletions Week3/Week3/ChatTableView/ChatModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
//
// ChatModel.swift
// Week3
//
// Created by 오서영 on 2024/04/21.
//

import Foundation
import UIKit

struct ChatModel {
let profileImg: UIImage?
let name: String
let place: String
let message: String
let itemImg: UIImage?
}

extension ChatModel {
static func dummy() -> [ChatModel] {
return [
ChatModel(profileImg: UIImage(named: "profile1"), name: "류희재", place: "성북구", message: "땡큐", itemImg: UIImage(named: "product1")),
ChatModel(profileImg: UIImage(named: "profile2"), name: "윤희슬", place: "여의도", message: "안녕", itemImg: UIImage(named: "product2")),
ChatModel(profileImg: UIImage(named: "profile3"), name: "김가현", place: "잠실", message: "아요", itemImg: UIImage(named: "product3")),
ChatModel(profileImg: UIImage(named: "profile4"), name: "김선우", place: "회기", message: "너무 좋아요", itemImg: UIImage(named: "product4")),
ChatModel(profileImg: UIImage(named: "profile5"), name: "김나연", place: "미국", message: "뿅", itemImg: UIImage(named: "product5")),
ChatModel(profileImg: UIImage(named: "profile1"), name: "김민서", place: "중국", message: "뿡", itemImg: UIImage(named: "product1")),
ChatModel(profileImg: UIImage(named: "profile2"), name: "김수연", place: "일본", message: "자기야 미안해 했자나", itemImg: UIImage(named: "product2")),
ChatModel(profileImg: UIImage(named: "profile3"), name: "한지석", place: "태국", message: "솝트 이딴거 안했어", itemImg: UIImage(named: "product3")),
ChatModel(profileImg: UIImage(named: "profile4"), name: "한정원", place: "명왕성", message: "진짜?", itemImg: UIImage(named: "product4")),
ChatModel(profileImg: UIImage(named: "profile5"), name: "이지훈", place: "안드로메다", message: "난이서~", itemImg: UIImage(named: "product5"))
]
}
}

88 changes: 88 additions & 0 deletions Week3/Week3/ChatTableView/ChatTableViewCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
//
// ChatTableViewCell.swift
// Week3
//
// Created by 오서영 on 2024/04/21.
//

import UIKit

final class ChatTableViewCell: UITableViewCell {

static let identifier = "ChatTableViewCell"

private let profileImageView = UIImageView()

private let nameLabel: UILabel = {
let label = UILabel()
label.textColor = .black
label.textAlignment = .center
label.font = UIFont(name: "Pretendard-Bold", size: 15)
return label
}()
private let placeLabel: UILabel = {
let label = UILabel()
label.textColor = UIColor(red: 156, green: 156, blue: 156, alpha: 1)
label.textAlignment = .left
label.font = UIFont(name: "Pretendard-Bold", size: 12)
return label
}()
private let chatLabel: UILabel = {
let label = UILabel()
label.textColor = .black
label.textAlignment = .left
label.font = UIFont(name: "Pretendard-Bold", size: 14)
return label
}()

private let itemImageView = UIImageView()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)

setLayout()
}

@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

private func setLayout() {
[profileImageView, nameLabel, placeLabel, chatLabel, itemImageView].forEach {
contentView.addSubview($0)
}

profileImageView.snp.makeConstraints {
$0.leading.top.equalToSuperview().offset(16)
$0.size.equalTo(40)
}
nameLabel.snp.makeConstraints {
$0.leading.equalTo(profileImageView.snp.trailing).offset(16)
$0.top.equalToSuperview().offset(16.5)
}

placeLabel.snp.makeConstraints {
$0.leading.equalTo(nameLabel.snp.trailing).offset(4)
$0.top.equalTo(nameLabel).offset(2)
}
chatLabel.snp.makeConstraints {
$0.top.equalTo(placeLabel.snp.bottom).offset(4)
$0.leading.equalTo(nameLabel)
}
itemImageView.snp.makeConstraints {
$0.trailing.bottom.equalToSuperview().inset(16)
$0.size.equalTo(40)
}
}
}

extension ChatTableViewCell {
func dataBind(_ chatData: ChatModel) {
profileImageView.image = chatData.profileImg
nameLabel.text = chatData.name
placeLabel.text = chatData.place
chatLabel.text = chatData.message
itemImageView.image = chatData.itemImg
}
}
60 changes: 60 additions & 0 deletions Week3/Week3/ChatTableView/ChatViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//
// ChatViewController.swift
// Week3
//
// Created by 오서영 on 2024/04/21.
//

import Foundation
import UIKit
import SnapKit

final class ChatViewController: UIViewController {

private let chatList = ChatModel.dummy()
private let tableView = UITableView(frame: .zero, style: .plain)

override func viewDidLoad() {
super.viewDidLoad()

setLayout()
setDelegate()
register()
}

private func setLayout() {
self.view.addSubview(tableView)

tableView.snp.makeConstraints { $0.edges.equalToSuperview() }
}

private func register() {
tableView.register(
ChatTableViewCell.self,
forCellReuseIdentifier: ChatTableViewCell.identifier
)
}

private func setDelegate() {
tableView.delegate = self
tableView.dataSource = self
}
}

extension ChatViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 72
}
}

extension ChatViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return chatList.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: ChatTableViewCell.identifier, for: indexPath) as? ChatTableViewCell else { return UITableViewCell() }
cell.dataBind(chatList[indexPath.row])
return cell
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string>Pretended-Black.otf</string>
<string>Pretended-Bold.otf</string>
<string>Pretended-ExtraBold.otf</string>
<string>Pretended-ExtraLight.otf</string>
<string>Pretended-Light.otf</string>
<string>Pretended-Medium.otf</string>
<string>Pretended-Regular.otf</string>
<string>Pretended-SemiBold.otf</string>
<string>Pretended-Thin.otf</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
Expand All @@ -27,8 +15,6 @@
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
Expand Down
115 changes: 115 additions & 0 deletions Week3/Week3/ItemCollectionView/ItemCollectionViewCell.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
//
// ItemCollectionViewCell.swift
// Week3
//
// Created by 오서영 on 2024/04/21.
//

import Foundation
import UIKit

protocol ItemCollectoinViewCellDelegate: AnyObject {
func heartButtonDidTapEvent(state: Bool, row: Int)
}

final class ItemCollectionViewCell: UICollectionViewCell {

static let identifier = "ItemCollectionViewCell"
var itemRow: Int?

weak var delegate: ItemCollectoinViewCellDelegate?

private let itemImageView = UIImageView()

private let nameLabel: UILabel = {
let label = UILabel()
label.textColor = .black
label.textAlignment = .center
label.font = UIFont(name: "Pretendard-Regular", size: 16)
return label
}()

private let priceLabel: UILabel = {
let label = UILabel()
label.textColor = .orange
label.textAlignment = .left
label.font = UIFont(name: "Pretendard-Bold", size: 15)
return label
}()

private lazy var heartButton: UIButton = {
let button = UIButton()
// Use system-provided heart image for the normal state
button.setImage(UIImage(systemName: "heart"), for: .normal)
// Use system-provided filled heart image for the selected state
button.setImage(UIImage(systemName: "heart.fill"), for: .selected)
button.addTarget(self, action: #selector(heartButtonDidTap), for: .touchUpInside)
return button
}()


override init(frame: CGRect) {
super.init(frame: frame)

self.backgroundColor = .white
setLayout()
}

override func prepareForReuse() {
super.prepareForReuse()

self.heartButton.isSelected = false
}

@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

private func setLayout() {
[itemImageView, nameLabel, priceLabel, heartButton].forEach {
contentView.addSubview($0)
}

itemImageView.snp.makeConstraints {
$0.top.equalToSuperview()
$0.horizontalEdges.equalToSuperview().inset(9)
$0.bottom.equalToSuperview().inset(59)
}

nameLabel.snp.makeConstraints {
$0.top.equalTo(itemImageView.snp.bottom).offset(2)
$0.leading.equalToSuperview().offset(9)
}

priceLabel.snp.makeConstraints {
$0.top.equalTo(nameLabel.snp.bottom).offset(2)
$0.leading.equalToSuperview().offset(9)
}

heartButton.snp.makeConstraints {
$0.trailing.bottom.equalTo(itemImageView).inset(8)
$0.size.equalTo(16)
}
}

@objc func heartButtonDidTap() {
self.heartButton.isSelected.toggle()
if let itemRow {
self.delegate?.heartButtonDidTapEvent(
state: self.heartButton.isSelected,
row: itemRow
)
}
}
}

extension ItemCollectionViewCell {
func dataBind(_ itemData: ItemModel, itemRow: Int) {
itemImageView.image = itemData.itemImg
nameLabel.text = itemData.name
priceLabel.text = itemData.price
heartButton.isSelected = itemData.heartIsSelected
self.itemRow = itemRow
}
}
Loading