336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


앱스토어 올라가는 스크린샷에 동영상을 추가해서 앱을 설명 할 수 있습니다. 그 동영상이 실제 앱이 구동되는 화면을 가지고 설명되는 동영상이면 상관이 없지만, 앱을 설명하는 동영상에 실제 화면이 포함되지 않는 동영상이 올라갈 경우 사용자에게 명확한 설명이 안되고 추상적이기때문에 애플 측에서 리젝을 합니다.


리젝 사유

Performance - 2.3.4

Your App Preview includes content that does not sufficiently reflect the app in use.
Specifically, your preview:

- Showed footage other than the app in use.

Next Steps

Please revise your App Preview to only use video screen captures of the app,
narration, and textual and design overlays.

해결 방안

동영상을 올릴경우 꼭 전체화면은 아니지만 보여지는 화면에 실제 사용되는 앱의 모습니 있어야 됩니다. 매우 간단한 해결 방안이지만 만약 리젝을 당했던 동영상이라면 동영상을 다시 만들어야 되는 문제가 발생 합니다.


마치며

처음부터 이러한 사실을 알고 있다면 좋겠지만, 보통의 경우 한번당하고 나서 알게됩니다. 직접 동영상을 만들지 않는 것이라면 영상 제작자에게 잘 얘기를 해서 수정해야되는 방향으로 가거나 아예 동영상을 삭제 해야되지 않을까 싶습니다. 리뷰를 맡기면서 느끼는 거지만 요새는 리뷰를 하루면 해주기 때문에 출시하기 일주일전에 개발자가 출시해야되는 옵션을 걸고 리뷰를 맡아 보고나서 출시일에 맞쳐서 앱을 출시 하는 것도 리젝을 피하는 하나의 방법이지 않을까 싶습니다. 틀린점이나 궁금한점 있으면 언제든지 댓글을 남겨 주세요 :)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


설명

런처이미지 사이즈에 대해서 포스팅 하겠습니다. 3.5인치에서 4인치 화면만 있다가 4.7인치와 5.5인치가 추가될때 런처이미지를 추가 하지 않으면 4.7과 5.5인치에서는 그냥 확대된 상태로만 나오던 적이 있었습니다. 애플에서 설명을 하는 런처이미지는 이렇습니다.

A launch screen appears instantly when your app starts up.
The launch screen is quickly replaced with the first screen of your app,
giving the impression that your app is fast and responsive.
The launch screen isn’t an opportunity for artistic expression.
It’s solely intended to enhance the perception of your app as quick
to launch and immediately ready for use. Every app must supply a launch screen.

앱이 시작되면 즉시 런처이미지가 나타납니다. 런치이미지는 빠르게 앱의 시작화면으로 바뀌어서 빠르게 반응하는 것 같은 인상을 줍니다. 런처이미지는 예술적으로 표현하는 곳이 아닙니다. 다만 앱이 즉시 사용 준비가 된 상태라는 것을 알려주기 위한 용도로만 사용도비니다. 모든 앱에서는 런처이미지를 제공해야됩니다. (직역입니다. 틀린부분이 있을텐데 그냥 넘어가주세요.. 영어공부 열심히 하겠습니다…)

앱이 시작되는 부분에서 나타나는 화면이고, 앱이 사용할 준비가 끝나면서 사라지는 장면이라는 것입니다.


이미지 사이즈 표

Device Portrait size(세로 방향) Landscape size(가로 방향)
12.9” iPad Pro 2048px × 2732px 2732px × 2048px
10.5” iPad Pro 1668px × 2224px 2224px × 1668px
9.7” iPad 1536px × 2048px 2048px × 1536px
7.9” iPad mini 4 1536px × 2048px 2048px × 1536px
iPhone X 1125px × 2436px 2436px × 1125px
iPhone 8 Plus 1242px × 2208px 2208px × 1242px
iPhone 8 750px × 1334px 1334px × 750px
iPhone 7 Plus 1242px × 2208px 2208px × 1242px
iPhone 7 750px × 1334px 1334px × 750px
iPhone 6sPlus 1242px × 2208px 2208px × 1242px
iPhone 6s 750px × 1334px 1334px × 750px
iPhone SE 640px × 1136px 1136px × 640px

