Skip to content

Projeto completo para estudos #53

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
//
// ActivityCellView.swift
// FinanceApp
//
// Created by Joao Gripp on 31/08/22.
//

import UIKit

final class ActivityCellView: UITableViewCell {

private lazy var mainStackView: UIStackView = {
let stack = UIStackView(frame: .zero)
stack.translatesAutoresizingMaskIntoConstraints = false
stack.spacing = 8
stack.alignment = .center
stack.isLayoutMarginsRelativeArrangement = true
stack.layoutMargins = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0)
stack.addArrangedSubview(categoryImageView)
stack.addArrangedSubview(labelsStackView)
return stack
}()

private lazy var labelsStackView: UIStackView = {
let stack = UIStackView(frame: .zero)
stack.translatesAutoresizingMaskIntoConstraints = false
stack.axis = .vertical
stack.spacing = 8
stack.addArrangedSubview(activityNameLabel)
stack.addArrangedSubview(activityInfoLabel)
return stack
}()

private lazy var categoryImageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.layer.cornerRadius = 25
imageView.layer.masksToBounds = true
imageView.image = UIImage(named: "bag.circle.fill")
imageView.tintColor = .systemPurple
return imageView
}()

private lazy var activityNameLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.boldSystemFont(ofSize: 17)
return label
}()

private lazy var activityInfoLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.textColor = .gray
label.font = UIFont.systemFont(ofSize: 14)
return label
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
accessoryType = .disclosureIndicator
setupView()
}

required init?(coder: NSCoder) {
return nil
}
}

// MARK: ViewCodeProtocol
extension ActivityCellView: ViewCodeProtocol {
func buildViewHierarchy() {
addSubview(mainStackView)
}

func setupConstraints() {
NSLayoutConstraint.activate([
mainStackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
mainStackView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor),
mainStackView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
mainStackView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
categoryImageView.widthAnchor.constraint(equalToConstant: 50),
categoryImageView.heightAnchor.constraint(equalToConstant: 50),
])
}
}

extension ActivityCellView {
func setupCell(activity: Activity) {
activityNameLabel.text = activity.name
activityInfoLabel.text = String.activityDetails(with: activity.price, and: activity.time)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//
// ActivityListView.swift
// FinanceApp
//
// Created by Joao Gripp on 01/09/22.
//

import UIKit

protocol ActivityListViewDelegate: AnyObject {
func didSelectedActivity(_ activity: Activity)
}

final class ActivityListView: UIView {

private(set) lazy var tableView: UITableView = {
let tableView = UITableView(frame: .zero)
tableView.translatesAutoresizingMaskIntoConstraints = false
tableView.register(ActivityCellView.self, forCellReuseIdentifier: cellIdentifier)
tableView.dataSource = self
tableView.delegate = self
return tableView
}()

var activities: [Activity] = [] {
didSet {
tableView.reloadData()
}
}

weak var delegate: ActivityListViewDelegate?
static let cellSize = CGFloat(82)
private let cellIdentifier = "ActivityCellIdentifier"

init() {
super.init(frame: .zero)
setupView()
}

required init?(coder: NSCoder) {
return nil
}
}

// MARK: ViewCodeProtocol
extension ActivityListView: ViewCodeProtocol {
func buildViewHierarchy() {
addSubview(tableView)
}

func setupConstraints() {
NSLayoutConstraint.activate([
tableView.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
tableView.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
tableView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
tableView.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor),
])
}

func setupAdditionalConfiguration() {
backgroundColor = .white
tableView.separatorStyle = .none
}

}

// MARK: UITableViewDataSource
extension ActivityListView: UITableViewDataSource {

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "Activity"
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return activities.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ActivityCellView
cell.setupCell(activity: activities[indexPath.row])
return cell
}
}

// MARK: UITableViewDelegate
extension ActivityListView: UITableViewDelegate {

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return ActivityListView.cellSize
}

public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
delegate?.didSelectedActivity(activities[indexPath.row])
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
//
// ContactCellView.swift
// FinanceApp
//
// Created by Julio Fernandes on 10/09/22.
//

import UIKit

final class ContactCellView: UITableViewCell {

private lazy var mainStackView: UIStackView = {
let stack = UIStackView(frame: .zero)
stack.translatesAutoresizingMaskIntoConstraints = false
stack.spacing = 16
stack.alignment = .center
stack.addArrangedSubview(avatarImageView)
stack.addArrangedSubview(labelsStackView)
return stack
}()

private lazy var labelsStackView: UIStackView = {
let stack = UIStackView(frame: .zero)
stack.translatesAutoresizingMaskIntoConstraints = false
stack.axis = .vertical
stack.spacing = 8
stack.addArrangedSubview(contactNameLabel)
stack.addArrangedSubview(contactPhoneLabel)
return stack
}()

private lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.translatesAutoresizingMaskIntoConstraints = false
imageView.layer.cornerRadius = 25
imageView.layer.masksToBounds = true
imageView.image = UIImage(named: "avatar-placeholder")
return imageView
}()

private lazy var contactNameLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.font = UIFont.boldSystemFont(ofSize: 17)
return label
}()

private lazy var contactPhoneLabel: UILabel = {
let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.textColor = .gray
label.font = UIFont.systemFont(ofSize: 14)
return label
}()

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

required init?(coder: NSCoder) {
return nil
}
}

extension ContactCellView: ViewCodeProtocol {
func buildViewHierarchy() {
addSubview(mainStackView)
}

func setupConstraints() {
NSLayoutConstraint.activate([
mainStackView.topAnchor.constraint(equalTo: topAnchor),
mainStackView.bottomAnchor.constraint(equalTo: bottomAnchor),
mainStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 16),
mainStackView.trailingAnchor.constraint(equalTo: trailingAnchor),
avatarImageView.widthAnchor.constraint(equalToConstant: 50),
avatarImageView.heightAnchor.constraint(equalToConstant: 50),
])
}

func setupAdditionalConfiguration() {
accessoryType = .disclosureIndicator
}

}

extension ContactCellView {
func setupCell(_ contact: ContactModel) {
contactNameLabel.text = contact.name
contactPhoneLabel.text = contact.phone
}
}
Loading