PhotoTweaks gives iOS the crop gesture of the Photos app
Drag, Rotate, Scale and Crop
At a glance
- What is it?
- PhotoTweaks is a small Objective-C component that puts a drag, rotate, scale and crop interface in front of a picked image, mimicking the interaction of Photos.app on iOS 8. It is a single view controller you push, and its age shows in both its Objective-C API and its 2016 release history.
- Who is it for?
- Adopt PhotoTweaks if you are maintaining an Objective-C iOS app that needs a crop screen and you want the Photos.app interaction without writing the gesture handling, since the whole component is one view controller and one delegate callback. Do not adopt it for new Swift or SwiftUI work, because the API is Objective-C, the pod is still versioned at 1.0.4 and the project has not released since 2016.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 153 days ago.
- What is it written in?
- Mainly Objective-C, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.
Editorial analysis
One view controller pushed onto the picker
The integration is short because the component does one thing. You take the original image from the image picker, build a `PhotoTweaksViewController` with it, set yourself as the delegate, and push it:
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
PhotoTweaksViewController *photoTweaksViewController = [[PhotoTweaksViewController alloc] initWithImage:image];
photoTweaksViewController.delegate = self;
photoTweaksViewController.autoSaveToLibray = YES;
photoTweaksViewController.maxRotationAngle = M_PI_4;
[picker pushViewController:photoTweaksViewController animated:YES];The view controller is described as offering all the operations to crop the photo, which includes translation, rotate and scale. Pushing rather than presenting is a deliberate choice that matches how the picker itself behaves, so the user gets a back button and a consistent navigation bar rather than a modal sheet with its own chrome. The component is written to mimic the interaction of Photos.app on iOS 8, which is the reference point to judge it against, since the whole point of the library is that the gesture feels like the system one.
The cropped image comes back through one delegate method
The output side is a single delegate callback that hands you the cropped `UIImage`:
- (void)photoTweaksController:(PhotoTweaksViewController *)controller didFinishWithCroppedImage:(UIImage *)croppedImage
{
[controller.navigationController dismissViewControllerAnimated:YES completion:nil];
// cropped image
}There is no configuration object, no options struct and no delegate method for the cancel case in the documented usage, which tells you the shape of the library. It is a view controller with a few properties, not a framework with a policy. The delegate name changed in one of the early releases, with the v1.0.2 tag noting a minor change to the `PhotoTweaksViewControllerDelegate`, so if you are upgrading across that boundary, the callback signature is the thing to check first. The `autoSaveToLibray` property name carries a typo in the original source, and it is spelled that way in the property rather than corrected, so a search for the correctly spelled word will not find it.
The rotation limit is the one knob worth setting deliberately
The `maxRotationAngle` property sets the maximum supported rotation angle, and the example sets it to M_PI_4. Setting it explicitly, as the example does, is a decision worth thinking about rather than accepting. A crop interface that allows free rotation has to decide how a non-axis-aligned rectangle is rasterised at the edges, and a component that lets you lock rotation to right angles sidesteps that entirely. Setting it explicitly also keeps the crop rectangle consistent with the layout that hosts it, because a rotated crop rectangle in a container sized for a portrait image is a layout problem the host app has to solve. The `autoSaveToLibray` property is the other one to look at, since it makes the component write the result to the photo library itself rather than leaving that to you.
The picker editing flag will bite you if you miss it
There is a single warning in the documentation and it is worth repeating, because the failure it prevents is confusing rather than obvious. If you are using PhotoTweaks alongside an existing `UIImagePickerController`, be sure to set `allowsEditing = NO`, otherwise you may force the user to crop with the native editing tool before showing `PhotoTweaksViewController`. The picker has its own crop step, and with editing enabled the user goes through it first, then through PhotoTweaks, and the result is either two crops or a cropped image that never reaches your component. The native iOS editing screen and this component do the same job, so the two together are redundant, and the fix is one property on the picker.
CocoaPods, a podspec and an Xcode project side by side
Installation is the conventional CocoaPods one, with the pod pinned to a compatible range:
pod 'PhotoTweaks', '~> 1.0.4'The alternative is to drag the `PhotoTweaks` folder into your Xcode project manually, which is the route the README gives for people not using CocoaPods, and the same folder is the unit of the distribution. The repository layout backs that up: the root holds a `PhotoTweaks.podspec` for the pod, a `PhotoTweaks.xcodeproj` directory for the project, the `PhotoTweaks/` source directory itself, and a `PhotoTweaksTests/` directory for the tests. There is also a `.travis.yml` file, which is the continuous integration configuration of the era, and a `.gitignore`. The project is distributed under the MIT licence with the licence file at the root, and the README carries CocoaPods badges for the version, the platform and the licence.
What the release history says about where this sits now
The tags tell a clear story about the project's status. The most recent is 1.0.4, titled as minor issues resolved, dated 2016-10-12. Before that, 1.0.3 from 2016-05-24 added support for any angle to rotate, which is the feature that made the `maxRotationAngle` limit relevant, and 1.0.2 from 2015-06-10 changed the delegate. The last push to the master branch was on 2026-05-25, so the code is still being touched, but the published version has not moved in a decade, and the pod version constraint in the README still points at 1.0.4. The Objective-C choice and the iOS 8 reference point both place this firmly in the era of the original UIImagePickerController, before the PHPicker and SwiftUI equivalents, which is where its value and its limits come from.
Editorial conclusion
Adopt PhotoTweaks if you are maintaining an Objective-C iOS app that needs a crop screen and you want the Photos.app interaction without writing the gesture handling, since the whole component is one view controller and one delegate callback. Do not adopt it for new Swift or SwiftUI work, because the API is Objective-C, the pod is still versioned at 1.0.4 and the project has not released since 2016. Verify first that your app disables editing on the image picker, because the README warns that leaving it enabled forces the user through the native crop tool before your screen appears, and check that the rotation limit you set suits your layout.
Frequently asked questions
How do I use PhotoTweaks to crop an image?
Create a `PhotoTweaksViewController` with the image, set its delegate to yourself, and push it onto the navigation stack. The cropped result arrives in the `photoTweaksController:didFinishWithCroppedImage:` delegate method.
How do I install PhotoTweaks in an iOS project?
Through CocoaPods with `pod 'PhotoTweaks', '~> 1.0.4'`, or by dragging the PhotoTweaks folder into your Xcode project manually. The repository contains both a podspec and an Xcode project.
What is the maxRotationAngle property for in PhotoTweaks?
It sets the maximum supported rotation angle for the crop, with the README example using M_PI_4. The property matters because version 1.0.3 added support for rotating at any angle.
Why does PhotoTweaks need allowsEditing set to NO?
With an existing `UIImagePickerController`, leaving editing enabled can force the user through the native crop tool before PhotoTweaksViewController is shown, because both do the same job.
What licence is PhotoTweaks released under?
The project is under the MIT licence, with the licence file in the repository root, and the README carries a CocoaPods licence badge pointing at it.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/itouch2-phototweaks)Was this useful?