간단한 tableview - 스토리보드 없이 코드로만 만들어보기  



소스코드 첨부

TableViewCode.zip





AppDelegate.swift

//

//  AppDelegate.swift

//  TableViewCode

//

//  Created by MacBookPro on 2018. 2. 8..

//  Copyright © 2018년 MacBookPro. All rights reserved.

//


import UIKit


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

       window = UIWindow(frame: UIScreen.main.bounds)

        window?.makeKeyAndVisible()

        window?.rootViewController = UINavigationController(rootViewController: MessageController())

        return true

    }


    func applicationWillResignActive(_ application: UIApplication) {

        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.

    }


    func applicationDidEnterBackground(_ application: UIApplication) {

        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    }


    func applicationWillEnterForeground(_ application: UIApplication) {

        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.

    }


    func applicationDidBecomeActive(_ application: UIApplication) {

        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    }


    func applicationWillTerminate(_ application: UIApplication) {

        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    }



}


MessageController.swift

//

//  MessageController.swift

//  TableViewCode

//

//  Created by MacBookPro on 2018. 2. 8..

//  Copyright © 2018년 MacBookPro. All rights reserved.

//


import UIKit


class MessageController: UITableViewController {


    var users = [User]()

    

    let cellId = "Cell"

    

    override func viewDidLoad() {

        super.viewDidLoad()

        //밑에서 만든 테이블 뷰 cell 클래스를 등록시켜주기

        tableView.register(UserCell.self, forCellReuseIdentifier: cellId)

        

        tableView.backgroundColor = .white

        //데이터 넣어주기

        let usera = User(image: "a.jpg", name: "홍길동", message: "밥먹었어?")

        let userb = User(image: "b.jpg", name: "박미선", message: "하이루?")

        let userc = User(image: "c.jpg", name: "강호동강호동강호동강호동강호동강호동강호동강호동강호동", message: "행님아~!~~~~~~~~~~~~~~~~~~~~?")

        users.append(usera)

        users.append(userb)

        users.append(userc)

        

    }



    //테이블 뷰 셀 개수

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return users.count

    }


    //테이블 뷰 셀을 구성하는 함수

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! UserCell

        cell.myImage.image = UIImage(named: users[indexPath.row].image)

        cell.myLableOne.text = users[indexPath.row].name

        cell.myLableTwo.text = users[indexPath.row].message

        return cell

    }

    

    //테이블 높이 설정

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

        return 80

    }



}




//테이블 뷰 셀 커스터 마이징 하기

class UserCell: UITableViewCell {

    

    

    //이미지 뷰

    let myImage: UIImageView = {

    

    let img = UIImageView()

    img.translatesAutoresizingMaskIntoConstraints = false

    img.backgroundColor = .yellow

    img.layer.cornerRadius = 24

    img.layer.masksToBounds = true

   // img.contentMode = .scaleAspectFit

    return img

    }()

    //라벨 1

    let myLableOne : UILabel = {

        let lbo = UILabel()

        //lbo.text = "text1"

        lbo.translatesAutoresizingMaskIntoConstraints = false

        lbo.numberOfLines = 0

        lbo.sizeToFit()

        lbo.font = UIFont.boldSystemFont(ofSize: 14)

        //lbo.backgroundColor = .blue

        return lbo

    }()

    //라벨 2

    let myLableTwo: UILabel = {

        let lbo = UILabel()

        //lbo.text = "text2"

         lbo.numberOfLines = 0

           lbo.sizeToFit()

        lbo.translatesAutoresizingMaskIntoConstraints = false

        lbo.font = UIFont.boldSystemFont(ofSize: 12)

       //// lbo.backgroundColor = .blue

        return lbo

    }()

    

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {

        super.init(style: .default, reuseIdentifier: "Cell")

        //계층 구조도에 따라서 cell에 위에서 만든 view 객체들을 넣어주기

       addSubview(myImage)

        addSubview(myLableOne)

       addSubview(myLableTwo)

        

        setupImage()

    }

    

    //제약조건 설정해주기

    func setupImage(){

        

        myImage.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

        myImage.leftAnchor.constraint(equalTo: leftAnchor, constant: 10).isActive = true

        myImage.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 10)

        myImage.widthAnchor.constraint(equalToConstant: 50).isActive = true

        myImage.heightAnchor.constraint(equalToConstant: 50).isActive = true

        

        

        myLableOne.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

        myLableOne.leftAnchor.constraint(equalTo: myImage.rightAnchor, constant: 15).isActive = true

        //myLableOne.rightAnchor.constraint(equalTo: myLableTwo.leftAnchor).isActive = true

