# PhotoTweaks gives iOS the crop gesture of the Photos app

> 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.

**itouch2/PhotoTweaks** — Drag, Rotate, Scale and Crop

- Repository: https://github.com/itouch2/PhotoTweaks
- Stars: 1,247 · Forks: 162
- Language: Objective-C
- License: MIT
- Published: 2026-10-19 · Updated: 2026-10-19 · Language: en
- Canonical page: https://hysenlabs.com/projects/itouch2-phototweaks

## 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:

```objective-c
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`:

```objective-c
- (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:

```ruby
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.

## 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.

## FAQ

### 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.

## Sources

- [Issues](https://github.com/itouch2/PhotoTweaks/issues)
- [itouch2/PhotoTweaks on GitHub](https://github.com/itouch2/PhotoTweaks)
- [License: MIT](https://github.com/itouch2/PhotoTweaks/blob/master/LICENSE)
- [README](https://github.com/itouch2/PhotoTweaks/blob/master/README.md)
- [Releases](https://github.com/itouch2/PhotoTweaks/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/itouch2-phototweaks
