2017년 2월 20일 월요일

UIImagePickerController 를 이용한 Photo Library 사진 로드 @@ in Swift3 - Xcode 8.2 iOS 10

!!중요
info.plist 에서 Privacy - Photo Library Usage Description  키값을 추가하여 Value 값에 글을 넣어야 합니다. 이작업 없이 진행할 경우 무조건 디버깅중에 아래 글 뜨면서 오류 발생


The app's Info.plist must ... key with a string value explaining to the user how the app uses this data.

<참조>
https://swifteyes.blogspot.kr/2016/11/photolibrary-in-swift3-xcode-80-ios-10.html


1. Delegate 추가
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

2. imageView, View  아울레 추가
 //불러온 사진이 들아갈 뷰
@IBOutlet weak var profileImage: UIImageView!
// 터치하여 Photo Library 를 호출
@IBOutlet weak var profileView: UIView
// UIImagePickerController
let ProfileimagePicker = UIImagePickerController()


3. viewDidLoad() 에 Photo Library 를 호출할 뷰에 터치 액션 넣기
override func viewDidLoad() {
  super.viewDidLoad()

// profileView 를 터치하면  photoAddAction() 가 호출된다
let photoAddAction = UITapGestureRecognizer(target: self, action: #selector(self.photoAddAction(_:)))
self.profileView.addGestureRecognizer(photoAddAction)


4. photoAddAction(_ sender: AnyObject) 에 코드 넣기
func photoAddAction(_ sender: AnyObject){
//포토라이브러리 지원여부
  if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.savedPhotosAlbum){

    //에디팅 여부 true 경우 사진을 에디팅 할 수 있는 뷰 나타남, 에디팅 없이 사진 불러오거나  자신이 만든 에디팅뷰 사용할 경우 false로 설정
    ProfileimagePicker.allowsEditing = true
    // camera, Save photoalbum, PhotoLibrary 중 타입 선택

    ProfileimagePicker.sourceType = .photoLibrary
  self.present(ProfileimagePicker, animated: true, completion: nil)
  }else{
    //"사진라이브러리 접근 할 수 없음" 알럿 뷰
    let alertController = UIAlertController(title: "test", message:
    "Can not access the photo library", preferredStyle: UIAlertControllerStyle.alert)
    alertController.addAction(UIAlertAction(title: "Check", style: UIAlertActionStyle.default,handler: nil))
    self.present(alertController, animated: true, completion: nil)
  }
}


4. 에디팅 된 사진 가져오기
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  var newImage: UIImage
  if let possibleImage = info["UIImagePickerControllerEditedImage"] as? UIImage {
    newImage = possibleImage
  } else if let possibleImage = info["UIImagePickerControllerOriginalImage"] as? UIImage {
    newImage = possibleImage
  } else {
    return
  }
//에디팅 후 가져온 사진 이미지뷰에 넣기
  profileImage.image = newImage
  self.dismiss(animated: true, completion: nil)
/*
자신이 만든 에디팅 뷰로 사진을 가져가고 싶다면 아래코드 참조
// 자신이 만든 에디팅 뷰컨트롤러 로드
let uvc = self.storyboard!.instantiateViewController(withIdentifier: "CustomimageView") as! CustomPhotoViewController 
// 뷰넘어가는 퍼포먼스 (없어도됨)
uvc.modalTransitionStyle = UIModalTransitionStyle.coverVertical 
// 커스텀 뷰 컨트롤러의 이미지 뷰에 사진 넣기
uvc.Cropimage = newImage 
self.present(uvc, animated: true, completion: nil)
*/
}

// 포토라이브러리 Cancel 버튼 클릭 시
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  self.dismiss(animated: true, completion: nil)
}

2017년 2월 15일 수요일

CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero Swift3문법으로 사용 @@ in Swift3 - Xcode 8.2 iOS 10

Swift2 에서 사용되던 CGRectMake, CGPointMake, CGSizeMake, CGRectZero, CGPointZero가 Swift3에선 바뀌었다.