맞치며

사실 LaunchScreen.storyboard 여기서 통합적으로 해주면 되기는 합니다. 오토레이아웃도 사용할 수 있고요. 아이폰x에서 탭바가 네이비게이션 이동을 탭바를 사라지게 하는 hidesBottomBarWhenPushed 옵션을 주게 되면 위로 올라갔다가 사라지는 이슈가 있는데,, 아이폰x 런처 이미지를 넣어주면 해결 된다는 글을 본적이 있습니다. (적용을 해봤지만 실패 해서 일단 다른 방법을 사용 하고 있습니다.) 필요로 하면 넣어주는게 맞는거 같습니다. 포스팅에 잘못된점이 있으면 댓글 달아주시면 수정하도록 하겠습니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


iOS 리젝사유) Apple 소프트웨어 또는 하드웨어에 대한 언급

앱을 업데이트 할때 ‘이 버전에서 업그레이드된 사항’ 이라는 메타데이터 항목이 있습니다. 거기에

  • iOS11 대응 업데이트

라고 적었던 부분이 문제가 되었습니다. 다른 앱들이 업데이트내역을 볼때 ‘iOS11 지원’ 이런식으로 써놨기에 문제가 되지 않는다고 생각했는데 리젝을 맞았습니다.
리젝 사유는 아래와 같습니다.


리젝 사유

Your app or its metadata contains references to a pre-release version of Apple software or hardware.
 Apps with compatibility references to a pre-GM version of iOS SDK or pre-released Apple hardware are not in compliance with the Apple Developer Program License Agreement.

Specifically, section 2.3 states:
"Apple may provide You with pre-release versions of the Apple Software or related services that 
constitute Apple Confidential Information and are subject to the confidentiality obligations of this Agreement."

해결 방안

해결방안은 매우 간단합니다. 앱 및 메타 데이터에서 시험판 버전의 Apple관련 소프트웨어 및 하드웨어 언급을 모두 제거 하거나 변경 하면 됩니다.


마치며

소프트웨어나 하드웨어 관련 언급을 다 제거 하라고 해결 방법을 가르쳐줬는데,, ‘iOS11 지원’ 이라는 문구는 왜 통과가 되는지 애매모호 한거 같습니다. ‘iOS11 지원’으로 변경 한후 다시 심사에 맡겼는데 심사를 한번 지켜 봐야겠습니다. 추후 결과는 이글을 통해 업데이트 하겠습니다  (무사히 통과되었습니다.)

여담이지만 심사기간이 정말 빨라진거 같습니다.



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


EUC-KR 인코딩 하기

설명

iOS에서 EUC-KR로 인코딩 하는 문제가 프로젝트를 진행하면서 오랜 시간동안 Warning을 발생시켜서 눈에 가시처럼 보였는데 해결방안을 찾아서 포스팅 하게 되었습니다. 일단 먼저 EUC-KR(EUC-KR은 KS X 1001와 KS X 1003을 사용하는 8비트 문자 인코딩, EUC의 일종이며 대표적인 한글 완성형 인코딩이기 때문에 보통 완성형이라고 불린다. - 위키백과사전) 말그대로 한글 완성형 인코딩이기 때문에 오랜 시간 사용해왔습니다. 네이버,네이트,우체국등 오래된 한국기업 웹페이지는 EUC-KR로 되어있습니다. UTF-8을 사용하면 좋겠지만 용량문제, 전환비용등 때문인지 아직도 사용되고 있습니다. 특히 우체국 API를 통해 주소 검색을 구현할때는 쿼리를 EUC-KR로 인코딩 해서 보내야 올바른 값을 받을 수 있습니다.
기존에 사용 하고 있던 이 방식은 안타깝게도 iOS9버전 부터는 Warning을 발생시킵니다. iOS9에서는 더 이상 사용되지 않기 때문에 권장 UTF-8인코딩을 사용하라는 것입니다.

 NSString *queryString = [str stringByAddingPercentEscapesUsingEncoding:-2147481280];

    //first deprecated in iOS 9.0 - Use -stringByAddingPercentEncodingWithAllowedCharacters: instead, which always uses the recommended UTF-8 encoding, and which encodes for a specific URL component or subcomponent since each URL component or subcomponent has different rules for what characters are valid.