        myLableOne.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 10)

        myLableOne.widthAnchor.constraint(equalToConstant: 100).isActive = true

        myLableOne.heightAnchor.constraint(equalToConstant: 10).isActive = true

        

        

        myLableTwo.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true

        //myLableTwo.leftAnchor.constraint(equalTo: myLableOne.rightAnchor, constant: 10)

        myLableTwo.rightAnchor.constraint(equalTo: rightAnchor, constant: -15).isActive = true

        myLableTwo.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 10)

        myLableTwo.widthAnchor.constraint(equalToConstant: 100).isActive = true

        myLableTwo.heightAnchor.constraint(equalToConstant: 10).isActive = true

        

    }


    

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }}


user.swift

import Foundation


class User{

    

    var image: String!

    var name: String!

    var message: String!

    

    init(image:String,name:String,message:String) {

        

        self.image = image

        self.name = name

        self.message = message

    }

    }




간단한 collectionview - 스토리보드 없이 코드로만 만들어보기


소스파일 첨부


CollectionViewCode.zip



AppDelegate.swift

//

//  AppDelegate.swift

//  CollectionViewCode

//

//  Created by MacBookPro on 2018. 2. 8..

//  Copyright © 2018년 MacBookPro. All rights reserved.

//


import UIKit


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        

        //스토리보드를 사용하지 않겠다.

        window = UIWindow(frame: UIScreen.main.bounds)

        window?.makeKeyAndVisible()

        

        //CollectoinView를 상속받는 HomeController에 UICollectionViewFlowLayout 설정

        let homeController = HomeController(collectionViewLayout: UICollectionViewFlowLayout())

        //최상위 뷰로 HomeController 할당

        window?.rootViewController = UINavigationController(rootViewController: homeController)

        

        return true

    }


    func applicationWillResignActive(_ application: UIApplication) {

        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.

    }


    func applicationDidEnterBackground(_ application: UIApplication) {

        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    }


    func applicationWillEnterForeground(_ application: UIApplication) {

        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.

    }


    func applicationDidBecomeActive(_ application: UIApplication) {

        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    }


    func applicationWillTerminate(_ application: UIApplication) {

        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    }



}



HomeController.swift

//

//  HomeController.swift

//  CollectionViewCode

//

//  Created by MacBookPro on 2018. 2. 8..

//  Copyright © 2018년 MacBookPro. All rights reserved.

//


import UIKit


class MyCell: UICollectionViewCell{

    //부모 메서드 초기화 시켜줘야 한다.

    override init(frame: CGRect) {

        super.init(frame: frame)

        setupView()

    }

    

    required init?(coder aDecoder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

    

    //셀에 이미지 뷰 객체를 넣어주기 위해서 생성

    let myImage: UIImageView = {

        let img = UIImageView()

        //자동으로 위치 정렬 금지

        img.translatesAutoresizingMaskIntoConstraints = false

        return img

    }()

    

    func setupView(){

        backgroundColor = .yellow

        //셀에 위에서 만든 이미지 뷰 객체를 넣어준다.

        addSubview(myImage)

        //제약조건 설정하기

        myImage.topAnchor.constraint(equalTo: self.topAnchor).isActive = true

        myImage.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true

         myImage.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true

          myImage.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true

        //myImage.widthAnchor.constraint(equalToConstant: 0).isActive = true

        //myImage.heightAnchor.constraint(equalToConstant: 0).isActive = true

    }

}





private let reuseIdentifier = "Cell"


//코드로 만들때는 uicollectionviewdatasource와 delegate 프로토콜을 상속 받을 필요가 없다.

class HomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout {


    let images = ["a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg"]

    

    override func viewDidLoad() {

        super.viewDidLoad()

        collectionView?.backgroundColor = .white

        //셀 등록

        self.collectionView!.register(MyCell.self, forCellWithReuseIdentifier: reuseIdentifier)

    }

    //컬렉션뷰의 셀 개수

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return images.count

    }


    //셀을 구숭하는 함수

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        //셀 참조 값 가져오기

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! MyCell

        

        //이미지 삽입

        cell.myImage.image = UIImage(named: images[indexPath.row])

        return cell

    }


    //셀크기

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

        let collWidth = collectionView.frame.width / 3 - 1

        return CGSize(width: collWidth, height: collWidth)

    }

    

    //위아래 간격

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {

        return 1

    }

    //좌우간격

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {

        return 1

    }

}




