Tocropviewcontroller: ์ „ํ™˜(iOS 13) ๋ฌธ์ œ ๋‹ซ๊ธฐ

์— ๋งŒ๋“  2019๋…„ 08์›” 08์ผ  ยท  23์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: TimOliver/TOCropViewController

ํƒ์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ ์œ„์— ์ž๋ฅด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฅด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋‹ซ์„ ๋•Œ ์ „ํ™˜์ด ๋๋‚˜๋ฉด ํƒ์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ ๋ณด๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...(iPhone ๋ฐ iPad ๋ฐ iOS 13์—์„œ๋งŒ ๋ฐœ์ƒ).

ํƒ์ƒ‰์ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ณ  UI๊ฐ€ "๊ณ ์ฐฉ"๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

 func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
        //This code fails on iOS13.
        //cropViewController.dismiss(animated: true)

        let viewController = cropViewController.children.first!
        viewController.modalTransitionStyle = .coverVertical
        viewController.presentingViewController?.dismiss(animated: true, completion: nil)
    }

์ด ๋ฐฉ๋ฒ•์€ iOS 13์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

https://www.dropbox.com/s/wyzc8errinfap1f/TestCrop.zip?dl=0

๋ชจ๋“  23 ๋Œ“๊ธ€

@uchiaTziki ์Œ. ๋‹น์‹ ์€ ๋‚˜์—๊ฒŒ ๋ณด์—ฌ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฒจ๋ถ€๋œ ์Šคํฌ๋ฆฐ์ƒท...

  1. ์ด๋ฏธ์ง€ ์„ ํƒ๊ธฐ๋กœ ๋ชจ๋‹ฌ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณ ๋ฅธ ์ด๋ฏธ์ง€
  3. ํ•ด๋‹น ์…€์˜ ์ž๋ฅด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ ํ‘œ์‹œ
  4. ์ทจ์†Œํ•˜๋ฉด ์ด๋ฏธ์ง€ ์„ ํƒ๊ธฐ๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค(์ดˆ๊ธฐ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํฐ์ƒ‰์œผ๋กœ ์ฑ„์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค).

๊ทธ๊ฒƒ์ด ์ผ์ด ๋” ๋ช…ํ™•ํ•ด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
1
2
3
4

ํ , ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฑด๊ฐ€์š”?

์ด ํ•ด์ œ ์ฝ”๋“œ๊ฐ€ ์ž˜๋ชป๋œ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

https://github.com/TimOliver/TOCropViewController/blob/8770be8407540f5873fe714870771cea8a382ac7/Objective-C/TOCropViewController/TOCropViewController.m#L895

๊ฑฐ๊ธฐ์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์กฐํ•ฉ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ œ๊ฐ€ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด๋ณด์ง€ ์•Š๊ณ ์„œ๋Š” ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋‹ค์‹œ ์‹œ๋„ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค..
๋’ค์ชฝ์— ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์ด์ƒํ•ฉ๋‹ˆ๋‹ค).

CropViewController๋ฅผ ์ œ์‹œํ•˜๊ธฐ ์ „์— ์ด ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

if #available(iOS 13.0, *) {
 cropViewController.modalPresentationStyle = .fullScreen
}

์˜ค๋Š˜ ์•„์นจ์— ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€๋งŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๊ธฐ๋ณธ ๋ชจ๋‹ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜์ž…๋‹ˆ๋‹ค(์•„๋ž˜์—์„œ ์œ„๋กœ).
๋ณด๊ธฐ/ํ”„๋ ˆ์ž„์˜ ํŠน์ˆ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ด ์†”๋ฃจ์…˜์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@uchiaTziki ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ฐพ์•˜์Šต๋‹ˆ๊นŒ?

์ƒ˜ํ”Œ ์•ฑ์—์„œ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

iOS 13์—์„œ ๋ชจ๋‹ฌ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์ด์ „ ๋ฒ„์ „์˜ iOS์—์„œ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„์ง ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ์•„๋‚ผ ์ข‹์€ ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํƒ์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ (A) ๊ฐ€ ๋ณด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ (B)๋ฅผ ํ‘ธ์‹œ ํ•ฉ๋‹ˆ๋‹ค.
  • View Controller (B) ๋Š” View Controller (C) ๋ฅผ ํผ ์‹œํŠธ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • View Controller (C) ๋Š” CropViewController๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค .
  • CropViewController ์—์„œ ์ทจ์†Œ ๋˜๋Š” ์™„๋ฃŒ ๋ฅผ ํƒญํ•˜๋ฉด ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํœด๊ฐ€์ค‘์ด๋ผ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

