Skip to content

Commit

Permalink
#9 add ClassRoom Api
Browse files Browse the repository at this point in the history
  • Loading branch information
JunseokNoh committed Aug 29, 2021
1 parent 33f4662 commit 6626a51
Show file tree
Hide file tree
Showing 22 changed files with 565 additions and 351 deletions.
4 changes: 4 additions & 0 deletions KNU_CSE/KNU_CSE.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
6801765C26D6B56A00C1EC67 /* DetailImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6801765B26D6B56A00C1EC67 /* DetailImageCell.swift */; };
6801765E26D6D4B600C1EC67 /* CustomPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6801765D26D6D4B600C1EC67 /* CustomPageView.swift */; };
6801766A26DA6AD100C1EC67 /* DetailImageBtn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6801766926DA6AD100C1EC67 /* DetailImageBtn.swift */; };
68183AF326DBC4C300C3E841 /* ISImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68183AF226DBC4C300C3E841 /* ISImageView.swift */; };
681D37B526A419F3000D9FE8 /* MyPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681D37B426A419F3000D9FE8 /* MyPageView.swift */; };
681D37B726A42748000D9FE8 /* NoticeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681D37B626A42748000D9FE8 /* NoticeView.swift */; };
681D37B926A42782000D9FE8 /* ClassRoomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681D37B826A42782000D9FE8 /* ClassRoomView.swift */; };
Expand Down Expand Up @@ -143,6 +144,7 @@
6801765B26D6B56A00C1EC67 /* DetailImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailImageCell.swift; sourceTree = "<group>"; };
6801765D26D6D4B600C1EC67 /* CustomPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomPageView.swift; sourceTree = "<group>"; };
6801766926DA6AD100C1EC67 /* DetailImageBtn.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailImageBtn.swift; sourceTree = "<group>"; };
68183AF226DBC4C300C3E841 /* ISImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ISImageView.swift; sourceTree = "<group>"; };
681D37B426A419F3000D9FE8 /* MyPageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageView.swift; sourceTree = "<group>"; };
681D37B626A42748000D9FE8 /* NoticeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NoticeView.swift; sourceTree = "<group>"; };
681D37B826A42782000D9FE8 /* ClassRoomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClassRoomView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -638,6 +640,7 @@
68F861E026B2EA0C00934BD2 /* UIViewController+extension.swift */,
68C762A526C40FEC00792498 /* Extension+StackView.swift */,
68C762A726C4115D00792498 /* Extension+ScrollView.swift */,
68183AF226DBC4C300C3E841 /* ISImageView.swift */,
);
path = ExtensionUI;
sourceTree = "<group>";
Expand Down Expand Up @@ -1077,6 +1080,7 @@
68F1A5EC26A008FF007B4B86 /* Request.swift in Sources */,
681D37F426A737AE000D9FE8 /* SignInNavigationView.swift in Sources */,
68F1A5EE26A008FF007B4B86 /* BaseObject.swift in Sources */,
68183AF326DBC4C300C3E841 /* ISImageView.swift in Sources */,
681D37B926A42782000D9FE8 /* ClassRoomView.swift in Sources */,
686889CD26D2A2B400486985 /* DeleteAccountViewModel+Model.swift in Sources */,
681D37F926A73F71000D9FE8 /* BoardTitleCollectionCell.swift in Sources */,
Expand Down
16 changes: 8 additions & 8 deletions KNU_CSE/KNU_CSE/Custom/Alert/Alert.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ struct Alert{
var alert : UIAlertController
var title : String
var message : String
var viewController : UIViewController
var viewController : UIViewController?

init(title:String, message:String, viewController:UIViewController) {
init(title:String, message:String, viewController:UIViewController?) {
self.title = title
self.message = message
self.alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
Expand All @@ -23,27 +23,27 @@ struct Alert{
func popUpDefaultAlert(action:((UIAlertAction)->())?){
let actionDefault = UIAlertAction(title: "확인", style: .default,handler: action)
self.alert.addAction(actionDefault)
self.viewController.present(alert, animated: true, completion: nil)
self.viewController?.present(alert, animated: true, completion: nil)
}

func popUpNormalAlert(action:((UIAlertAction)->())?){
let actionCancel = UIAlertAction(title: "취소", style: .destructive, handler: nil)
let actionDefault = UIAlertAction(title: "확인", style: .default,handler: action)
self.alert.addAction(actionCancel)
self.alert.addAction(actionDefault)
self.viewController.present(alert, animated: true, completion: nil)
self.viewController?.present(alert, animated: true, completion: nil)
}
}

import YPImagePicker

struct ActionSheet{
let actionSheet = UIAlertController()
var viewController : UIViewController
var viewController : UIViewController?
var editActioon:((UIAlertAction) -> Void)?
var removeAction:((UIAlertAction) -> Void)?

init(viewController:UIViewController) {
init(viewController:UIViewController?) {
self.viewController = viewController
}

Expand All @@ -62,7 +62,7 @@ struct ActionSheet{
self.actionSheet.addAction(removeBtn)
self.actionSheet.addAction(cancelBtn)

self.viewController.present(self.actionSheet, animated: true, completion: nil)
self.viewController?.present(self.actionSheet, animated: true, completion: nil)
}

mutating func popUpDeleteActionSheet(remove_text:String, removeAction:@escaping((UIAlertAction) -> Void), cancel_text:String){
Expand All @@ -76,7 +76,7 @@ struct ActionSheet{
self.actionSheet.addAction(removeBtn)
self.actionSheet.addAction(cancelBtn)

self.viewController.present(self.actionSheet, animated: true, completion: nil)
self.viewController?.present(self.actionSheet, animated: true, completion: nil)
}

}
80 changes: 10 additions & 70 deletions KNU_CSE/KNU_CSE/Custom/Cell/DetailImageCell.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,27 @@ import UIKit
class DetailImageViewController : UIViewController {
var image: UIImage!


lazy var imageView: UIImageView = {
var imageView = UIImageView()
lazy var imageView: ISImageView! = {
var imageView = ISImageView()
imageView.isInteractable = true
return imageView
}()
var isZooming: Bool = false
var originalImageCenter:CGPoint?

override func viewDidLoad() {
super.viewDidLoad()
self.initUI()
self.addView()
self.setUpConstraints()
}
var isZooming: Bool = false
var originalImageCenter:CGPoint?

deinit {
print("deinit DetailImageVC")
}

func initUI(){
// let pinch = UIPinchGestureRecognizer(target: self, action: #selector(doPinch(_:)))
// self.view.addGestureRecognizer(pinch)

}

func addView(){
Expand All @@ -41,69 +44,6 @@ class DetailImageViewController : UIViewController {
make.height.equalTo(self.imageView.snp.width)
}
}

// @objc func doPinch(_ pinch: UIPinchGestureRecognizer) {
// // 이미지를 스케일에 맞게 변환
//// print(pinch.scale, self.imageView.transform)
//// if self.imageView.transform.a < 0.55 && self.imageView.transform.d < 0.55 {
////// DispatchQueue.main.asyncAfter(deadline: .now() + 0.2){
////// self.imageView.transform.a = 1
////// self.imageView.transform.d = 1
////// }
//// //self.imageView.transform = imageView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
//// }
//// else{
//// self.imageView.transform = imageView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
//// // 다음 변환을 위해 핀치의 스케일 속성을 1로 설정
//// }
//// pinch.scale = 1
//
// if pinch.state == .began || pinch.state == .changed {
// let currentScale = self.imageView.frame.size.width / self.imageView.bounds.size.width
// let newScale = currentScale*pinch.scale
// let transform = CGAffineTransform(scaleX: newScale, y: newScale)
// self.imageView.transform = transform
// pinch.scale = 1
// }
// }

@objc func doPinch(_ sender:UIPinchGestureRecognizer) {

if sender.state == .began {
let currentScale = self.imageView.frame.size.width / self.imageView.bounds.size.width
let newScale = currentScale*sender.scale
if newScale > 1 {
self.isZooming = true
}
print("began \(newScale), \(currentScale) , \(sender.scale)")
} else if sender.state == .changed {
guard let view = sender.view else {return}
let pinchCenter = CGPoint(x: sender.location(in: view).x - view.bounds.midX,
y: sender.location(in: view).y - view.bounds.midY)
let transform = view.transform.translatedBy(x: pinchCenter.x, y: pinchCenter.y)
.scaledBy(x: sender.scale, y: sender.scale)
.translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
let currentScale = self.imageView.frame.size.width / self.imageView.bounds.size.width
var newScale = currentScale*sender.scale
if newScale < 1 {
newScale = 1
let transform = CGAffineTransform(scaleX: newScale, y: newScale)
self.imageView.transform = transform
sender.scale = 1
}else {
view.transform = transform
sender.scale = 1
}
} else if sender.state == .ended || sender.state == .failed || sender.state == .cancelled {
guard let center = self.originalImageCenter else {return}
UIView.animate(withDuration: 0.3, animations: {
self.imageView.transform = CGAffineTransform.identity
self.imageView.center = center
}, completion: { _ in
self.isZooming = false
})
}
}
}

extension DetailImageViewController{
Expand Down
114 changes: 114 additions & 0 deletions KNU_CSE/KNU_CSE/Custom/ExtensionUI/ISImageView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
//
// ISImage.swift
// KNU_CSE
//
// Created by junseok on 2021/08/29.
//

import UIKit

public class ISImageView: UIImageView {
public var isInteractable: Bool = false {
didSet {
guard oldValue != isInteractable else { return }
if isInteractable {
setupGesture()
cellForTarget(superview: superview)?.clipsToBounds = false
isUserInteractionEnabled = true
pinchGesture.map { addGestureRecognizer($0) }
panGesture.map { addGestureRecognizer($0) }
doubleTapGestrue.map {addGestureRecognizer($0)}
} else {
pinchGesture.map { removeGestureRecognizer($0) }
panGesture.map { removeGestureRecognizer($0) }
}
}
}

private var isPinching = false
private var pinchGesture: UIPinchGestureRecognizer?
private var panGesture: UIPanGestureRecognizer?
private var doubleTapGestrue: UITapGestureRecognizer?
private var originalCenter: CGPoint?

private func setupGesture() {
pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinchGesture(sender:)))
pinchGesture?.delegate = self
panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(sender:)))
panGesture?.delegate = self
doubleTapGestrue = UITapGestureRecognizer(target: self, action: #selector(reset))
doubleTapGestrue?.delegate = self
doubleTapGestrue?.numberOfTapsRequired = 2
}

private func cellForTarget(superview: UIView?) -> UIView? {
guard superview != nil else {
return nil
}
if superview is UITableViewCell || superview is UICollectionViewCell {
return superview
} else {
return cellForTarget(superview: superview?.superview)
}
}

@objc private func handlePinchGesture(sender: UIPinchGestureRecognizer) {
switch sender.state {
case .began:
isPinching = sender.scale > 1
layer.zPosition = 1
cellForTarget(superview: superview)?.layer.zPosition = 1
case .changed:
guard let view = sender.view, isPinching else { return }
let center = CGPoint(x: sender.location(in: view).x - view.bounds.midX,
y: sender.location(in: view).y - view.bounds.midY)
view.transform = view.transform
.translatedBy(x: center.x, y: center.y)
.scaledBy(x: sender.scale, y: sender.scale)
.translatedBy(x: -center.x, y: -center.y)
sender.scale = 1
case .ended, .cancelled, .failed:
reset()
break
default:
break
}
}

@objc private func handlePanGesture(sender: UIPanGestureRecognizer) {
switch sender.state {
case .began where isPinching:
originalCenter = sender.view?.center
case .changed where isPinching:
guard let view = sender.view else { return }
let translation = sender.translation(in: self)
view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y)
sender.setTranslation(.zero, in: superview)
default:
break
}
}

@objc private func reset() {
UIView.animate(withDuration: 0.3, animations: {
self.transform = .identity
self.center = self.originalCenter ?? self.center
}) { _ in
self.isPinching = false
self.layer.zPosition = 1
self.cellForTarget(superview: self.superview)?.layer.zPosition = 1
}
}
}

extension ISImageView: UIGestureRecognizerDelegate {
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == pinchGesture && otherGestureRecognizer.view is UIScrollView {
return false
}
if gestureRecognizer == panGesture && otherGestureRecognizer.view is UIScrollView {
return true
}
return true
}
}
29 changes: 18 additions & 11 deletions KNU_CSE/KNU_CSE/Custom/Indicator/Indicator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,31 @@ struct IndicatorView{
color: .black.withAlphaComponent(0.6),
padding: 0)
let loadingView = UIView()
var viewController : UIViewController
var viewController: UIViewController?

init(viewController : UIViewController){
init(viewController: UIViewController?){
self.viewController = viewController
}

init(viewController: UIViewController?, color:UIColor){
self.viewController = viewController
self.indicator.color = color
}

func startIndicator(){
DispatchQueue.main.async {
self.viewController.view.addSubview(self.loadingView)
self.viewController.view.addSubview(self.indicator)
self.viewController?.view.addSubview(self.loadingView)
self.viewController?.view.addSubview(self.indicator)
self.loadingView.backgroundColor = UIColor.init(cgColor: CGColor(red: 220, green: 220, blue: 220, alpha: 0.5))
self.loadingView.snp.makeConstraints{ make in
make.top.left.right.bottom.equalTo(self.viewController.view).offset(0)
}
self.indicator.snp.makeConstraints{ make in
make.width.equalToSuperview().multipliedBy(0.1)
make.height.equalToSuperview().multipliedBy(0.1)
make.center.equalTo(self.viewController.view)
if let VC = self.viewController {
self.loadingView.snp.makeConstraints{ make in
make.top.left.right.bottom.equalTo(VC.view).offset(0)
}
self.indicator.snp.makeConstraints{ make in
make.width.equalToSuperview().multipliedBy(0.1)
make.height.equalToSuperview().multipliedBy(0.1)
make.center.equalTo(VC.view)
}
}
self.indicator.startAnimating()
}
Expand Down
Loading

0 comments on commit 6626a51

Please sign in to comment.