스토리보드를 이용해서 만드는 것과 차이점은 uiimage 객체를 직접 코드로 만들어 줘야 한다는점, delegate, datasource 프로토콜 메소드를 상속받을 필요 없다는 점. 단지 셀의 사이즈를 담당하는 UICollectionViewDelegateFlowLayout=만 상속 받으면 셀의 크기를 조정하는 건 동일 하다. 또한 코드로 만들때 상속받아야되는 메소드들이 있고, 상속을 받고 부모 메서드를 초기화해줘야 한다는 점이이 있다. 복잡한 화면을 구현 할때는 코드로 만들고 간단한 화면을 구현할때는 스토리 보드로 만들면 될것 같다.



간단한 collectionview 


소스파일 첨부

StroyBoardCollectionView1.zip




오른쪽 하단에 오브젝트 파레트에서 collecionview를 왼쪽 마우스로 끌어다가 스토리보드에넣고 cell에 imageview를 넣어준다.

cell identifiter는 RowCell로 해준다. 그리고 흰 바탕화면을 오른쪽 드래그 해서 위쪽 노란색 동그라미에 가져다 두면 datasource와 delegate 메뉴가 뜨는데 클릭해준다.

*나중에 소스코드에서 따로 셀을 구성하는 custom class를 만들어서 연결 시켜 줄것임


소스



import UIKit


//필요한 프로토콜 상속 받기

class ViewController: UIViewController,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout {


    

    

    let images = ["a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg","a.jpg","b.jpg","c.jpg"]

    

    override func viewDidLoad() {

        super.viewDidLoad()

    

    }


    

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        //이미지 카운터 하는 함수

        return images.count

    }

    

    //셀 구성하기

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RowCell", for: indexPath) as! CustomCell

        cell.image.image = UIImage(named: images[indexPath.row])

        return cell

    }

    

    

    // 사이즈

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

      let collectionViewCellWithd = collectionView.frame.width / 3 - 1

        return CGSize(width: collectionViewCellWithd, height: collectionViewCellWithd)

    }


    //위아래 라인 간격

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {

        return 1

    }

    //옆 라인 간격

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {

        return 1

    }

    

}


//커스텀 셀 구현

class CustomCell: UICollectionViewCell {

    

    @IBOutlet weak var image: UIImageView!

}















24 ios 스위프트 핀치기능으로 이미지 확대 축소하기



//

//  ViewController.swift

//  PinchGesture

//

//  Created by MacBookPro on 2017. 11. 30..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    

    @IBOutlet weak var imgPinch: UIImageView!

    

    //핀치 제스처가 발생했을 때 현재 글자 크기를 저장

    //var initialFontSize: CGFloat!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        //클래스 상수 선언, aciton은 pinch 메서드가 실행될때 작동

        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinch(_:)))

        //핀치제스쳐 등록

        self.view.addGestureRecognizer(pinch)

    }


    //액션 함수

    @objc func doPinch(_ pinch: UIPinchGestureRecognizer){

        // imgPinch를 scale에 맞게 변환

        imgPinch.transform = imgPinch.transform.scaledBy(x: pinch.scale, y: pinch.scale)

        pinch.scale = 1

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}


23 ios 스위프트 핀치기능으로 문자 확대 축소하기


//

//  ViewController.swift

//  PinchGesture

//

//  Created by MacBookPro on 2017. 11. 30..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    @IBOutlet weak var txtPinch: UILabel!

    

    

    //핀치 제스처가 발생했을 때 현재 글자 크기를 저장

    var initialFontSize: CGFloat!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        //클래스 상수 선언, aciton은 pinch 메서드가 실행될때 작동

        let pinch = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinch(_:)))

        //핀치제스쳐 등록

        self.view.addGestureRecognizer(pinch)

    }


    //액션 함수

    @objc func doPinch(_ pinch: UIPinchGestureRecognizer){

        //핀치 제스쳐의 상태를 확인한다.

        if(pinch.state == UIGestureRecognizerState.began){

            //시작이면 변수에 텍스트의 글자 저장

            initialFontSize = txtPinch.font.pointSize

        }else{

            txtPinch.font = txtPinch.font.withSize(initialFontSize * pinch.scale)

        }

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}


22 ios 스위프트 스와이프 기능 구현

//

//  ViewController.swift

//  SwipeGestuer

//

