diff --git a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift index b3bf5bc6..a70f0055 100644 --- a/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift +++ b/Runnect-iOS/Runnect-iOS/Global/Literal/ImageLiterals.swift @@ -42,6 +42,7 @@ enum ImageLiterals { static var icAlert: UIImage { .load(named: "ic_alert") } static var icLocationOverlay: UIImage { .load(named: "ic_location_overlay") } static var icLogoCircle: UIImage { .load(named: "ic_logo_circle") } + static var icMore: UIImage { .load(named: "ic_more") } // img static var imgBackground: UIImage { .load(named: "img_background") } @@ -69,6 +70,7 @@ enum ImageLiterals { static var imgAd: UIImage { .load(named: "img_ad") } } + extension UIImage { static func load(named imageName: String) -> UIImage { guard let image = UIImage(named: imageName, in: nil, compatibleWith: nil) else { diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Contents.json b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Contents.json new file mode 100644 index 00000000..085da527 --- /dev/null +++ b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame 9479.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 9479@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 9479@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479.png new file mode 100644 index 00000000..22facda0 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@2x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@2x.png new file mode 100644 index 00000000..cca4f460 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@2x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@3x.png b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@3x.png new file mode 100644 index 00000000..2b1c94e6 Binary files /dev/null and b/Runnect-iOS/Runnect-iOS/Global/Resource/Assets.xcassets/ic_more.imageset/Frame 9479@3x.png differ diff --git a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift index b3fb7652..84f9bf13 100644 --- a/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift +++ b/Runnect-iOS/Runnect-iOS/Global/UIComponents/CustomNavigationBar.swift @@ -19,6 +19,7 @@ enum NaviType { case title // 좌측 타이틀 case titleWithLeftButton // 뒤로가기 버튼 + 중앙 타이틀 case search // 검색창 + case report // 신고 } final class CustomNavigationBar: UIView { @@ -30,6 +31,7 @@ final class CustomNavigationBar: UIView { private var vc: UIViewController? private var leftButtonClosure: (() -> Void)? private var rightButtonClosure: (() -> Void)? + private var reportButtonClosure: (() -> Void)? // MARK: - UI Components @@ -37,6 +39,7 @@ final class CustomNavigationBar: UIView { private let centerTitleLabel = UILabel() private let leftButton = UIButton() private let rightButton = UIButton() + private let reportButton = UIButton() private let textField = UITextField() // MARK: - initialization @@ -62,13 +65,14 @@ extension CustomNavigationBar { UIView.animate(withDuration: 0.1, delay: 0, options: .curveEaseInOut) { - [self.leftTitleLabel, self.centerTitleLabel, self.leftButton, self.rightButton].forEach { $0.alpha = isHidden ? 0 : 1 } + [self.leftTitleLabel, self.centerTitleLabel, self.leftButton, self.rightButton, self.reportButton].forEach { $0.alpha = isHidden ? 0 : 1 } } } private func setAddTarget() { self.leftButton.addTarget(self, action: #selector(popToPreviousVC), for: .touchUpInside) self.rightButton.addTarget(self, action: #selector(searchLocation), for: .touchUpInside) + self.reportButton.addTarget(self, action: #selector(reportLocation), for: .touchUpInside) } private func setDelegate() { @@ -136,6 +140,24 @@ extension CustomNavigationBar { self.textField.resignFirstResponder() return self } + + @discardableResult + func resetReportButtonAction(_ closure: (() -> Void)? = nil) -> Self { + self.reportButtonClosure = closure + self.reportButton.removeTarget(self, action: nil, for: .touchUpInside) + if closure != nil { + self.reportButton.addTarget(self, action: #selector(reportButtonDidTap), for: .touchUpInside) + } else { + self.setAddTarget() + } + return self + } + + @discardableResult + func hideReportButton() -> Self { + self.reportButton.isHidden = true + return self + } } // MARK: - @objc Function @@ -151,6 +173,11 @@ extension CustomNavigationBar { delegate?.searchButtonDidTap(text: text) } + @objc private func reportLocation() { + self.reportButtonClosure?() + + } + @objc private func rightButtonDidTap() { self.rightButtonClosure?() } @@ -158,6 +185,9 @@ extension CustomNavigationBar { @objc private func leftButtonDidTap() { self.leftButtonClosure?() } + @objc private func reportButtonDidTap() { + self.reportButtonClosure?() + } } // MARK: - UI & Layout @@ -187,6 +217,10 @@ extension CustomNavigationBar { textField.textColor = .g1 textField.addLeftPadding(width: 2) rightButton.setImage(ImageLiterals.icSearch, for: .normal) + + case .report: + reportButton.setImage(ImageLiterals.icArrowBack, for: .normal) + reportButton.isHidden = false } } @@ -198,6 +232,8 @@ extension CustomNavigationBar { setTitleWithLeftButtonLayout() case .search: setSearchLayout() + case .report: + setReportButtonLayout() } } @@ -245,6 +281,21 @@ extension CustomNavigationBar { make.trailing.equalTo(rightButton.snp.leading) } } + + private func setReportButtonLayout() { + self.addSubviews(leftButton, reportButton) + leftButton.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.leading.equalToSuperview() + make.width.height.equalTo(48) + } + reportButton.snp.makeConstraints { make in + make.centerY.equalToSuperview() + make.trailing.equalToSuperview() + make.width.height.equalTo(48) + } + + } } // MARK: - UITextFieldDelegate diff --git a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift index ce70efcb..728f789a 100644 --- a/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift +++ b/Runnect-iOS/Runnect-iOS/Presentation/CourseDetail/VC/CourseDetailVC.swift @@ -35,6 +35,10 @@ final class CourseDetailVC: UIViewController { // MARK: - UI Components private lazy var navibar = CustomNavigationBar(self, type: .titleWithLeftButton) + private let moreButton = UIButton(type: .system).then { + $0.setImage(ImageLiterals.icMore, for: .normal) + $0.tintColor = .g1 + } private lazy var middleScorollView = UIScrollView().then { $0.isScrollEnabled = true $0.showsVerticalScrollIndicator = false @@ -127,6 +131,22 @@ extension CourseDetailVC { getCourseDetailWithPath(courseId: courseId) } + @objc func moreButtonDidTap() { + + let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) + + let saveAction = UIAlertAction(title: "저장하기", style: .default, handler: nil) + let reportAction = UIAlertAction(title: "신고하기", style: .destructive, handler: {(_: UIAlertAction!) in + //report action +}) + let cancelAction = UIAlertAction(title: "닫기", style: .cancel, handler: nil) + + [ saveAction, reportAction, cancelAction ].forEach { alertController.addAction($0) } + + present(alertController, animated: true, completion: nil) + + } + private func pushToCountDownVC() { guard let courseModel = self.courseModel, let path = courseModel.path, @@ -176,6 +196,8 @@ extension CourseDetailVC { private func setAddTarget() { likeButton.addTarget(self, action: #selector(likeButtonDidTap), for: .touchUpInside) + + moreButton.addTarget(self, action: #selector(moreButtonDidTap), for: .touchUpInside) } } @@ -184,11 +206,16 @@ extension CourseDetailVC { // MARK: - Layout Helpers private func setNavigationBar() { view.addSubview(navibar) - + view.addSubview(moreButton) navibar.snp.makeConstraints { make in make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) make.height.equalTo(48) } + moreButton.snp.makeConstraints { make in + make.trailing.equalTo(self.view.safeAreaLayoutGuide).inset(16) + make.centerY.equalTo(navibar) + } + } private func setUI() {