CGRect(x: Int, y: Int, width: Int, height: Int
CGVector(dx: Int, dy: Int
CGPoint(x: Double, y: Double
CGSize(width: Int, height: Int)


Example:

let newPoint = stackMid.convert(CGPoint(x: -10, y: 10), to: self)
self.physicsWorld.gravity = CGVector(dx: 0, dy: gravity)
hero.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: 16, height: 18))
let back = SKShapeNode(rect: CGRect(x: 0-120, y: 1024-200-30, width: 240, height: 140), cornerRadius: 20)


더 자세한 내용은 아래 참조

2017년 2월 7일 화요일

UIButton.addTarget 사용 @@ in Swift3 - Xcode 8.2 iOS 10

UIButton.addTarget 사용하기

button.addTarget(self, action:#selector(handle(sender:)), for: .touchUpInside)


func handle(sender: UIButton){ 

  //... 
}

2017년 1월 27일 금요일

Number Pad 에 Done 버튼 추가하기 @@ in Swift3 - Xcode 8.2 iOS 10


TextField 타입중에 Number Pad 타입을 선택할 경우 Done 버튼이 없다
Done 버튼을 추가하고 터치 시 키보드가 사라지는 액션을 추가해보자

스토리보드에 UITextField 를 추가 하고 타입을 Number Pad 로 바꾼다음 아울렛을 추가한다

@IBOutlet weak var numberPad: UITextField!


그리고 UITextField의 아래 이미지처럼 액션을 추가한다 

Event 가 Editing Did Begin 이다 다시 확인 하자

이제 액션함수에  TextField 가 나타나면 위에 Done 버튼을 넣는 코드를 넣는다.

@IBAction func TextFieldAction(_ sender: UITextField) {
  let doneToolbar: UIToolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width:   UIScreen.main.bounds.width, height: 50))
  doneToolbar.barStyle = UIBarStyle.blackTranslucent
  let flexSpace = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)
  let done: UIBarButtonItem = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(doneButtonAction))
  let items = NSMutableArray()
  items.add(flexSpace)
  items.add(done)
  doneToolbar.items = items as? [UIBarButtonItem]
  doneToolbar.sizeToFit()
  self. numberPad.inputAccessoryView = doneToolbar
}



Done 버튼을 눌렀을때 키보드창이 사라지는 함수

func doneButtonAction(){
self. numberPad.resignFirstResponder()
}




2017년 1월 26일 목요일

버튼 (UIButton) 의 @IBAction 을 함수로 호출하기 @@ in Swift3 - Xcode 8.2 iOS 10

스토리보드에서 UIButton을 추가 후 Action과 아울렛, 터치 이벤트를 설정하고 추가하게 되면
아래처럼 추가된다.

@IBOutlet weak var testButton : UIButton! 


@IBAction func ButtonAction(_ sender: Any){
   print("Action Start")
}

스토리보드 상에서 UIButton 을 직접 터치 하지 않고 "Action Start"를  호출하기 위해선
아래처럼 쓰면 된다.

testButton.sendActions(for: .touchUpInside)

위 함수를 호출 시 "Action Start" 가 호출 되는것을 확인 할 수 있다.

2017년 1월 11일 수요일

UICollectionView cell size 변경 @@ in Swift3 - Xcode 8.2 iOS 10

컬렉션 뷰의 셀 사이즈를 변경 하는데 Swift3.0에선 기존 코드가 적용되지 않습니다.
Swift3.0 에서 셀 사이즈를 변경하는 방법을 알아보았습니다.

- 기존 코드 -

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
  return CGSize(width: 150, height: 150) 
}



- Swift3 - 
class ViewController: UICollectionViewDelegateFlowLayout, UICollectionViewDelegate { 
}

* UICollectionViewDelegateFlowLayout을 추가해주는 부분이 변경되었습니다.


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

  return CGSize(width: 150, height: 150)

} }


2017년 1월 6일 금요일

Read - Eval - Print - Loop (REPL) 터미널에서 Swift 코딩하기 @@ Swift3.0

Read - Eval - Print - Loop

명령을 읽고 평가하고 결과를 출력하고 처음으로 돌아가 같은 작업을 반복

* REPL은 명령행 툴이며 간단한 코드를 신속하게 테스트 하는데 환경과 편의를 제공해줍니다. 


REPL 장점

C, C++, Objective - C 언어에서 해야하는 테스트 작업을 하지 않아도 된다는 점

* Command line tools for Xcode 가 설치되어 있어야 합니다. ( Xcode 설치 하면 자동 설치됨)


1. 터미널 실행 > 아래명령어 입력 (한번만 실행, 버전이 바뀔 시 실행)

<sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer>


2. 관리자 비밀번호 입력 후 명령어 입력

<xcrun swift>

잠시후 "Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance." 이란 메세지가 뜹니다

"hello" 를 출력해 보겠습니다.





이제 직접 코드를 넣어 테스트 하시기 바랍니다.


추천 게시물

애플 개발자 등록방법 2016년 5월 8일 기준!!

애플 개발자 등록 절차 1. 개발자 등록 페이지 이동    애플 개발자 로그인 > Account 페이지 이동 > 하단 영역 클릭 (이미지 참조)   >> Enroll 클릭 >> 무조건 승인!! ...