//  Created by MacBookPro on 2017. 11. 30..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    let numberOfTouch = 2

    

    @IBOutlet weak var imgVIewUp: UIImageView!

    @IBOutlet weak var imgVIewLeft: UIImageView!

    @IBOutlet weak var imgVIewRight: UIImageView!

    @IBOutlet weak var imgVIewDown: UIImageView!

    

    //이미지 배열 선언하기

    //각 방향별로 검은색과 빨간색 이미지를 저장하기 위해 다음과 같이 배열을 선언한다.

    

    var imgLeft = [UIImage]()

    var imgRigth = [UIImage]()

    var imgUp = [UIImage]()

    var imgDown = [UIImage]()

    

    

    //이미지 배열에 이미지 할당 하기

    override func viewDidLoad() {

        super.viewDidLoad()

        

        //배열을 uiimage형으로 만들었기 때문에 append의 인수로 uiimage형의 값을 입력한다.

        //스와이프하면 검은색 화살표가 빨간색이 되도록 하기 위해 처음에는 검은색 화살표의 파일명,

        //그 뒤에는 빨간색 화살표의 파일명을 입력


        imgUp.append(UIImage(named:"arrow-up-black.png")!)

        imgUp.append(UIImage(named:"arrow-up-red.png")!)

        imgUp.append(UIImage(named:"arrow-up-green.png")!)

        imgDown.append(UIImage(named:"arrow-down-black.png")!)

        imgDown.append(UIImage(named:"arrow-down-red.png")!)

        imgDown.append(UIImage(named:"arrow-down-green.png")!)

        imgLeft.append(UIImage(named:"arrow-left-black.png")!)

        imgLeft.append(UIImage(named:"arrow-left-red.png")!)

        imgLeft.append(UIImage(named:"arrow-left-green.png")!)

        imgRigth.append(UIImage(named:"arrow-right-black.png")!)

        imgRigth.append(UIImage(named:"arrow-right-red.png")!)

        imgRigth.append(UIImage(named:"arrow-right-green.png")!)

        

        

        //위에서 할당한 각 이미지 배열의 첫 번째 인자를 이미지 뷰에 할당

        imgVIewUp.image = imgUp[0]

        imgVIewDown.image = imgDown[0]

        imgVIewLeft.image = imgLeft[0]

        imgVIewRight.image = imgRigth[0]

        

        //* UISwipeGestureRecognizer 클래스 상수를 선언한다. 액션 인수는 해당 스와이프 제스처를 실행했을 때 실행할 메서드를 의미 한다.

        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))

        //위에서 선언한 클래스 상수의 direction의 방형을  up으로 설정한다.

        swipeUp.direction = UISwipeGestureRecognizerDirection.up

        //몇 손가락으로 터치를 할것인지 정하기 2손가락으로

        //swipeUp.numberOfTouchesRequired = numberOfTouch

        //뷰 객체의 addGesture~~ 메서드를 이용해서 위쪽 방향의 스와이프 제스처를 등록 한다.

        self.view.addGestureRecognizer(swipeUp)

        

        

        //*아래

        let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))

        swipeDown.direction = UISwipeGestureRecognizerDirection.down

       // swipeDown.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeDown)

        

        //*왼쪽

        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))

        swipeLeft.direction = UISwipeGestureRecognizerDirection.left

       // swipeLeft.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeLeft)

        

        //*오른쪽

        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGesture(_:)))

        swipeRight.direction = UISwipeGestureRecognizerDirection.right

       // swipeRight.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeRight)

        

        

        //------------------ 멀티 스와이프 구현하기 ------------------

        

        let swipeUpMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))

        swipeUpMulti.direction = UISwipeGestureRecognizerDirection.up

        //몇 손가락으로 터치를 할것인지 정하기 2손가락으로

        swipeUpMulti.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeUpMulti)

        

        let swipeDownMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))

        swipeDownMulti.direction = UISwipeGestureRecognizerDirection.down

        swipeDownMulti.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeDownMulti)

        

        let swipeLeftMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))

        swipeLeftMulti.direction = UISwipeGestureRecognizerDirection.left

        swipeLeftMulti.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeLeftMulti)

        

        let swipeRightMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGestureMulti(_:)))

        swipeRightMulti.direction = UISwipeGestureRecognizerDirection.right

        swipeRightMulti.numberOfTouchesRequired = numberOfTouch

        self.view.addGestureRecognizer(swipeRightMulti)

        

    }


    

    //멀티 스와이프 액션 함수

    @objc func respondToSwipeGestureMulti(_ gesture: UIGestureRecognizer){

        

        if let swipeGesture = gesture as? UISwipeGestureRecognizer{

            

            imgVIewUp.image = imgUp[0]

            imgVIewDown.image = imgDown[0]

            imgVIewLeft.image = imgLeft[0]

            imgVIewRight.image = imgRigth[0]

            

            switch swipeGesture.direction {

                

            case UISwipeGestureRecognizerDirection.up:

                imgVIewUp.image = imgUp[2]

            case UISwipeGestureRecognizerDirection.down:

                imgVIewDown.image = imgDown[2]

            case UISwipeGestureRecognizerDirection.up:

                imgVIewLeft.image = imgLeft[2]

            case UISwipeGestureRecognizerDirection.up:

                imgVIewRight.image = imgRigth[2]

            default: break

                

            }

        }

    }

    

    

    

    //스와이프 제스처를 등록할 때 입력한 액션인수는 스와이프 제스쳐를 행했을 때 실행할 메서드를 의미한다.

    @objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer){

        

        if let swipeGesture = gesture as? UISwipeGestureRecognizer {

            

            imgVIewUp.image = imgUp[0]

            imgVIewDown.image = imgDown[0]

            imgVIewLeft.image = imgLeft[0]

            imgVIewRight.image = imgRigth[0]

            

            

            switch swipeGesture.direction{

                

            case UISwipeGestureRecognizerDirection.up:

                imgVIewUp.image = imgUp[1]

            case UISwipeGestureRecognizerDirection.down:

                imgVIewDown.image = imgDown[1]

            case UISwipeGestureRecognizerDirection.left:

                imgVIewLeft.image = imgLeft[1]

            case UISwipeGestureRecognizerDirection.right:

                imgVIewRight.image = imgRigth[1]

            default: break

            }

            

            

            

            

        }

        

    }

    

    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }



}




















