SwiftyCrop allows users to seamlessly crop images within their SwiftUI applications. It provides a user-friendly interface that makes cropping an image as simple as selecting the desired area.
With SwiftyCrop, you can easily adjust the cropping area, maintain aspect ratio, zoom in and out for precise cropping. You can also specify the cropping mask to be a square, circle or rectangle with custom aspect ratio. SwiftyCrop is highly customizable, you can adjust texts, fonts and colors that are used.
SwiftyCrop currently supports iOS, iPadOS, visionOS and macOS natively.
The following languages are supported & localized:
- ๐ฌ๐ง English
- ๐ฉ๐ช German
- ๐ซ๐ท French
- ๐ฎ๐น Italian
- ๐ท๐บ Russian
- ๐ช๐ธ Spanish
- ๐น๐ท Turkish
- ๐บ๐ฆ Ukrainian
- ๐ญ๐บ Hungarian
- ๐ง๐ท Brazilian Portuguese
- ๐ฐ๐ท Korean
- ๐ฏ๐ต Japanese
- ๐จ๐ณ Chinese
- ๐ซ๐ฎ Finnish
- ๐ Traditional Chinese
The localization file can be found in Sources/SwiftyCrop/Resources.
- Requirements
- Installation
- Demo App
- Usage
- Aspect Ratio Resizing
- iOS 26 & Liquid Glass
- Contributors
- License
Deployment targets (where your app can run):
- iOS 16.0 or later
- visionOS 1.0 or later
- macOS 13.0 or later
Build requirements (the toolchain you compile with):
- Xcode 26.0 or later
- Swift 5.9 or later
SwiftyCrop must be built with Xcode 26+ because it references iOS/macOS 26 SDK APIs (e.g. Liquid Glass effects). It still deploys to the OS versions listed above โ older OS versions fall back to the non-glass UI at runtime.
There are two ways to use SwiftyCrop in your project:
- using Swift Package Manager
- manual install (embed Xcode Project)
The Swift Package Manager is a tool for managing the distribution of Swift code. Itโs integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.
To integrate SwiftyCrop into your Xcode project using Xcode 26.0 or later, specify it in File > Swift Packages > Add Package Dependency...:
https://github.com/benedom/SwiftyCrop
If you prefer not to use any of dependency managers, you can integrate SwiftyCrop into your project manually. Put Sources/SwiftyCrop folder in your Xcode project. Make sure to enable Copy items if needed and Create groups.
To get a feeling how SwiftyCropView works you can run the demo app (thanks to @leoz).
This example shows how to display SwiftyCropView in a full screen cover after an image has been set.
import SwiftUI
import SwiftyCrop
struct ExampleView: View {
@State private var showImageCropper: Bool = false
@State private var selectedImage: UIImage?
var body: some View {
VStack {
/*
Update `selectedImage` with the image you want to crop,
e.g. after picking it from the library or downloading it.
As soon as you have done this, toggle `showImageCropper`.
Below is a sample implementation:
*/
Button("Crop downloaded image") {
Task {
selectedImage = await downloadExampleImage()
showImageCropper.toggle()
}
}
}
.fullScreenCover(isPresented: $showImageCropper) {
if let selectedImage = selectedImage {
SwiftyCropView(
imageToCrop: selectedImage,
maskShape: .square
) { croppedImage in
// Do something with the returned, cropped image
}
}
}
}
// Example function for downloading an image
private func downloadExampleImage() async -> UIImage? {
let urlString = "https://picsum.photos/1000/1200"
guard let url = URL(string: urlString),
let (data, _) = try? await URLSession.shared.data(from: url),
let image = UIImage(data: data)
else { return nil }
return image
}
}If you want to display `SwiftyCrop` inside a sheet, use `NavigationView` instead of `NavigationStack` in case you want to wrap it.
SwiftyCrop supports three different mask shapes for cropping:
circlesquarerectangle
This is only the shape of the mask the user will see when cropping the image. The resulting, cropped image will always be a square by default when using circle or square. To get a circular cropped image, you can override this using a configuration.
You can also configure SwiftyCropView by passing a SwiftyCropConfiguration. A configuration has the following properties:
| Property | Description |
|---|---|
maxMagnificationScale |
CGFloat: The maximum scale factor that the image can be magnified while cropping. Defaults to 4.0. |
maskRadius |
CGFloat: The radius of the mask used for cropping. Defaults to 130. A good way is to make it dependend on the screens size. |
cropImageCircular |
Bool: When using the cropping mask circle, whether the resulting image should also be masked as circle. Defaults to false. |
rotateImage |
Bool: Whether the image can be rotated when cropping using pinch gestures. Defaults to false. |
rotateImageWithButtons |
Bool: Option to show rotation buttons for rotating. Defaults to false. |
zoomSensitivity |
CGFloat: Zoom sensitivity when cropping. Increase to make zoom faster / less sensitive. Defaults to 1.0. |
rectAspectRatio |
CGFloat: The aspect ratio to use when a rectangular mask shape is used. Defaults to 4:3. |
allowAspectRatioResizing |
Bool: When using the rectangle mask shape, whether the user can freely resize the aspect ratio by dragging the edge handles. Defaults to false. |
minAspectRatio |
CGFloat: The minimum allowed aspect ratio (width / height) when allowAspectRatioResizing is enabled. Defaults to 0.1. |
maxAspectRatio |
CGFloat: The maximum allowed aspect ratio (width / height) when allowAspectRatioResizing is enabled. Defaults to 10.0. |
texts |
Texts: Defines custom texts for the buttons and instructions. Defaults to using localized strings from resources. |
fonts |
Fonts: Defines custom fonts for the buttons and instructions. Defaults to using system font. |
colors |
Colors: Defines custom colors for the texts and background. Defaults to white text and black background. |
Create a configuration like this:
let configuration = SwiftyCropConfiguration(
maxMagnificationScale: 4.0,
maskRadius: 130,
cropImageCircular: false,
rotateImage: false,
rotateImageWithButtons: false,
zoomSensitivity: 1.0,
rectAspectRatio: 4/3,
texts: SwiftyCropConfiguration.Texts(
cancelButton: "Cancel",
interactionInstructions: "Custom instruction text",
saveButton: "Save"
),
fonts: SwiftyCropConfiguration.Fonts(
cancelButton: Font.system(size: 12),
interactionInstructions: Font.system(size: 14),
saveButton: Font.system(size: 12)
),
colors: SwiftyCropConfiguration.Colors(
cancelButton: Color.red,
interactionInstructions: Color.white,
saveButton: Color.blue,
background: Color.gray
)
)and use it like this:
.fullScreenCover(isPresented: $showImageCropper) {
if let selectedImage = selectedImage {
SwiftyCropView(
imageToCrop: selectedImage,
maskShape: .square,
// Use the configuration
configuration: configuration
) { croppedImage in
// Do something with the returned, cropped image
}
}
}When using the rectangle mask shape, you can allow users to freely adjust the crop area's aspect ratio at runtime by dragging handles on the edges of the mask. Enable this via allowAspectRatioResizing in the configuration and optionally constrain the range with minAspectRatio and maxAspectRatio.
let configuration = SwiftyCropConfiguration(
rectAspectRatio: 4/3,
allowAspectRatioResizing: true,
minAspectRatio: 0.5, // narrowest: 1:2
maxAspectRatio: 3.0 // widest: 3:1
)To adopt the new Liquid Glass design Apple introduced with iOS 26, SwiftyCrop renders a UI that reflects this design (the screenshots above). This replaces text buttons with icon buttons and much more. It is applied automatically whenever iOS 26, visionOS 26 or macOS 26 is available; older OS versions fall back to the classic UI shown below. There is no toggle for it.
All issue reports, feature requests, pull requests and GitHub stars are welcomed and much appreciated.
Thanks to @leoz for adding the circular crop mode, the demo app and the rotation functionality ๐
Thanks to @kevin-hv for adding the hungarian localization ๐ญ๐บ
Thanks to @Festanny for helping with the recangular cropping functionality ๐
Thanks to @lipej for adding the brazilian portugese localization ๐ง๐ท๐ต๐น
Thanks to @insub for adding the korean localization ๐ฐ๐ท
Thanks to @yhirano for adding the japanese localization ๐ฏ๐ต
Thanks to @yefimtsev for adding the ability to customize fonts and colors ๐ผ๏ธ
Thanks to @SuperY for adding the chinese localization ๐จ๐ณ
Thanks to @mosliem for adding the cropping in background thread ๐งต
Thanks to @krayc425 for adding visionOS support ๐ถ๏ธ
Thanks to @KuuttiProductions for adding the finnish localization ๐ซ๐ฎ
Thanks to @puyanlin for adding the traditional chinese localization ๐
Thanks to @navanchauhan for adding native macOS support ๐ฅ๏ธ
Thanks to @andrewhanshaw for adding the aspect ratio resizing functionality ๐
Another thanks to @andrewhanshaw for overhauling the cropping UI with a native SwiftUI toolbar, native macOS window support and a unified Liquid Glass design ๐ ๏ธ
SwiftyCrop is available under the MIT license. See the LICENSE file for more info.