CropViewController๋ฅผ ์ œ์‹œํ•˜๊ธฐ ์ „์— ์ด ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

if #available(iOS 13.0, *) {
 cropViewController.modalPresentationStyle = .fullScreen
}

์ตœ์‹  Xcode ๋ฒ ํƒ€์—์„œ ๊ทธ( @TimOliver )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์ „ํ™˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ํšจ๊ณผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ €์—๊ฒŒ๋„ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 func cropViewController(_ cropViewController: CropViewController, didFinishCancelled cancelled: Bool) {
        //This code fails on iOS13.
        //cropViewController.dismiss(animated: true)

        let viewController = cropViewController.children.first!
        viewController.modalTransitionStyle = .coverVertical
        viewController.presentingViewController?.dismiss(animated: true, completion: nil)
    }

์ด ๋ฐฉ๋ฒ•์€ iOS 13์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

https://www.dropbox.com/s/wyzc8errinfap1f/TestCrop.zip?dl=0

์•ˆ๋…•ํ•˜์„ธ์š”, iOS 13.1์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋งŒ๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด
dismiss(animated: true, completion: nil)
iOS 13.1์—์„œ

๋ชจ๋“  ViewController๊ฐ€ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

crop

์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋” ์ด์ƒ ์‚ฌ์šฉ์ž ์ง€์ • ์ „ํ™˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ cropViewController.modalTransitionStyle = .coverVertical ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค...

์—ฌ๊ธฐ์—์„œ @oblq ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

CropViewController๋ฅผ ์ œ์‹œํ•˜๊ธฐ ์ „์— ์ด ์ฝ”๋“œ๋ฅผ ์‹œ๋„ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

if #available(iOS 13.0, *) {
 cropViewController.modalPresentationStyle = .fullScreen
}

๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

#์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(iOS 13.0, *) {
CropViewController.modalPresentationStyle = .fullScreen
}

๊ฐ์‚ฌ ํ•ด์š”. ์ด๊ฒƒ์€ iOS 13์—์„œ ๋‚ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ž๋ฅด๊ธฐ ํ›„ ์ž๋ฅด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ ํ•ด์ œ, ์ „ํ™˜์ด ๋๋‚  ๋•Œ ํƒ์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ ๋ณด๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„์™€์ฃผ์„ธ์š”

์ด๋ฏธ์ง€ ์ž๋ฅด๊ธฐ ํ›„ ์ž๋ฅด๊ธฐ ์ปจํŠธ๋กค๋Ÿฌ ํ•ด์ œ, ์ „ํ™˜์ด ๋๋‚  ๋•Œ ํƒ์ƒ‰ ์ปจํŠธ๋กค๋Ÿฌ ๋ณด๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„์™€์ฃผ์„ธ์š”

์•ˆ๋…•ํ•˜์„ธ์š”! ๊ทธ๋ƒฅ ์„ค์ • cropViewController.dismiss(animated: **false**, completion: nil) ๋Œ€์‹  cropViewController.dismiss(animated: **true**, completion: nil)

์ €๋„ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. @ibdman1991์ด ๋งํ–ˆ๋“ฏ์ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€๋งŒ ๋ณด๊ธฐ์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. transitioningDelegate ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์˜ํ–ฅ๋ ฅ์ด ์žˆ์„์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    let cropViewController = CropViewController(image: image)
    cropViewController.modalTransitionStyle = .crossDissolve
    cropViewController.transitioningDelegate = nil

#์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(iOS 13.0, *) {
CropViewController.modalPresentationStyle = .fullScreen
}

์ด ๋ฌธ์ œ๋Š” iOS 13 ์ด์ƒ์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

#์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ(iOS 13.0, *) {
CropViewController.modalPresentationStyle = .fullScreen
// CropViewController.modalTransitionStyle = .crossDissolve
CropViewController.transitioningDelegate = ์—†์Œ
}
๋‚˜๋ฅผ ์œ„ํ•ด ์ผ

์–ด. ๊ดœ์ฐฎ์•„. ํ”„๋ฆฌ์  ํ…Œ์ด์…˜ ์Šคํƒ€์ผ์„ ์ „์ฒด ํ™”๋ฉด์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. :)

๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋‹ฌ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์Šคํƒ€์ผ์ด ํ•„์š”ํ•œ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ ์—ด๊ณ  ์ˆ˜ํ–‰ํ•˜๋ ค๋Š” ์ž‘์—…์„ ๋งค์šฐ ์ฃผ์˜ ๊นŠ๊ฒŒ ์„ค๋ช…ํ•˜์„ธ์š”. iOS 13์˜ ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ ์—ฌ๊ธฐ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ๋งŽ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