TabBarViewController가 있으면 그냥 selectedIndex 값을 원하는 값으로 넣으면 된다. 없으면 생성해서 또 추가 해야하니 번거롭다. 


걍 간단하게 TabBarViewController를 따로 만들지 않고 간단하게 스토리보드를 사용하여 앱 실행시 열릴 디폴트 탭을 설정할 수 있다.


  1. 스토리 보드에서 Tab Bar Controller 선택
  2. Indentity Inspector 탭 선택
  3. User Defined Runtime Attributes 에서 + 클릭
  4. Key Path는 "selectedIndex" 로 입력
  5. Type은 "Number" 로 입력
  6. Value는 원하는 인덱스 값 입력 "1"


이렇게 설정을 하면 앱이 실행할 때 설정한 탭으로 열린다. 최종 위치값을 저장해서 열게 할려면 어차피 코딩 작업이 필요하긴 하다.



Posted by KraZYeom

난이도: 하

@available(iOS 5.0, *)
public var multipleSelectionBackgroundView: UIView?

public var selected: Bool // set selected state (title, image, background). default is NO. animated is NO

다중 선택과 체크마크가 필요해서 간단하게 구현하는 방법을 공유하겠다. 오래전에는 이것도 구현을 했었어야 했던 기억이 있는데 엄청 간단하게 바뀌었다.


우선 다중 선택이 가능하게 하기 위해서는 아래 처럼 코드 상으로 다중 선택을 활성화 하거나,

self.tableView!.multipleTouchEnabled = true

스토리보드의 TableView에서 select 부분을 Multiple Selection을 선택을 한다.


그리고 아래 코드처럼 간단하게 구현을 하면 된다.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
  // 1.
  cell.accessoryType = cell.selected ? .Checkmark : .None
  return cell
}

// 2.
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
    cell.accessoryType = .Checkmark
  }
}

// 3.
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
  if let cell = tableView.cellForRowAtIndexPath(indexPath) {
    cell.accessoryType = .None
  }
}
  1. 현재 셀(cell)이 선택 되어 있으냐 아니냐에 따라서 체크 마크를 표시한다.
  2. 선택(select) 되었을 때는 체크 마크로 변경 한다.
  3. 선택 해제(Deselect) 되었을 때는 체크 마크를 제거 한다.




Posted by KraZYeom

난이도: 하


@available(iOS 8.0, *) DeviceOwnerAuthenticationWithBiometrics


@available(iOS 9.0, *) DeviceOwnerAuthentication


앱에 잠금을 하기 위해서 예전에는 직접 구현을 하거나 오픈소스를 가져다 쓰는 등으로 구현을 했었는데 iOS 8.0과 9.0에서 LocalAuthentication 라이브러리를 통해서 Touch ID와 Passcode를 지원하고 있다.


8.0에서는 Touch ID를 이용한 것만 지원하니 8.0에서 Passcode를 지원하려면 오픈소스를 가져다 쓰는게 좋긴하다.


Add Library

Project > Targets > Build Phases > Link Binary with Libraries > + > LocalAuthentication.framework 



사용방법

// 1.
if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, error: &error) { 
// 2.
  context.evaluatePolicy(.DeviceOwnerAuthentication, localizedReason: "Authentication is required for access",
    reply: {
      (success: Bool, error) in
        if success {
          print("success")
        }
    }
  )
}
  1. 디바이스가 DeviceOwnerAuthentication을 지원하는지 검사한다. .DeviceOwnerAuthentication를 적용하면 Touch ID가 기본적용 되며, 실패시 PassCode를 입력 가능하다. 
  2. 지원을 하면 실행을 해서 한다. 성공 값이 Bool으로 반환된다. 


Passcode를 여러번 틀리면 알아서 1분 지연을 시켜준다. 그 이후에 또 실패를 하면 5분 등으로 추가적으로 시간이 더 지연된다.




Posted by KraZYeom



iOS 8 Today Extension(Widget) 여백 없애는 방법

iOS 8이 나오면서 많은 앱들이 Today Extension(이하 Widget) 지원하기 시작했다. 하지만 왼쪽에 아이콘 만큼 여백이 있는 앱도 있고, 여백 없이 꽉차게 나오는 앱도 있다. 기본적으로 위젯을 구현하면 여백이 생긴다. 


https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/NotificationCenter.html 에 보면 아래와 같이 위젯의 뷰의 크기에 대한 내용이 나와있습니다.

Because space in the Today view is limited and the expected user experience is quick and focused, you shouldn’t create a widget that’s too big by default. On both platforms, a widget must fit within the width of the Today view, but it can increase in height to display more content.


아래 그림 처럼 아무런 설정을 하지 않고 빌드를 하면 여백이 생긴다.

여백없이 구현하는 방법은 간단하다. superview의 frame의 width를 수정하면된다. 

swift 버전은 알아서... -_ -;


- (void)viewWillAppear:(BOOL)animated {

  [super viewWillAppear:animated];

  CGRect frame = self.view.superview.frame;

  frame = CGRectMake(0,CGRectGetMinY(frame), CGRectGetWidth(frame) + CGRectGetMinX(frame), CGRectGetHeight(frame));

  self.view.superview.frame = frame;

}


이렇게 적용하면 아래 그림 처럼 꽉차게 나온다.



Posted by KraZYeom

참조 http://lab.smoon.kr/75

http://www.raywenderlich.com/42591/supporting-multiple-ios-versions-and-devices


iOS 7용 프레임워크를 사용하고 있는데 하위 OS인 iOS 6도 지원하려고 빌드를 하고 실행을 하니 image가 없다는 메세지와 함께 크래쉬가 된다. 뭔가 코드 상으로는 분기가 되도록 구현을 했는데 무조건 iOS 6상에서 iOS 7의 프레임워크를 불러 올려다 보니 이런 메세지와 함께 앱이 구동이 안된다. 


혹시나 하고 트위터에 올렸더니 많은 컴맹 개발자 분들께서 링크와 도움을 주셨다. 감사합니다. 


해결 방법은 아래 그림 처럼 Target > Build Phases > Link Binary With Libraries에서 하위에서 지원안하는 프레임워크만 Status 값을 Required에서 Optional로 바꾸어 주면 된다. 당연하게도 코드상에는 상위 OS의 API를 호출하면 안된다. 



Posted by KraZYeom