Subscribe to updates: RSS | Twitter
IMPORTANT: The Aviary iOS SDK will no longer be distributed via GitHub, please visit http://www.aviary.com/ios to download the latest version. Starting with v2.6.0 the Aviary iOS SDK will no longer support iOS 4.3. If your app supports iOS 4.3, you should not update to v2.6.0 as it may result in crashes for your iOS 4.3 users. Release v2.5.8 is the last version to support iOS 4.3. Please contact us if you need a copy.
IMPORTANT: v2.5.8 is the last version of the Aviary iOS SDK which will support iOS 4.3+. Every new release starting with the upcoming v2.6 will require iOS 5.0+. If your app supports iOS 4.3, you should not update to v2.6+ as it may result in crashes for your iOS 4.3 users.
scale and size property valuesstyle attribute to always return nilVersion 2.5.0 is a big update to the SDK, including GPU-based image processing, a new tool, and many improvements to existing user and developer-facing features. To support these great additions, we've added a couple of framework dependencies, namely:
OpenGLES.framework
CoreText.framework
For the full list of frameworks, see README.md.
In order to continue evolving the SDK, we've also deprecated a few high-res API methods in AFPhotoEditorSession and AFPhotoEditorContext:
// AFPhotoEditorSession.h
- (AFPhotoEditorContext *)createContext DEPRECATED_ATTRIBUTE;
- (AFPhotoEditorContext *)createContextWithSize:(CGSize)size DEPRECATED_ATTRIBUTE;
// AFPhotoEditorContext.h
- (void)renderInputImage:(UIImage *)image completion:(void (^)(UIImage *result))completion DEPRECATED_ATTRIBUTE;
We've provided new methods to better support GPU-based image processing, one of the biggest features introduced in this update. These deprecated methods will continue to provide CPU-based processing for now, but expect them to be removed in 3.0.
This version also includes a completely new, dynamic visual customization and configuration API, provided via class methods in AFPhotoEditorCustomization. We've wired up the old visual customization API in AFPhotoEditorStyle to use the new one, so it should continue to function as expected.
If you run into any problems with the upgrade, let us know!
This is the first public release of 2.3.x. We've added a few new features and fixed a number of issues since the last 2.2.x release, all of which are documented below. Enjoy!
Improved memory conservation: memory for high-res output is only allocated if needed (it is not allocated if the user does not perform any actions in the editor).
The image passed to an AFPhotoEditorContext render call will now be nil if the user does nothing in the editor (instead of a non-nil, but empty UIImage object). The same behavior occurs if the user taps "Cancel" in the editor.
Fixed a minor bug in the "Auto" action inside the Enhance tool.
Added sound to the Brightness, Contrast and Saturation tools (the same sound played by the iOS keyboard; the sound will play if the user has "Keyboard Clicks" enabled in the Settings app).
Added three new classes:
AFPhotoEditorStyle
AFPhotoEditorSession
AFPhotoEditorContext
These classes allow developers to control the appearance of an AFPhotoEditorController instance, obtain high-resolution output from the editor, and more. See the "High Resolution" and "Customization" sections in the README for more information.
Added the "Viewfinder" effect pack for in-app purchase partners.
Note: this update adds a dependency on CoreData.framework. Information about downloadable content packs, as well as information about purchases if in-app purchase is enabled, is stored in a database in the app's user documents directory.
Note: the addition of in-app purchase functionality and our updated analytics code now requires apps integrating the SDK to link against the following libraries:
Please update your build settings accordingly.
AFPhotoEditorController allowing selection and reordering of tools in the SDK interface. Please see the "Customization" section of the README for more information.Welcome to the new and improved Aviary editor! This is a ground-up redesign, including a completely new user interface, updated effects, and a few new tools. We'll be following up with new features and bug fixes on a regular basis, so check back soon for updates.
The Meme tool has been restored as a beta feature. It is disabled by default, but you can enable it by passing the following constant (defined in AFFeatherConstants.h) when creating your AFFeatherController instance:
extern NSString *const kAFMeme;
As a result of adding this tool, we have also introduced a dependency on Core Text. Please add this framework to your "Link Binary With Libraries" build phase, regardless of whether or not you're using the meme tool:
CoreText.framework
We may periodically release more of these beta tools in the future, so stay tuned!
Follow-up fix for the resizing bug affecting images smaller than 960x960.
Fixes a resizing error causing images with certain imageOrientation property values to become distorted.
This release aims to resolve a duplicate symbol error encountered when using MBProgressHUD with the Aviary SDK.
This release features many bug fixes and a new (optional) iPad interface. We're also now building against the iOS 5 SDK with Xcode 4.2 GM.
We've cleaned up the public interface to AFFeatherController, and added an init method allowing iPad apps to display an interface tailored to the iPad form factor:
- (id)initWithImage:(UIImage *)image andTools:(NSArray *)tools andUserInterfaceIdiom:(UIUserInterfaceIdiom)idiom;
There are currently two possible values you can pass via the idiom parameter:
UIUserInterfaceIdiomPhone
UIUserInterfaceIdiomPad
Passing the first will initialize the controller with the iPhone interface, while the latter will initialize with the iPad interface. Note: UIUserInterfaceIdiomPad will only work correctly on iPad devices.
The standard init methods are still present, and will display the interface associated with the current device's user interface idiom:
- (id)initWithImage:(UIImage *)image;
- (id)initWithImage:(UIImage *)image andTools:(NSArray *)tools;
A number of issues with 1.1.x have been reported. Here are a few of the changes we've made:
This is a minor update. A much more significant update is coming shortly.
This update includes important fixes related to App Store submission:
The text of the cancellation confirmation dialog has been updated.
This update adds the following methods to the AFFeatherDelegate protocol:
- (BOOL)featherShouldConfirmCancel:(AFFeatherController *)featherController;
Implement this method to control whether or not a confirmation dialog is presented to the user upon dismissing the SDK interface without saving.
This update resolves two issues in the 1.1.4 build:
This update resolves a display issue caused by hiding the status bar.
This update adds the following filter effects to the Effects plugin:
This update additionally makes it easier to select which plugins (tools and effects) are enabled in your distribution, at compile time and at run time.
Each plugin has its own bundle, containing resources used only by that individual plugin. These bundles are packaged within AviarySDK-Plugins.bundle. For now, the best way to omit a plugin and its resources entirely from your application is to remove that plugin's bundle from AviarySDK-Plugins.bundle. We are working on better ways to accomplish this, but if you only want to use a few plugins, simply remove the ones you don't intend to use.
A number of constants have been added to AFFeatherConstants.h, which correspond to values passed to AFFeatherController's -initWithImage:andTools: method, and the pluginId property of AFFeatherPlugin objects (used in conjunction with the -feather:buttonForPlugin: delegate method).
An example of initializing the AFFeatherController instance is as follows:
- (void)displayEditorForImage:(UIImage *)image
{
NSArray *tools = [NSArray arrayWithObjects:kAFEffects, kAFCrop, kAFRotate, kAFFlip, nil];
AFFeatherController *featherController = [[AFFeatherController alloc] initWithImage:image andTools:tools];
[featherController setDelegate:self];
[self displayModalViewController:featherController animated:YES];
[featherController release];
}
And here is an example of customizing buttons:
- (UIButton *)feather:(AFFeatherController *)controller buttonForPlugin:(id<AFFeatherPlugin>)plugin
{
UIButton *button = [plugin button];
if ([[plugin pluginId] isEqualToString:kAFEffects]) {
// Set up the effects button
} else {
// Set up other buttons
}
return button;
}
New plugin ID constants:
// Top-level plugin constants:
extern NSString *const kAFBlemish;
extern NSString *const kAFBlur;
extern NSString *const kAFBrightness;
extern NSString *const kAFColors;
extern NSString *const kAFContrast;
extern NSString *const kAFCrop;
extern NSString *const kAFDrawing;
extern NSString *const kAFEffects;
extern NSString *const kAFFlip;
extern NSString *const kAFMeme;
extern NSString *const kAFRedeye;
extern NSString *const kAFRotate;
extern NSString *const kAFSaturation;
extern NSString *const kAFSharpen;
extern NSString *const kAFStickers;
extern NSString *const kAFText;
extern NSString *const kAFWhiten;
// Effects plugin constants:
extern NSString *const kAFAlwaysSunny;
extern NSString *const kAFAutoEnhance;
extern NSString *const kAFCinematic;
extern NSString *const kAFCodeRed;
extern NSString *const kAFDaydream;
extern NSString *const kAFHeatwave;
extern NSString *const kAFIndiglow;
extern NSString *const kAFNegative;
extern NSString *const kAFOriginal;
This update mainly provides better interface customization support, particularly for applying images to different interface elements. A new protocol and three new properties have been added to AFFeatherController.
It also resolves the presentation animation lag issue introduced in 1.1.0.
Future updates to the SDK will provide customization options via this new protocol.
@protocol AFInterfaceElement <NSObject>
@required
@property (...) UIColor *tintColor;
@property (...) UIImage *backgroundImage;
@end
AFInterfaceElement objects provide an entry point for customizing different views within the SDK. Three read-only references to objects have been provided in AFFeatherController.h:
@interface AFFeatherController : UIViewController {
// ...
}
// ...
@property (...) id<AFInterfaceElement> topBar;
@property (...) id<AFInterfaceElement> bottomBar;
@property (...) id<AFInterfaceElement> paramsBar;
// ...
@end
Note that these objects are not necessarily subclasses of UIView. They are proxy objects created before their corresponding views in order to support customization prior to displaying the user interface.
This property allows background images and textures to be applied to different views in the SDK. In most cases, it is implemented by using +[UIColor colorWithPatternImage:], and setting the resulting color to the backgroundColor property of a view, except for the top bar (topBar), which draws the image within its bounds, stretching it instead of tiling.
backgroundImage and tintColor may be used simultaneously, although a full alpha tintColor will obscure the background image. You may want to experiment with the alpha channel, or disable a view's tintColor entirely by setting it to [UIColor clearColor]. Again, there is an exception for topBar: setting a backgroundImage will obscure the tintColor of the bar, although the buttons will remain tinted.
This update resolves two issues:
There is a known issue that didn't make it into this release, but will be resolved shortly:
This is a significant update to the Feather iOS SDK, and will require you to change your code slightly.
The following interfaces have changed:
AFWidgetController class has been renamed to AFFeatherController.-afFinishedWithImage: and -afCanceled-feather:finishedWithImage: and -featherCanceled:-feather:buttonForPlugin:Please update your code accordingly. This one-time change is necessary for ongoing improvement of the SDK.
Several methods have been added to the AFFeatherController class to enable customization of the top and bottom bars:
-setTitleBarTintColor:-setPluginBarTintColor:-setPluginParametersBarTintColor:Each method takes one UIColor object as input. The UIColor must be in the device RGB color space--you cannot use a pattern, for example (though we aim to provide this functionality in a future update). You should call these methods after initializing and before displaying the AFFeatherController to the user.
This method has been added to help support more advanced customization of the Feather interface. Here is the full method signature:
-(UIButton *)feather:(AFFeatherController *)featherController buttonForPlugin:(id<AFFeatherPlugin>)plugin
You should implement this method if you want to customize the buttons at the bottom of the main interface. The plugin parameter provides access to some useful information about each plugin, including:
pluginId - its identifier (e.g. "redeye")localizedName - its localized name (e.g. "Redeye"--currently English only)icon - a UIImage representation of the default iconbutton - a reference to the default button instanceNote in particular the button property. This is the default button instance. Returning this object unchanged will result in the same behavior as leaving this method unimplemented. Alternatively, you may use the button's -setTintColor: method to assign it a tint color.
Providing your own UIButton instance will enable you to more fully customize the look and feel of the interface, with one minor caveat: the button you provide may be resized. Be sure to take this into account when creating your buttons.
Initial release.