21 ios 스위프트 그림그리기 기능 구현

//

//  ViewController.swift

//  Sketch

//

//  Created by MacBookPro on 2017. 11. 30..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {

    

    //스케치 관련 변수 선언

    var lastPoint: CGPoint!     //바로 전에 터치하거나 이동한 위치

    var lineSize: CGFloat = 2.0 // 선의 두께

    var lineColor = UIColor.red.cgColor // 선의 색상

    

    

    @IBOutlet weak var imgView: UIImageView!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    //클리어 클릭 했을때

    @IBAction func clearImageView(_ sender: UIButton) {

        //이미지 지우기

        imgView.image = nil

    }

    


    

    

    

    // --- 터치와 관련된 부모 클래스 오버라이드 후 재정의 하기 --

    //터치가 시작될 때 호출이 된다.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        

        let touch = touches.first! as UITouch   //현재 발생한 이벤트를 가지고 옵니다.

        lastPoint = touch.location(in: imgView)  //터치된 위치를 lastPoint라는 변수에 저장한다.

        

    }

    

    //터치된 손가락이 움직였을 때 호출 된다.

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        

        UIGraphicsBeginImageContext(imgView.frame.size)

        UIGraphicsGetCurrentContext()?.setStrokeColor(lineColor)

        UIGraphicsGetCurrentContext()?.setLineCap(CGLineCap.round) // 라인의 끝모양을 라운드로 설정

        UIGraphicsGetCurrentContext()?.setLineWidth(lineSize)

        

        

        let touch = touches.first! as UITouch   //현재발생한 터치 이벤트를 가지고 온다.

        let currPoint = touch.location(in: imgView) //터치된 위치를 currPoint로 가지고 온다.

        

        //현재 이미지 뷰에 있는 이미지를 이미지 뷰의 크기로 그린다.

        imgView.image?.draw(in: CGRect(x:0, y:0, width: imgView.frame.size.width, height:imgView.frame.size.height))

        

        //이전에 이동위치인 lastPoint로 시작 위치를 이동시킨다.

        UIGraphicsGetCurrentContext()?.move(to: CGPoint(x: lastPoint.x, y: lastPoint.y))

        //lastPoint에서 현재 위치인 currPoint까지 선을 추가한다.

        UIGraphicsGetCurrentContext()?.addLine(to: CGPoint(x:currPoint.x, y:currPoint.y))

        

        UIGraphicsGetCurrentContext()?.strokePath()

        

        imgView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

        //현재 터치된 위치를 lastPoint라는 변수에 할당

        lastPoint = currPoint


    }

    

    //화면에서 손가락이 떼었을 때 호출

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {


        UIGraphicsBeginImageContext(imgView.frame.size)

        UIGraphicsGetCurrentContext()?.setStrokeColor(lineColor)

        UIGraphicsGetCurrentContext()?.setLineCap(CGLineCap.round) // 라인의 끝모양을 라운드로 설정

        UIGraphicsGetCurrentContext()?.setLineWidth(lineSize)

        

        //현재 이미지 뷰에 있는 이미지를 이미지 뷰의 크기로 그린다.

        imgView.image?.draw(in: CGRect(x:0, y:0, width: imgView.frame.size.width, height:imgView.frame.size.height))

        

        //이전에 이동위치인 lastPoint로 시작 위치를 이동시킨다.

        UIGraphicsGetCurrentContext()?.move(to: CGPoint(x: lastPoint.x, y: lastPoint.y))

     

        UIGraphicsGetCurrentContext()?.addLine(to: CGPoint(x:lastPoint.x, y:lastPoint.y))

        

        UIGraphicsGetCurrentContext()?.strokePath()

        

        imgView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

    }

    

    

    //사용자가 기기를 흔들었을 때 이미지 뷰 위에 그렸던 스케치가 지워지도록

    override func motionEnded(_ motion: UIEventSubtype, with event: UIEvent?) {

        if motion == .motionShake{

            imgView.image = nil

        }

    }


    

}