포기하고 있다가 다른분을 도와주다가 우연찮게 찾아서 이렇게 포스팅을 하게되었습니다.


사용환경

* Swift3.x
* Xcode 8.3.3

소스 코드

  • Objective-C
- (NSString *)euckrEncodingObjectiveC:(NSString *)str {

    NSMutableString *outputQuery = [NSMutableString string];

    NSUInteger encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingEUC_KR);
    const char * source = [str cStringUsingEncoding:encoding];
    NSInteger sourceLen = strlen((const char *)source);

    for (int i = 0; i < sourceLen; ++i)
    {
        const unsigned char thisChar = source[i];
        if (thisChar == ' ') {
            [outputQuery appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' ||
                 (thisChar >= 'a' && thisChar <= 'z') ||
                 (thisChar >= 'A' && thisChar <= 'Z') ||
                 (thisChar >= '0' && thisChar <= '9'))
        {
            [outputQuery appendFormat:@"%c", thisChar];
        } else {
            [outputQuery appendFormat:@"%%%02X", thisChar];
        }
    }
    return outputQuery;
}
  • Swift
func euckrEncoding(_ query: String) -> String { //EUC-KR 인코딩

    let rawEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.EUC_KR.rawValue))
    let encoding = String.Encoding(rawValue: rawEncoding)

    let eucKRStringData = query.data(using: encoding) ?? Data()
    let outputQuery = eucKRStringData.map {byte->String in
        if byte >= UInt8(ascii: "A") && byte <= UInt8(ascii: "Z")
            || byte >= UInt8(ascii: "a") && byte <= UInt8(ascii: "z")
            || byte >= UInt8(ascii: "0") && byte <= UInt8(ascii: "9")
            || byte == UInt8(ascii: "_") || byte == UInt8(ascii: ".") || byte == UInt8(ascii: "-")
        {
            return String(Character(UnicodeScalar(UInt32(byte))!))
        } else if byte == UInt8(ascii: " ") {
            return "+"
        } else {
            return String(format: "%%%02X", byte)
        }
        }.joined()

    return outputQuery
}

마치며

EUC-KR보다 UTF-8을 권장하지만 아직 한국내에서는 불가능한거 같습니다. 위에도 언급해듯이 전환비용, 용량문제등 아직 해결할 문제들이 많은거 같습니다. 오랫동안 눈에 밟히던 Warning을 없앤것만으로도 기분 좋은 일인거 같습니다. 틀린점이나 궁금한점이 있다면 댓글 남겨주시면 감사합니다 :)


참고 사이트

https://stackoverflow.com/questions/41270687/swift-euc-kr-korean-encoding-not-working-but-works-in-python



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


카카오 API를 통해 웹 이미지 검색 하기

설명

이번에 다음 API가 카카오 API와 통합하면서 웹 검색 방식이 변경 되었습니다. 다음 웹 검색 방식이 조금 옛날 버전이라 프로젝트를 진행하면서 warning 때문에 스트레스 아닌 스트레스를 받았었는데,, 카카오로 넘어오면서 warning이 없어지면서 속이 다 시원합니다. (물론 제가 제대로 못해서 있었던 warning이었겠지만요..)
이번에 카카오 API 넘어오면서 Get 방식으로 변경 되었습니다.

일단 밑에 카카오 디벨로퍼 링크를 통해 들어가셔서 회원가입 후 로그인을 해주고 내 애플리케이션에 들어가면 앱을 만들고 4개의 키(네이티브 앱, REST API 키, JavaScript키, Admin 키)를 얻을 수 있습니다.
KakaoDevelopers_

웹 이미지 검색에서 필요한 키는 REST API키 입니다. 나머지 키는 SDK나 웹에서 사용 하시면 됩니다.

사용환경

포스팅 시점에서 iOS11 버전이 발표 되긴 했지만 아직 베타테스트여서 Swift3.x 버전을 사용 하도록 하겠습니다.

* Swift3.x
* Xcode 8.3.3

Get 방식이기 때문에 유명한 라이브러리인 Alamofire를 사용하도록 하겠습니다. 설치 방법은 밑에 Alamofire github를 참고 하시면 됩니다.
Alamofire github

소스코드

