개발하는 동글 :]

[TIL],[UIkit] 계산기 레이아웃 programmatically 본문

카테고리 없음

[TIL],[UIkit] 계산기 레이아웃 programmatically

동글하다 2023. 7. 19. 14:09

구현 목표

- 코드로 UI 구성하기 :완료

- 문자열을 리턴 받아 문자열을 분리하여 배열로 만들어 준 후 연산하는 기능 구현 하기 : 데이터를 문자열로 전달 받아 배열로 분리하는 과정까지 진행 ex) "123+123" -> ["123","+","123"]

//
//  ViewController.swift
//  fisrtCalcu
//
//  Created by SeoJunYoung on 2023/07/17.
//

import UIKit

class ViewController: UIViewController {
    
    var buttonTitle = ["7","8","9","+/-","4","5","6","*","1","2","3","/","0",".","AC","="]
    var dataManager = DataManager(nowNum: "")
    
    let contentView: UIView = {
       let contentView = UIView()
        contentView.translatesAutoresizingMaskIntoConstraints = false
        contentView.backgroundColor = UIColor.black
        return contentView
    }()
    
    let disPlayView: UIView = {
        let disPlayView = UIView()
        disPlayView.translatesAutoresizingMaskIntoConstraints = false
        disPlayView.backgroundColor = UIColor.white
        return disPlayView
    }()
    
    let disPlayLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = ""
        label.textAlignment = NSTextAlignment.right
        label.font = UIFont.boldSystemFont(ofSize: 30)
        label.textColor = UIColor.black
        return label
    }()
    
    let slideView: UICollectionView = {
        
        let flowLayout = UICollectionViewFlowLayout()
        flowLayout.itemSize = CGSize(width: 50 , height: 50)
        flowLayout.sectionInset = UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)
        let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)
        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.backgroundColor = UIColor.black
        return collectionView
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    func setupUI(){
        contantVIewUI()
        disPlayViewUI()
        slideViewUI()
    }

    func contantVIewUI(){
        view.addSubview(contentView)
        NSLayoutConstraint.activate([
            contentView.topAnchor.constraint(equalTo: view.topAnchor),
            contentView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            contentView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            contentView.bottomAnchor.constraint(equalTo: view.bottomAnchor)
        ])
    }
    func disPlayViewUI(){
        contentView.addSubview(disPlayView)
        NSLayoutConstraint.activate([
            disPlayView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 100),
            disPlayView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10),
            disPlayView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10),
            disPlayView.heightAnchor.constraint(equalToConstant: 150)
        ])
        disPlayView.addSubview(disPlayLabel)
        NSLayoutConstraint.activate([
            disPlayLabel.topAnchor.constraint(equalTo: disPlayView.topAnchor, constant: 10),
            disPlayLabel.leadingAnchor.constraint(equalTo: disPlayView.leadingAnchor, constant: 10),
            disPlayLabel.trailingAnchor.constraint(equalTo: disPlayView.trailingAnchor, constant: -10),
            disPlayLabel.bottomAnchor.constraint(equalTo: disPlayView.bottomAnchor, constant: -10)
        ])
    }
    func slideViewUI(){
        contentView.addSubview(slideView)
        slideView.dataSource = self
        slideView.delegate = self
        slideView.register(ButtonCell.self, forCellWithReuseIdentifier: "ButtonCell")
        NSLayoutConstraint.activate([
            slideView.topAnchor.constraint(equalTo: disPlayView.bottomAnchor, constant: 50),
            slideView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            slideView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            slideView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
        ])
    }
    
    
}
    

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    func collectionView(_ collectionView: UICollectionView,
            layout collectionViewLayout: UICollectionViewLayout,
            sizeForItemAt indexPath: IndexPath) -> CGSize {

                let interval:CGFloat = 5
                let width: CGFloat = ( UIScreen.main.bounds.width - interval * 2 ) / 5
                return CGSize(width: width , height: width + 30)
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return buttonTitle.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        
        if collectionView == slideView{
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ButtonCell", for: indexPath) as! ButtonCell
            cell.button.setTitle(buttonTitle[indexPath.row], for: .normal)
            var myColor = ["+/-","*","/","=","AC"].contains(buttonTitle[indexPath.row]) ? UIColor.yellow : UIColor.gray
            cell.contantView.backgroundColor = myColor
            cell.button.setTitleColor(UIColor.black, for: .normal)
            cell.button.addTarget(self, action: #selector(self.buttonAction), for: .touchUpInside)
            return cell
        }
        
        return UICollectionViewCell()
    }
    
    @objc func buttonAction(_ sender: UIButton){
        
        guard let num = sender.titleLabel?.text else { return }
        
        if num == "="{
            dataManager.makeNumsAry()
            dataManager.nowNum = dataManager.calculation()
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
        } else if num == "AC"{ //완료
            dataManager.nowNum = ""
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
        } else if num == "+/-"{
            var type = dataManager.calToggle ? "+" : "-"
            if dataManager.nowNum.count == 0{
                dataManager.nowNum += type
                self.disPlayLabel.text = dataManager.nowNum
            } else {
                guard let lastChar = dataManager.nowNum.last else{ return }
                if lastChar.isNumber{
                    dataManager.nowNum += type
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += type
                    self.disPlayLabel.text = dataManager.nowNum
                }
            }
            dataManager.calToggle.toggle()
        } else if num == "*"{
            if dataManager.nowNum.count == 0{
                dataManager.nowNum += num
                self.disPlayLabel.text = dataManager.nowNum
            } else {
                guard let lastChar = dataManager.nowNum.last else{ return }
                if lastChar.isNumber{
                    dataManager.nowNum += num
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += num
                    self.disPlayLabel.text = dataManager.nowNum
                }
            }
            dataManager.calToggle = true
        } else if num == "/"{
            if dataManager.nowNum.count == 0{
                dataManager.nowNum += num
                self.disPlayLabel.text = dataManager.nowNum
            } else {
                guard let lastChar = dataManager.nowNum.last else{ return }
                if lastChar.isNumber{
                    dataManager.nowNum += num
                    self.disPlayLabel.text = dataManager.nowNum
                } else {
                    dataManager.nowNum.popLast()
                    dataManager.nowNum += num
                    self.disPlayLabel.text = dataManager.nowNum
                }
            }
            dataManager.calToggle = true
        } else { //완료
            dataManager.nowNum += num
            self.disPlayLabel.text = dataManager.nowNum
            dataManager.calToggle = true
        }
        
    }
    
}