20 ios 스위프트 터치 기능 


//

//  ViewController.swift

//  TapTouch

//

//  Created by MacBookPro on 2017. 11. 30..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    @IBOutlet weak var txtMessage: UILabel!

    @IBOutlet weak var txtTap: UILabel!

    @IBOutlet weak var txtTouch: UILabel!

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    // --- 터치와 관련된 부모 클래스 오버라이드 후 재정의 하기 --

    //터치가 시작될 때 호출이 된다.

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        

        let touch = touches.first! as UITouch   //현재 발생한 이벤트를 가지고 옵니다.

        txtMessage.text = "터치 시작 되었습니다."     //메서드에서 현재 발생한 이벤트의 종류를 출력합니다.

        txtTap.text = String(touch.tapCount)    //touches 세트 안에 포함된 터치의 개수를 출력

        txtTouch.text = String(touches.count) //터치 객체들 중 첫 번째 객체에서 탭의 개수를 가져와 출력한다.

        

    }

    

    //터치된 손가락이 움직였을 때 호출 된다.

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touch = touches.first! as UITouch

        txtMessage.text = "터치가 되고 있습니다."

        txtTap.text = String(touch.tapCount)

        txtTouch.text = String(touches.count)

    }

    

    //화면에서 손가락이 떼었을 때 호출

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touch = touches.first! as UITouch

        txtMessage.text = "터치가 끝났습니다"

        txtTap.text = String(touch.tapCount)

        txtTouch.text = String(touches.count)

    }

}


19 ios 스위프트 그림그리기 선 원 호

//

//  ViewController.swift

//  Drawing

//