// 주소 관련입니다. 키워드 부분에 원하는 검색어를 적어주시면 됩니다.
let keywordWebLink = "https://dapi.kakao.com/v2/search/image?query=키워드"

// 한글이 포함된 주소는 작동 하지 않기 때문에 urlQueryAlll 옵션을 사용해서 인코딩을 해줍니다.
let searchLink = str_temp.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)!

// Alamofire를 통해서 값을 받아옵니다.
// 헤더부분에서 "Authorization" 항목에 REST API 키를 넣어 주셔야됩니다. 여기서 주의 할점은 앞에 "KakaoAK" 키워드는 필수 입니다.
Alamofire.request(str_search,
                  method: .get,
                  encoding: JSONEncoding.prettyPrinted,
                  headers: ["Authorization": "KakaoAK your REST API KEY"])
    .responseJSON{ response in
        switch response.result {
        case .success(let json):
            // 검색에 성공을 하면 검색 결과가 json으로 넘어 옵니다. 이 값을 통해 원하는 화면을 표시 하면됩니다.
            print(jsont)
        case .failure(let error):
            // 검색에 실패할 경우 error 메세지와 함께 넘어옵니다.
            print("Request failed with error: \(error)")
            DispatchQueue.main.async {
                   print(message: "검색 도중에 에러가 발생했습니다.")
            }
        }
}

요청을 할 때 사용할수 있는 파라메타 입니다. query부분은 필수이고 나머지는 옵션입니다. 필요한 부분이 있다면 위에 keywordWebLink 뒤에 &sort=accuracy 이런식으로 연달아 붙여서 사용 하시면 됩니다.

설명 필수 타입
query 검색을 원하는 질의어 O String
sort 결과 문서 정렬 방식 X(accuracy) accuracy(정확도순) or recency(최신순)
page 결과 페이지 번호 X(기본 1) 1-50 사이 Integer
size 한 페이지에 보여질 문서의 개수 X(80) 1-80 사이 Integer

검색을 요청을 했을 때 넘어오는 값의 종류 입니다. meta 데이터와 document 데이터로 구성 되어있습니다.

meta 데이터

설명 타입
total_count 검색어에 검색된 문서수 Integer
pageable_count total_count 중에 노출가능 문서수 Integer
is_end 현재 페이지가 마지막 페이지인지 여부. 값이 false이면 page를 증가시켜 다음 페이지를 요청할 수 있음. Boolean

document 데이터

설명 타입
collection 컬렉션 String
thumbnail_url 이미지 썸네일 URL String
image_url 이미지 URL String
width 이미지의 가로 크기 Integer
height 이미지의 세로 크기 Integer
display_sitename 출처명 String
doc_url 문서 URL String
datetime 문서 작성시간. ISO 8601. [YYYY]-[MM]-[DD]T[hh]:[mm]:[ss].000+[tz] String

마치며

다음 API에서 아직 종료 되지 않은 서비스 이지만 그래도 결국은 통폐합을 통해 종료될거 같아서 제 프로젝트에 적용 할겸 포스팅을 했습니다. 방식 자체가 어렵지는 않지만 생각보다 헤매는 부분이 있어서 이렇게 포스팅을 합니다. 다른 검색 API도 이런식으로 접근 하시면 쉽게 활용 하실 수 있을꺼 같습니다. 틀린점이나 잘못된 점이 있다면 알려주시면 수정하도록 하겠습니다. :)



'iOS 프로그래밍 > iOS' 카테고리의 다른 글

iOS) iOS 런처이미지 사이즈표  (0) 2017.10.26
iOS) EUC-KR 인코딩 하기  (0) 2017.09.18
iOS) UIAlertController-ActionSheet  (0) 2017.07.26
iOS) UIAlertController - alert  (0) 2017.07.11
iOS)UIActivityViewController  (0) 2017.06.15
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


iPad에서 UIAlertController의 actionSheet사용시 발생하는 오류

오류 메세지

'Your application has presented a UIAlertController (<UIAlertController: xxx>) of style UIAlertControllerStyleActionSheet.
The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover.
You must provide location information for this popover through the alert controller's popoverPresentationController.
You must provide either a sourceView and sourceRect or a barButtonItem.
If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'

