Создание приложения Используя ImageCaptureCore
Используйте ImageCaptureCore
платформа для создавания бездисплейных приложений, приложений, требующих пользовательского UI для браузера устройства, представления камеры или представления сканера, или добавлять опции или управляющих не доступный в ImageKit
.
Этот раздел использует SimpleCameraBrowser
пример, который можно загрузить с примера кода Соединения Разработчика Apple.
Пример инстанцирует браузера устройства и выводит на экран массив камер в табличном представлении. Камеры являются свойствами браузера устройства, сохраненного как пары ключ/значение. Пользователь выбирает камеру и нажимает кнопку «Open», открывающую сеанс с выбранной камерой. Содержание камеры выведено на экран во втором табличном представлении, обернутом в представление прокрутки. Если камера содержит какие-либо загружаемые файлы образа, они перечислены миниатюрой, именем и датой, и кнопка «Download» активируется. Миниатюры возвращаются как базовое графическое изображение refs, таким образом, служебная функция преобразовывает их в NSImages
для дисплея в табличном представлении.
Даже при том, что ImageCaptureCore
использует программируемый интерфейс, он включает привязку Какао, таким образом, можно создать пользовательского Разработчика Интерфейса использования UI, поскольку этот пример иллюстрирует. Методы делегата и контроллеры массива записаны в коде, но табличные представления, прокручивая списки и кнопки создаются в Интерфейсном Разработчике, и они связываются вместе с помощью привязки Какао.
Начало работы
Можно открыться SimpleCameraBrowser
выборка и чтение вперед, или можно создать эквивалентную программу с нуля. Вот то, как создать его самостоятельно:
Откройте Xcode, выберите проект New Xcode, затем выберите Cocoa Application. Дайте Вашему приложению имя и сохраните его. Тогда добавьте QuartzCore.framework
к Вашему проекту. Если Вы открылись SimpleCameraBrowser
проект, набор SDK к Mac OS 10.6.
Создание заголовка контроллера приложения
Открытый appController.h
в выборке, или создают его самостоятельно следующим эти направления.
Создайте новый файл класса, названный appController (выберите New из меню File). XCode автоматически создает.h и.m файлы и добавляет их к проекту.
Контроллер приложения является Вашим делегатом к браузеру устройства.
Введите следующее в контроллер приложения .h
файл:
// Import the Cocoa and ImageCaptureCore headers |
#import <Cocoa/Cocoa.h> |
#import <ImageCaptureCore/ImageCaptureCore.h> |
// Create a public interface for the controller |
@interface appController : NSObject |
// Create delegates for the device browser and camera device classes. |
<ICDeviceBrowserDelegate, ICCameraDeviceDelegate> { |
// Create an instance variable for the device browser |
// and an array for the cameras the browser finds |
ICDeviceBrowser * mDeviceBrowser; |
NSMutableArray * mCameras; |
// Define Interface Builder outlets for two |
// array controllers -- one for cameras, |
// one for the chosen camera's files |
IBOutlet NSArrayController * mCamerasController; |
IBOutlet NSArrayController * mMediaFilesController; |
// Define IB outlets for the tableviews used to |
// display the cameras and the chosen camera's contents |
IBOutlet NSTableView * mCameraContentTableView; |
IBOutlet NSTableView * mCamerasTableView; |
} |
// Cameras are properties of the device browser stored in an array |
@property(retain) NSMutableArray* cameras; |
// Create a boolean to indicate whether the camera has images to download |
@property(readonly) BOOL canDownload; |
@end |
Создание контроллера приложения
Теперь давайте посмотрим на то, как создать контроллер приложения .m
файл.
#import "appController.h" |
// The camera device returns core graphics image refs, |
// convert them to NSImages for table view |
@interface NSImageFromCGImageRef: NSValueTransformer {} |
@end |
@implementation NSImageFromCGImageRef |
+ (Class)transformedValueClass { return [NSImage class]; } |
+ (BOOL)allowsReverseTransformation { return NO; } |
- (id)transformedValue:(id)item |
{ |
if ( item ) |
return [[[NSImage alloc] initWithCGImage:(CGImageRef)item size:NSZeroSize] autorelease]; else return nil; } @end @implementation appController |
// synthesize the getters and setters for camera properties |
@synthesize cameras = mCameras; |
// Main task -- on launch |
- (void)applicationDidFinishLaunching:(NSNotification*)notification { mCameras = [[NSMutableArray alloc] initWithCapacity:0]; // Get an instance of ICDeviceBrowser mDeviceBrowser = [[ICDeviceBrowser alloc] init]; // Assign a delegate mDeviceBrowser.delegate = self; // Look for cameras in all available locations mDeviceBrowser.browsedDeviceTypeMask = mDeviceBrowser.browsedDeviceTypeMask | ICDeviceTypeMaskCamera | ICDeviceLocationTypeMaskLocal | ICDeviceLocationTypeMaskShared | ICDeviceLocationTypeMaskBonjour | ICDeviceLocationTypeMaskBluetooth | ICDeviceLocationTypeMaskRemote; // Start browsing for cameras [mDeviceBrowser start]; } |
// Stop browser and release it when done |
- (void)applicationWillTerminate:(NSNotification*)notification { mDeviceBrowser.delegate = NULL; [mDeviceBrowser stop]; [mDeviceBrowser release]; [mCameras release]; } |
// Method delegates for device added and removed |
// |
// Device browser maintains list of cameras as key-value pairs, so delegate |
// must call willChangeValueForKey to modify list |
- (void)deviceBrowser:(ICDeviceBrowser*)browser didAddDevice:(ICDevice*)addedDevice moreComing:(BOOL)moreComing { if ( addedDevice.type & ICDeviceTypeCamera ) { addedDevice.delegate = self; // implement manual observer notification for the cameras property [self willChangeValueForKey:@"cameras"]; [mCameras addObject:addedDevice]; [self didChangeValueForKey:@"cameras"]; } } |
- (void)deviceBrowser:(ICDeviceBrowser*)browser didRemoveDevice:(ICDevice*)device moreGoing:(BOOL)moreGoing { device.delegate = NULL; // implement manual observer notification for the cameras property [self willChangeValueForKey:@"cameras"]; [mCameras removeObject:device]; [self didChangeValueForKey:@"cameras"]; } - (void)didRemoveDevice:(ICDevice*)removedDevice { [mCamerasController removeObject:removedDevice]; } // Check to see if the camera has image files to download |
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context { if ( [keyPath isEqualToString:@"selectedObjects"] && (object == mMediaFilesController) ) { [self willChangeValueForKey:@"canDownload"]; [self didChangeValueForKey:@"canDownload"]; } } - (BOOL)canDownload { if ( [[mMediaFilesController selectedObjects] count] ) return YES; else return NO; } |
// Download images |
// (Add a download button in interface builder -- use boolean to enable button) |
- (void)downloadFiles:(NSArray*)files { NSDictionary* options = [NSDictionary dictionaryWithObject:[NSURL fileURLWithPath:[@"~/Pictures" stringByExpandingTildeInPath]] forKey:ICDownloadsDirectoryURL]; for ( ICCameraFile* f in files ) { [f.device requestDownloadFile:f options:options downloadDelegate:self didDownloadSelector:@selector(didDownloadFile:error:options:contextInfo:) contextInfo:NULL]; } } |
// Done downloading -- log results to console for debugging |
- (void)didDownloadFile:(ICCameraFile*)file error:(NSError*)error options:(NSDictionary*)options contextInfo:(void*)contextInfo { NSLog( @"didDownloadFile called with:\n" ); NSLog( @" file: %@\n", file ); NSLog( @" error: %@\n", error ); NSLog( @" options: %@\n", options ); NSLog( @" contextInfo: %p\n", contextInfo ); } |
Это - весь код, в котором Вы будете нуждаться для браузера камеры. Остальная часть этого раздела показывает Вам, как создать Разработчика Интерфейса использования пользовательского интерфейса.
Создание пользовательского интерфейса
Поскольку ImageCaptureCore
привязка Какао поддержек, можно создать пользовательский интерфейс полностью в Интерфейсном Разработчике, не пишущий больше кодируют. Ваш интерфейс будет состоять из объекта (контроллер приложения), пара табличных представлений для показа камер и изображений и двух кнопок — один для выбора камеры из списка и другого к образам загрузки от камеры.
Создание UI в интерфейсном разработчике включает большое перетаскивание, отбрасывание, щелчок управления и щелчок по флажкам. Это просто показать и простой сделать, но описание обязательно несколько утомительно. Самый простой способ понять интерфейс состоит в том, чтобы открыться MainMenu
Соедините интерфейсом с файлом Разработчика в SimpleCameraBrowser
и проверьте его.
Описание того, как создать интерфейс самостоятельно, следует.
Создание объекта контроллера приложения
Дважды щелкните
MainMenu
файл в папке Interface Builder окна проекта.Выберите File> Read Class Files и перейдите к
appController.h
файл, который Вы создали. Нажмите Open.Перетащите объект (
NSObject
) от панели Library в окно документа.Введите appController в Поле имени окна Identity Inspector и нажмите Return.
Установка делегатов к владельцу файла и окну
В окне документа, щелчок управления значок File's Owner и перетаскивают к объекту appController. Выпуск. Выберите делегата во всплывающем меню.
Щелчок управления значок Window и перетаскивает к объекту appController. Выпуск. Выберите делегата во всплывающем меню.
Это делает Ваш объект контроллера приложения ответственным за события отправленный в окно и владельца файла.
Создание списка камер
Дважды щелкните по значку Window. Перетащите
NSTableView
от панели Library в окно. Позиция и размер это, как желаемый.Если Вы хотите сделать его прокручиваемым списком, введите значение в поле Line Scroll Vertical области Attribute, то щелкните в объекте представления прокрутки выбрать содержавший
NSTableView
и введите то же значение в поле Row Height области Size окна Inspector.Перетащите
NSImageCell
от панели Library вNSTableView
.Создайте заголовок для списка, притянув
NSTextField
от области Library. Дважды щелкните по нему и введите «Камеры». Перетащите его в позицию выше списка.
Создание списка файлов образа
Перетащите
NSTableView
от панели Library в окно. Позиция и размер это, как желаемый.Вы хотите, чтобы этот список был с возможностью прокрутки, поэтому введите значение в поле Line Scroll Vertical области Attribute, затем щелкните в объекте представления прокрутки выбрать содержавший
NSTableView
и введите то же значение в поле Row Height области Size окна Inspector.Введите значение 3 в поле Columns области Attributes окна Inspector.
Перетащите
NSImageCell
от панели Library в первый столбецNSTableView
.Маркируйте вторые и третьи столбцы «Name» и «Date» путем щелчка в панели заголовка столбцов.
Создание контроллера массива камеры
Перетащите
NSArrayController
от панели Library на окно MainMenu.Введите “Контроллер Камер» в Поле имени инспектора Идентификационных данных окно и нажмите Return.
Щелкните по инспектору атрибутов.
Используя плюс (+) кнопка, добавьте следующие ключи для Объектного Контроллера:
имя
содержание
значок
mediaFiles
Отмена выбора избегает пустого выбора и выбирает вставленные объекты.
Щелкните по вкладке Bindings в Инспекторе Атрибутов.
В разделе Controller Content, для Довольного привязка Массива, нажимают Bind To и выбирают appController из всплывающего меню.
Введите «камеры» в поле Model Key Path.
Создание контроллера массива медиа-файлов
Перетащите
NSArrayController
от панели Library на окно MainMenu.Введите “Контроллер MediaFiles» в Поле имени инспектора Идентификационных данных окно и нажмите Return.
Щелкните по инспектору атрибутов.
Используя плюс (+) кнопка, добавьте следующие ключи для Объектного Контроллера:
thumbnailIfAvailable
имя
размер
creationDate
Отмена выбора избегает пустого выбора и выбирает вставленные объекты.
Щелкните по вкладке Bindings в Инспекторе Атрибутов.
В разделе Controller Content, для Довольного привязка Массива, нажимают Bind To и выбирают Cameras Controller из всплывающего меню.
Выберите mediaFiles в Ключевом всплывающем меню Пути Модели.
Соединение выходов
Щелчок управления appController возражает в окне MainMenu. Перетащите к табличному представлению камер. Выпуск. Выберите mCameraTableView в окне Outlets.
Если Вы сделали табличное представление камеры повторным шагом 1 с возможностью прокрутки для представления прокрутки.
Щелчок управления appController возражает в окне MainMenu снова. Перетащите к табличному представлению медиа-файлов. Выпуск. Выберите mCameraContentTableView в окне Outlets.
Повторите шаг 3 для представления прокрутки содержания камеры.
Щелчок управления Контроллер Приложения снова. На сей раз перетащите к Контроллеру Камер в том же окне. Выпуск. Выберите mCameraController в окне Outlets.
Щелчок управления Контроллер Приложения снова. На сей раз перетащите к Контроллеру Медиа-файлов в том же окне. Выпуск. Выберите mMediaFilesController в окне Outlets.
Создание открытой кнопки
Вам нужен способ для пользователя выбрать устройство из списка. Кнопка «Open» работает.
Перетащите NSButton от области Library в окно. Расположите его ниже табличного представления камеры, дважды щелкните по нему и введите «Открытый».
С нажатой кнопкой откройте Target в Инспекторе Привязки. Нажмите Bind к флажку и выберите Cameras Controller из всплывающего меню.
В поле Selector Name введите requestOpenSession.
Это заставляет кнопку «Open» выпускать requestOpenSession к браузеру устройства от Контроллера Камеры.
В поле Model Key Path введите hasOpenSession. в трансформаторную подстанцию Value, введите NSNegateBoolean.
Это говорит браузеру устройства переключаться к булеву значению hasOpenSession для выбранного устройства.
Отображение значка камеры и имени
Щелкните по первому столбцу табличного представления камеры. Откройте Инспектора Привязки. Нажмите Value, затем Свяжите С: и выберите Cameras Controller из всплывающего меню.
Нажмите Model Key Path и введите значок.
Нажмите Value Transformer и войдите
NSImageFromCGRef
.Отмена выбора, позволяющая многократные выборы значения.
Щелкните по второму столбцу в табличном представлении камеры. Нажмите Value в Инспекторе Привязки и выберите Cameras Controller снова.
В Ключевом Поле трактов Модели введите имя.
Отображение миниатюр изображения, имен и дат
Щелкните по первому столбцу табличного представления медиа-файлов. Откройте Инспектора Привязки. Нажмите Value, затем Свяжите С: и выберите MediaFiles Controller из всплывающего меню.
Нажмите Model Key Path и введите thumbnailIfAvailable.
Нажмите Value Transformer и войдите
NSImageFromCGRef
.Щелкните по второму столбцу в табличном представлении камеры. Нажмите Value в Инспекторе Привязки и выберите MediaFiles Controller снова.
В Ключевом Поле трактов Модели введите имя.
Щелкните по третьему столбцу в табличном представлении камеры. Нажмите Value в Инспекторе Привязки и выберите MediaFiles Controller все снова и снова.
В Поле ключа Контроллера введите arrangedObjects
В Ключевом Поле трактов Модели введите creationDate.
Пользовательский интерфейс теперь завершен. Необходимо быть в состоянии создать и запустить приложение.