//  Created by MacBookPro on 2017. 11. 29..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    @IBOutlet weak var imageView: UIImageView!

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }


    //선

    @IBAction func btnDrawLine(_ sender: UIButton) {

        

        //콘텍스트를 이미지뷰 크기와 같게 설정

        UIGraphicsBeginImageContext(imageView.frame.size)

        //생성한 콘텍스트의 정보를 가져온다.

        let context = UIGraphicsGetCurrentContext()!

        

        //선굵기 설정

        context.setLineWidth(2.0)

        //선 칼라 설정

        context.setStrokeColor(UIColor.red.cgColor)

        //시작위치로 커서 이동

        context.move(to: CGPoint(x:50, y:50))

        context.addLine(to: CGPoint(x:250, y:250))

        context.strokePath()

        

        

        //삼각형 그리기

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.blue.cgColor)

        context.move(to: CGPoint(x:150, y:200))

        context.addLine(to: CGPoint(x:250, y:350))

        context.addLine(to: CGPoint(x:50, y:350))

        context.addLine(to: CGPoint(x:150, y:200))

        context.strokePath()

        

        imageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

    }

    

    //사각형

    @IBAction func btnDrawRectangle(_ sender: UIButton) {

        //콘텍스트를 이미지뷰 크기와 같게 설정

        UIGraphicsBeginImageContext(imageView.frame.size)

        //생성한 콘텍스트의 정보를 가져온다.

        let context = UIGraphicsGetCurrentContext()!

        //선굵기 설정

        context.setLineWidth(2.0)

        //선 칼라 설정

        context.setStrokeColor(UIColor.red.cgColor)

        

        context.addRect(CGRect(x:50, y:100, width:200, height: 200))

        

        context.strokePath()

        

        imageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

        

    }

    

    //원

    @IBAction func btnDrawCircle(_ sender: UIButton) {

        //콘텍스트를 이미지뷰 크기와 같게 설정

        UIGraphicsBeginImageContext(imageView.frame.size)

        //생성한 콘텍스트의 정보를 가져온다.

        let context = UIGraphicsGetCurrentContext()!

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.blue.cgColor)

        context.addEllipse(in: CGRect(x:50, y:50, width: 200, height: 100))

        context.strokePath()

        

        

        context.setLineWidth(5.0)

        context.setStrokeColor(UIColor.green.cgColor)

        

        context.addEllipse(in: CGRect(x: 50, y: 200, width: 200, height: 200))

        context.strokePath()

        

        imageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

    }

    

    //호

    @IBAction func btnDrawArc(_ sender: UIButton) {

        //콘텍스트를 이미지뷰 크기와 같게 설정

        UIGraphicsBeginImageContext(imageView.frame.size)

        //생성한 콘텍스트의 정보를 가져온다.

        let context = UIGraphicsGetCurrentContext()!

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.blue.cgColor)

        

        context.move(to: CGPoint(x:50, y:50))

        context.addArc(tangent1End: CGPoint(x:200, y:50), tangent2End: CGPoint(x:200, y:200), radius: CGFloat(50))

        

        context.addLine(to: CGPoint(x:200, y:200))

        

        context.move(to: CGPoint(x:100, y:250))

        

        context.addArc(tangent1End: CGPoint(x:250, y:250), tangent2End: CGPoint(x:100, y:400), radius: CGFloat(20))

        

        context.addLine(to: CGPoint(x:100, y:400))

        

        context.strokePath()

        

        imageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

        

        

    }

    

    //채우기

    @IBAction func btnDrawFill(_ sender: UIButton) {

        //콘텍스트를 이미지뷰 크기와 같게 설정

        UIGraphicsBeginImageContext(imageView.frame.size)

        //생성한 콘텍스트의 정보를 가져온다.

        let context = UIGraphicsGetCurrentContext()!

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.brown.cgColor)

        context.setFillColor(UIColor.red.cgColor)

        

        let rectangle = CGRect(x:50, y:50, width: 200, height: 100)

        context.addRect(rectangle)

        context.fill(rectangle)

        context.strokePath()

        

        //draw circle

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.blue.cgColor)

        context.setFillColor(UIColor.blue.cgColor)

        let circle = CGRect(x:50, y:200, width: 200, height: 100)

        context.addEllipse(in: circle)

        context.fillEllipse(in: circle)

        context.strokePath()

        

        

        //draw triangle

        context.setLineWidth(4.0)

        context.setStrokeColor(UIColor.purple.cgColor)

        context.setFillColor(UIColor.purple.cgColor)

        context.move(to: CGPoint(x:150, y:350))

        context.addLine(to: CGPoint(x:250, y:450))

        context.addLine(to: CGPoint(x:50, y:450))

        context.addLine(to: CGPoint(x:150, y:350))

        context.fillPath()

        context.strokePath()

        

        

        imageView.image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        

        

        

        

    }

    

    

    

    

}


18 ios 스위프트 사진촬영&사진 불러오기 구현



//

//  ViewController.swift

//  PhotoLibrary

//

//  Created by MacBookPro on 2017. 11. 29..

//  Copyright © 2017년 MacBookPro. All rights reserved.

//



//카메라 포토 라이브러리를 사용하기 위해서 imagePickerController와

//이 컨트롤러를 사용하기 위한 델리게이트 프로토콜이 필요하다.

//그리고 미디어 타입이 정의된 헤더 파일이 있어야 한다.


//import는 다른 파일이나 클래스를 추가하는 역할(이미 만들어진 객체를 사용하기 위해서 import 해줘야 한다.)

import UIKit

import  MobileCoreServices //다양한 타입들을 정의해 놓은 헤더 파일



class ViewController: UIViewController,UINavigationControllerDelegate,UIImagePickerControllerDelegate {


    //인스턴스 변수 생성

    let imagePicker: UIImagePickerController! = UIImagePickerController()

    

    //촬영하거나 포토라이브러리에서 불러온 이미지 저장하는 변수

    var captureImage: UIImage!

    //녹화한 비디오의 url을 저장하는 변수

    var videoURL: URL!

    //이미지 저장 여부를 나타낼 변수

    var flagImageSave = false

    

    

    @IBOutlet weak var imgView: UIImageView!

    

    //사용자가 저장하지 않고 취소할 때

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

        

        //이때는 다시 처음의 뷰 상태로 돌아가야 하므로 현재의 뷰 컨트롤러에 보이는 이미지 피커를 제거하여 초기 뷰를 보여줘야 한다