영어를 해석해보면 actionSheet의 모달스타일은 UIModalPresentationPopover라고 설명을 해주면서 UIModalPresentationPopover을 사용 할 때는 barButtonItem또는 팝업에 대한 위치를 설정해줘야 된다고 명시 되어 있습니다.

해결 방법

해결방법은 만약 앱이 iPhone과 iPad를 같이 지워하는 앱이라면 디바이스에 따라 분개해주고 iPad만 사용 가능하다면 따로 설정은 안 해주셔도 됩니다.

  • 위치를 정해주는 방법

    if UIDevice.current.userInterfaceIdiom == .pad { //디바이스 타입이 iPad일때
      if let popoverController = alertController.popoverPresentationController {
          // ActionSheet가 표현되는 위치를 저장해줍니다.
          popoverController.sourceView = self.view
          popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
          popoverController.permittedArrowDirections = []
          self.present(alertController, animated: true, completion: nil)
      }
    } else {
      self.present(alertController, animated: true, completion: nil)
    }
    
  • UIBarButtonItem에 추가해주는 방법

    if UIDevice.current.userInterfaceIdiom == .pad { //디바이스 타입이 iPad일때
      if let popoverController = alertController.popoverPresentationController {
          // ActionSheet가 표현되는 위치를 저장해줍니다.
          popoverController.barButtonItem = sender as? UIBarButtonItem에
          self.present(alertController, animated: true, completion: nil)
      }
    } else {
      self.present(alertController, animated: true, completion: nil)
    }
    

마치며

당연히 문제 없이 되는 줄 알았는데 뜻밖에 오류를 확인하고 당황했었습니다. 보통은 iPhone 작업만 하다보니 확인하지 못했던 문제였습니다. 그리고 뿜어내는 오류를 일단 해석하고 이해하는게 중요하다는걸 또 깨달았습니다.감사합니다. 틀린점이 물어보실게 있다면 댓글로 남겨 주시면 적극 반영하겠습니다.



'iOS 프로그래밍 > iOS 오류' 카테고리의 다른 글

Custom FrameWork Bulid error  (0) 2017.04.24
iOS 오류) ENABLE_BITCODE 오류  (1) 2016.06.21
iOS 오류) URL nil 오류 나는 문제  (0) 2016.06.21
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


SCWebPreview


설명

페이스북, 카카오톡에서 URL을 공유하게 되면 미리보기 형식으로 이미지, 제목, 내용을 보여주는 창들이 있습니다. 그런 창들을 쉽게 구현 할 수 있게 도와주는 라이브러리 입니다. 원리는 html tag중에 meta data중 og:(og:url, og:image, og:title, og:description) 속성을 가지고 있는 내용을 가져와서 사용 할 수 있게 구성 되어 있습니다.


Github 주소

https://github.com/myoungsc/SCWebPreview


스크린샷


작업환경

* Swift 3.0.1
* XCode 8.3.3
* iOS 9.0 (Min SDK)

설치방법

일반적인 CocoaPod 설치 방법과 동일합니다.

1. 터미널에서 해당 프로젝트 디렉토리로 이동한 후 'Pod init'
2. 디렉토리에 있는 PodFile에 (pod "SCWebPreview")를 추가
3. 터미널에서 'pod install'

사용방법

  • SCWebPreview를 import 합니다.

    import SCWebPreview
    
  • HTML에서 metaData를 가져옵니다.([String]배열을 통해 url을 넣어 주시면 됩니다.)

    let webPages: [String] = ["https://github.com/myoungsc", "http://devsc.tistory.com/"]
    let scWebPreview = SCWebPreview()
    scWebPreview.initWebPages(webPages)
    scWebPreview.startCrawling(){
      for i in 0 ..< webPages.count {
          let dic = self.scWebPreview.getPreviewDataFromIndex(i)
          guard dic.count != 0 else {
              print("error: dic is optionl Value")
              return
          }
          //doSomething
      }
    }
    
  • 데이터를 가져오는 방법입니다.

    let dicWebData: [String: String] = scWebPreview.getPreviewDataFromIndex(0)
    print("og:url - \(dicWebData["og:url"]!)")
    print("og:url - \(dicWebData["og:title"]!)")
    print("og:url - \(dicWebData["og:description"]!)")
    print("og:url - \(dicWebData["og:image"]!)")
    
  • 해당 인덱스의 url를 사파리로 오픈 하는 방법입니다.

    scWebPreview.openSafariFromUrl(0)
    

