UIImage를 축소율에 따라 크기 조정

7163 단어 UIKitSwift

overview



(소 재료입니다)

UIImageView가 아니라 UIImage의 단계에서 리사이즈하고 싶은 상황, 드물게 있거나 한다.
그러한 때는, 이하와 같은 Extension으로 대응할 수 있다.

detail



UIImage+Resize.swift
import UIKit

protocol ImageResizing {
    func resize(with ratioType: UIImage.ResizeRatioType) -> UIImage!
}

extension UIImage: ImageResizing {
    enum ResizeRatioType {
        case naviIconSize
        case tabIconSize

        var ratio: CGFloat {
            switch self {
            case .naviIconSize:
                return 0.9
            case .tabIconSize:
                return 0.75
            }
        }
    }

    func resize(with ratioType: UIImage.ResizeRatioType) -> UIImage! {
        return resize(
            with: CGSize(
                width: size.width * ratioType.ratio,
                height: size.height * ratioType.ratio
            )
        )
    }

    // MARK: - private
    private func resize(with newSize: CGSize) -> UIImage! {
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
}

주의점



스케일
The scale factor to apply to the bitmap. If you specify a value of 0.0, the scale factor is set to the scale factor of the device’s main screen.

UIGraphicsBeginImageContextWithOptions(::_:) - Apple Developer

위와 같이 Asset Catalog 등을 이용하고 있다면 UIGraphicsBeginImageContextWithOptions 의 제 3 인수 scale 에 0.0 을 건네준다.
(이것은 항상 사용 장치의 메인 스크린 스케일을 적용합니다)

usage



보통:
let image = UIImage(named: "star")?.resize(with: .naviIconSize)

Asset catalog에서 직접 호출하는 경우 :



SwiftGen 의 경우:
let image = Asset.MaterialIcon.icClose36pt.image.resize(with: .naviIconSize)



사용법은?



  • 이런 것 원래 데이터에 손을 넣지 않고 크기를 조정하고 싶을 때
  • UIBarButtonItem 등 직접 UIImageView를 만지기 어려울 때 어쨌든, 슛과 사용하면 길
  • 좋은 웹페이지 즐겨찾기