        self.dismiss(animated: true, completion: nil)

    }

    

    // 사진이나 비디오 촬영을 하거나 포토 라이브러리에서 선택이 끝났을 때 호출되는 메서드

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

        

        //미디어 종류 확인

         let mediaType = info[UIImagePickerControllerMediaType] as! NSString

        

            //미디어 종류가 사진일 경우

            if mediaType.isEqual(to: kUTTypeImage as NSString as String){

                

                //사진을 가져와 captureimage에 저장

                captureImage =  info[UIImagePickerControllerOriginalImage] as! UIImage

                

                //flagImageSave가 참이면 가져온 사진을 포토 라이브러리에 저장 한다.

                if flagImageSave {

                

                    UIImageWriteToSavedPhotosAlbum(captureImage, self, nil, nil)

                }

        

            imgView.image = captureImage

                

                //미디어 종류가 비디오일 경우

            }else if mediaType.isEqual(to: kUTTypeMovie as NSString as String){

                

                if flagImageSave {

                    //촬영한 비디오를 포토 라이브러리에 저장

                    videoURL = (info[UIImagePickerControllerMediaURL] as! URL)

                    UISaveVideoAtPathToSavedPhotosAlbum(videoURL.relativePath, self, nil, nil)

                    

                }

                

        }

        //현재의 뷰 컨트롤러 제거. 즉, 뷰에서 이미지 피커 화면을 제거하여 초기 뷰를 보여준다.

        self.dismiss(animated: true, completion: nil)

    

    }

 

    //경고 표시용 메서드 작성하기

    func myAlert(_ title: String, message: String){

        

        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)

        

        let action=UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil)

        

        alert.addAction(action)

        

        self.present(alert, animated: true, completion: nil)

    }

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    override func didReceiveMemoryWarning() {

        super.didReceiveMemoryWarning()

        // Dispose of any resources that can be recreated.

    }

    

    //사진촬영 버튼

    @IBAction func btnCaptureImageFromCamera(_ sender: UIButton) {

        

        //카메라의 사용가능 여부를 확인

        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {

            

            //이미지 저장 허용

            flagImageSave = true

            

            imagePicker.delegate = self

            //이미지 피커의 소스 타입을 camera로 설정

            imagePicker.sourceType = .camera

            //미디어 타입설정

            imagePicker.mediaTypes = [kUTTypeImage as String]

            //편집 사용 안함

            imagePicker.allowsEditing = false

            //뷰 컨트롤러를 imagePicker로 대채

            present(imagePicker,animated: true, completion: nil)

        }else{

            

            myAlert("camera inaccessable", message: "application cannot access the camera.")

            

        }

        

    }

    

    //사진불러오기 버튼

    @IBAction func btnLoadImageFromLibray(_ sender: UIButton) {

        

        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {

            

            flagImageSave = false

            

            imagePicker.delegate = self

            

            imagePicker.sourceType = .photoLibrary

            

            imagePicker.mediaTypes = [kUTTypeImage as String]

            

            imagePicker.allowsEditing = true

            

            present(imagePicker, animated: true, completion: nil)

            

            

        }else{

            

            myAlert("photo album inaccessable", message: "application cannot access the photo album")

            

        }

        

    }

    //비디오 촬영

    @IBAction func btnRecordVideo(_ sender: UIButton) {

        if (UIImagePickerController.isSourceTypeAvailable(.camera)) {

            

            flagImageSave = true

            

            imagePicker.delegate = self

            imagePicker.sourceType = .camera

            imagePicker.mediaTypes = [kUTTypeMovie as String]

            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)

            

        }else{

            

            myAlert("camera inaccessable", message: "application cannot access the camera")

            

        }


    }

    

    //비디오 불러오기

    @IBAction func btnRecordVideoLibary(_ sender: UIButton) {

        if (UIImagePickerController.isSourceTypeAvailable(.photoLibrary)) {

            flagImageSave = false

            imagePicker.delegate = self

            imagePicker.sourceType = .photoLibrary

            imagePicker.mediaTypes = [kUTTypeMovie as String]

            imagePicker.allowsEditing = false

            present(imagePicker, animated: true, completion: nil)

            

        } else {

            

            myAlert("photo album inaccessable", message: "application cannot access thie photo album")

        }

    }


}






  1. 123123 2017.12.14 19:39 신고

    위 코드중

    //미디어 종류가 사진일 경우
    if mediaType.isEqual(to: kUTTypeImage as NSString as String){

    여기서 as는 무엇을 의미 하나요?

  2. 길위의 개발자 2017.12.14 19:41 신고

    쉽게 말해서 String 타입으로 변환 시킨다는 뜻입니다

    • 123123 2017.12.14 20:18 신고

      그럼

      [] as NSMutableArray

      이것은 빈 배열의 타입을 NSMutableArray로 바꾼다는 것을 의미 하나요?

+ Recent posts

티스토리 툴바