라이센스

라이센스는 MIT라이센스를 따릅니다. 앱에 적용하실때는 사용하였다고 명시해주셔야됩니다.



'iOS 프로그래밍 > CocoaPod' 카테고리의 다른 글

SCTableIndex  (0) 2017.12.21
SCCardView  (0) 2017.12.21
SCPageControl  (0) 2017.08.28
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


SCPageController

설명

커스텀 한 PageController입니다. 페이징된 스크롤에 연결이 되어서 스크롤이 움직임에 따라 컨트롤 되는 라이브러리 입니다. 제가 처음으로 만들어본 CocoaPod 컨트롤러 입니다. 오토레이아웃은 쓰지 않았고 가운데 정렬되어서 프레임에 맞추는데, xib나 storyboard에서는 큰틀만 잡아 주면 됩니다.

Github 주소

https://github.com/myoungsc/SCPageControl

스크린샷

작업한 환경

* Swift 3.0.1
* XCode 8.3.1
* iOS 9.0 (Min SDK)
* Not Use Autolayout

설치방법

다른 CocoaPod 처럼 설치 하시면 됩니다.

1. 터미널에서 해당 프로젝트 디렉토리로 이동한 후 'Pod init'
2. 디렉토리에 있는 PodFile에 (pod "SCPageControl")를 추가
3. 터미널에서 'pod install'

사용방법

public enum SCPageStyle: Int {
    case SCNormal = 100
    case SCJAMoveCircle // Design by Jardson Almeida
    case SCJAFillCircle // Design by Jardson Almeida
    case SCJAFlatBar // Design by Jardson Almeida
}

let sc = SCPageControlView()

override func viewDidLoad() {
    super.viewDidLoad()

    sc.frame = CGRect(x: 0, y: UIScreen.main.bounds.size.height-50, width: UIScreen.main.bounds.size.width, height: 50)
    sc.scp_style = .SCNormal
    sc.set_view(5, current: 0, tint_color: UIColor.red)
    view.addSubview(sc)
}

//MARK: ScrollView Delegate
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    sc.scroll_did(scrollView)
}

라이센스

라이센스는 MIT라이센스를 따릅니다. 앱에 적용하실때는 사용하였다고 명시만 해주시면 됩니다.



'iOS 프로그래밍 > CocoaPod' 카테고리의 다른 글

SCTableIndex  (0) 2017.12.21
SCCardView  (0) 2017.12.21
SCWebPreview  (0) 2017.08.30
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


UIAlertController - actionSheet

안녕하세요. 개발자 myoung입니다. UIAlertController에는 두가지 스타일 있습니다. actionSheet와 alert입니다. 오늘 포스팅 내용은 actionSheet에 대한 포스팅입니다. Alert가 알려주는 기능이었다면, ActionSheet는 주로 사용자에게 여러가지 선택 사항이 있을때, 간편하게 선택 할 수 있도록 하는 Controller입니다.

사용 환경

  • Swift3.x
  • Xcode 8.3.3

사용의 예

Alt text
<이미지 1>

사용 방법

가장 기본적인 사용 방법은 Alert과 별반 다르지 않습니다. 타이틀, 메세지에 원하는 텍스트를 넣어주고 UIAlertAction을 통해 선택 할 수 있는 항목을 정해주면 됩니다. 선택개수는 추가한 UIAlertAction 개수에 따라 선택 메뉴가 형성이 됩니다. ( 맨 아래에 취소 버튼을 안 추가 해주시면 무조건 선택을 해야 Controller가 지워지기 때문에 필요없지 않는 이상 넣어줍니다.)

let actionSheet = UIAlertController(title: "Title",
                                            message: "Message",
                                            preferredStyle: .actionSheet)
actionSheet.addAction(UIAlertAction(title: "menu1", style: .default, handler: { result in
           //doSomething
        }))
actionSheet.addAction(UIAlertAction(title: "menu2", style: .default, handler: { result in
            //doSomething
        }))
