iOS 표준 사진 애플리케이션처럼 이미지 확대/축소 및 변환

8390 단어 SwiftiOS
다음과 같은 iOS 표준 사진 응용 프로그램과 같은 이미지 축소 변환을 실현했다.

처음엔 "늘 있는 전환이니 쉽게 이루어질 수 있겠지~(헤라)"라고 말하면 힘들 텐데 같은 사람에게 도움이 됐으면 좋겠다.(끝나고 나니 별거 아닌 것 같다.)
솔직히 참고여기.하면 비슷한 걸 만들 수 있는데 두 군데가 막혔어요. 제가 설명해 드릴게요.
(UI V i e w C on t r o ller AnimatedTransitioning 이 불분명한 경우 참조여기.
github에 견본가 준비되어 있으니 가능하면 참고하세요.

막힌 곳


목적을 달성할 수 없는 UIViewController

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) 내에서 마이그레이션 소스 및 마이그레이션 목적지에 대한 ViewController를 가져올 경우
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        let fromVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.from)!
        let toVC = transitionContext.viewController(forKey: UITransitionContextViewControllerKey.to)!

         //以下アニメーションの処理       
}
의 처리가 막혔다.막히려면 UINaviation Controller와 UItabbar Controller를 사용한 상태에서 그것을 얻었습니다. 이전할 때 필요한 UIImageView를 얻을 수 없습니다.
그래서 이번
protocol TransitionProtocol {
    func transitionImageView() -> UIImageView //コピーのUIImageViewを返すメソッド
    func trnasitionImageView(isHidden: Bool) //アニメーションの前後でUIImageViewの表示を操作するメソッド
}
소스 마이그레이션 및 마이그레이션 목적지에 대한 ViewController를 위한 프로토콜입니다.그리고 애니메이션 처리를 실시하는 반에서 다음과 같은 방법을 실시했고 UIImageView를 얻었을 때 이 방법을 통해TransitionProtocol을 얻었다.
 private func getTransitionProtocol(viewController: UIViewController?) -> TransitionProtocol? {
        guard var viewController = viewController else { return nil }

        while (viewController as? TransitionProtocol) == nil {
            if let tab = viewController as? UITabBarController {
                viewController = tab.selectedViewController!
            } else if let navi = viewController as? UINavigationController {
                let viewControllers = navi.childViewControllers
                viewController = navi.childViewControllers[viewControllers.count - 1]
            } else {
                return nil
            }
        }
        return viewController as? TransitionProtocol
    }

콘텐츠 모드 전환


그러나 이렇게 하면 애니메이션 전후의 이미지가 좀 이상할 수 있다.
UIImageView의 프레임이 그대로 있든 없든 애니메이션 전후 콘텐츠 모드가 전환되기 때문이다.
따라서 이번에는 UImageView에 표시된 UIImage의 크기를 얻기 위해 UIImageView를 extension하여 이미지 크기를 바꾸지 않고 콘텐츠 모드를 전환합니다.
import UIKit
import AVFoundation

extension UIImageView {

    var imageSize: CGSize? {
        guard let image = image else { return nil }

        return AVMakeRect(aspectRatio: image.size, insideRect: bounds).size
    }
}
//contentModeを切り替える前後
let center = imageView.center
imageView.frame.size = imageView.imageSize!
imageView.center = center
애니메이션 전후 등 콘텐츠 모드가 전환되는 시간에 위와 같이 하면 콘텐츠 모드를 변경해도 현재 보이는 상태와 달라지지 않는다.
그러나 위의 코드는 하나의 예로present와dismiss에서도 변화가 발생할 수 있으니 자세한 내용은 견본의 코드를 보십시오.

마지막으로...


큐타에 기사와 코드가 공개된 것은 이번이 처음이다.
평소 거의 한 사람이 개발할 기회인데'이렇게 쓰면 기사가 더 쉽게 이해된다','여기 코드는 이렇게 하는 것보다 이렇게 하는 게 좋다'등의 의견이 있다면 조언해 주세요.

좋은 웹페이지 즐겨찾기