actionSheet.addAction(UIAlertAction(title: "취소", style: .cancel, handler: nil))
self.present(actionSheet, animated: true, completion: nil)

마치며

메뉴에 대한 개수는 따로 정해져 있지 않지만 많으면 많을수록 로딩(개발자 입장에서는 로딩이지만 사용자 입장에서는 순간 멈춘것처럼 느껴지죠)이 길어집니다. 메뉴가 많아지면 자연스럽게 테이블뷰 처럼 스크롤이 가능하게 됩니다. alert 스타일보다는 활용도가 많다고는 할수 없지만 작은 화면 많은 것을 표현해야되기 때문에 선택메뉴는 이런식으로 많이 구현을 하게 됩니다. 이것또한 커스텀보다는 쉽게 구현 할 수 있기 때문에 디자인이 문제가 되지 않는다면 이런식으로 사용하는것도 나쁘지 않는거 같습니다. 이번 포스트는 여기까지입니다. 틀린점이나 궁금한점이 있다면 언제든지 댓글을 남겨주시면 감사합니다 :)



'iOS 프로그래밍 > iOS' 카테고리의 다른 글

iOS) EUC-KR 인코딩 하기  (0) 2017.09.18
iOS) 카카오 API를 통해 웹 이미지 검색하기  (2) 2017.09.13
iOS) UIAlertController - alert  (0) 2017.07.11
iOS)UIActivityViewController  (0) 2017.06.15
iOS) JSON 타입 활용하기  (0) 2017.05.16
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


UIAlertController - alert

안녕하세요. 개발자 myoung입니다. UIAlertController에는 두가지 스타일 있습니다. actionSheet와 alert입니다. 오늘 포스팅 내용은 alert에 대한 포스팅입니다. Alert은 주로 사용자에게 변경 사항이라던지 여러 알림을 알려주기 위해서 사용됩니다.


사용의 예

Alt text
<이미지 1>

Alt text
<이미지 2>


사용 방법

가장 기본적인 사용 방법입니다.다. 타이틀, 메세지에 원하는 텍스트를 넣어주고 취소버튼, 확인 버튼을 통해 실행 하고자 하는 부분을 실행 하시면 됩니다. 액션버튼을 하나 이상으로 해주시면 최대 몇개까지는 모르겠지만 그래도 따로 커스텀으로 만들지 않아도 편하게 Alert창을 만들어서 사용 할 수 있습니다.

let alert = UIAlertController(title: "타이틀", message: "메세지", preferredStyle: .alert)
let action_cancel = UIAlertAction(title: "취소", style: .default, handler: { result in 
                        //do something
                    })
alert.addAction(action_cancel)
let alert_done = UIAlertAction(title: "확인", style: .default, handler: { result in
                        //do something
                    })
alert.addAction(alert_done)
self.present(alert, animated: true, completion: nil)

텍스트 필드를 이용해서 <이미지2>와 같이 사용 하실 수 있습니다. 사용법은 아래와 같습니다.

let alert = UIAlertController(title: "타이틀", message: "메세지", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "취소", style: .default, handler: nil))
alert.addAction(UIAlertAction(title: "건너뛰기", style: .default, handler: { result in
    //do something
}))
alert.addAction(UIAlertAction(title: "확인", style: .default, handler: { result in
    let tf_title = alert.textFields![0] as UITextField
    print(tf_title.text)
}))
alert.addTextField { (textField : UITextField!) -> Void in
    textField.placeholder = "힌트입니다."
}
self.present(alert, animated: true, completion: nil)

마치며

alert은 정말 많이 사용됩니다. 물론 커스텀을 만들어서 사용되기도 하지만 대부분 기본으로 쉽게 사용 할 수 있는 컨트롤러중 하나임은 분명합니다. 여러가지로 신경써야 할 부분도 많이 줄어 들기도 합니다. (ex: 텍스트 필드를 사용 할 경우 키보드에 대한 대응..? ) 오늘 포스팅은 여기까지입니다. 다음 포스팅은 UIAlertController의 또다른 스타일인 actionSheet에 대해서 포스팅 하겠습니다. 틀린점이나 궁금한점이 있으시면 언제든지 댓글을 남겨 주시면 성실히 답변 드리겠습니다.



+ Recent posts