Core Animation

Пример Core Animation, NSTableView анимация ячеек

Использование элемента управления NSTableView в view-based режиме отображения строк, с анимацией переключения видов.

В данном примере с помощью технологии Core Animation будет произведен разворот видов представления строки таблицы вокруг оси Y и замена его другим видом, создавая эффект поворота двухстороннего вида.

Видео примера, с реализацией смены вида представления строки таблицы другим пердставлением вида строки.

Скачать копию проекта

Создаем новый проект в Xcode, с названием "w_ViewBased" и префиксом имен mb, и добавляем в главное окно приложения элемент управления TableView. Для упрощения примера оставляем один столбец. Растягиваем строку вниз до высоты, используемого нами вида представления 88 пикселей.

nstableview xcode

Указываем Класс контроллера приложения в качестве источника данных и делегата для таблицы.

nstableview delegate datasource

Создаем или копируем в папку с проектом файлы mbFliperViews.h и mbFliperViews.m, с помощью данного класса мы будем вращать вокруг оси виды в ячейках таблицы. Добавляем эти файлы к проекту, и добавляем в проект библиотеку QuartzCore.framework.

Создаем новый класс mbCars наследуемый от NSObject, в котором мы будем хранить данные для строки таблицы:

Листинг mbCars.h

#import <Foundation/Foundation.h>

@interface mbCars : NSObject

@property (copy)NSDate* dateAdd;
@property (copy)NSString* make; // марка
@property (copy)NSString* model;
@property short fueltype;// тип топлива 0-бензин, 1-дизель, 2-электро
@property (copy)NSImage* photo;

@end

Листинг mbCars.m

#import "mbCars.h"

@implementation mbCars

@synthesize dateAdd, make, model, fueltype, photo;

@end

Далее добавляем в проект два изображения автомобилей jpeg типа.

Создадим еще один класс mbViewCars унаследованный от NSViewController с одноименным файлом ресурсов mbViewCars.xib

Листинг mbViewCars.h

#import <Cocoa/Cocoa.h>

@class mbCars;
@class mbFliperViews;

@interface mbViewCars : NSViewController
{
  mbCars* car;
  
  //поля для вывода нередактируемой информации
  IBOutlet NSTextField* tfMake;
  IBOutlet NSTextField* tfModel;
  IBOutlet NSTextField* tfFuel;
  IBOutlet NSTextField* tfDateAdd;
  IBOutlet NSImageView* ivPhoto;
  
  //поля для редактирования
  IBOutlet NSDatePicker* dpDateAdd;
  IBOutlet NSComboBox* cbMake;
  IBOutlet NSTextField* tfModelEdit;
  IBOutlet NSPopUpButton* ppFuelSelect;
  IBOutlet NSButton* ivPhotoEdit;
  
  IBOutlet mbFliperViews* fliper;
  NSView *mainView;
  
}
- (id)initWithCars:(mbCars*)cars;//Инициализатор 
@property (readonly)mbCars* car;
@property (strong) IBOutlet NSView *editView;
- (IBAction)clickPhoto:(id)sender;
- (IBAction)back:(id)sender;

@property (strong) IBOutlet NSView *mainView;
@end

Листинг mbViewCars.m

#import "mbViewCars.h"
#import "mbCars.h"
#import "mbFliperViews.h"

@interface mbViewCars ()
- (void)fillTf;
@end

@implementation mbViewCars
@synthesize mainView;

@synthesize car;
@synthesize editView;

- (id)initWithCars:(mbCars*)cars
{
    self = [super initWithNibName:@"mbViewCars" bundle:nil];
    if (self) {
        // Initialization code here.
      car = cars;
    }
    
    return self;
}

- (void)fillTf //Метод заполняет данными из mbCars нередактируемые поля
{
  tfMake.stringValue = [NSString stringWithFormat:@"Марка: %@",car.make];
  tfModel.stringValue = [NSString stringWithFormat:@"Модель: %@",car.model];
  NSString* s[3] = {@"бензин", @"дизель", @"электро"};
  tfFuel.stringValue = [NSString stringWithFormat:@"Топливо: %@",s[car.fueltype & 3]];
  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  [dateFormatter setDateFormat:@"dd-MM-yyyy"];
  tfDateAdd.stringValue = [dateFormatter stringFromDate:car.dateAdd];
  [ivPhoto setImage:car.photo];
}

- (void)awakeFromNib // Инициализация полей после загрузки nib файла
{
  [self.view addSubview:mainView];
  [self fillTf];
  tfModelEdit.stringValue = car.model;
  [ppFuelSelect selectItemAtIndex:(NSInteger)car.fueltype];
  cbMake.stringValue = car.make;
  [ivPhotoEdit setImage:car.photo];
  dpDateAdd.dateValue = car.dateAdd;
  
  [fliper addView:mainView];
  [fliper addView:editView];
  fliper.superView = self.view ;
  [fliper setActiveViewAtIndex:0];
}

- (IBAction)clickPhoto:(id)sender {
  NSWindow* mainWndow = self.view.window;
  NSOpenPanel* panel = [NSOpenPanel openPanel];
  [panel setCanChooseFiles:YES];
  [panel setAllowsMultipleSelection:NO];
  [panel setMessage:@"Select image file"];
  [panel beginSheetModalForWindow:mainWndow completionHandler:^(NSInteger result){
    if (result == NSFileHandlingPanelOKButton) {
      NSArray* urls = panel.URLs;
      if(urls.count){
        NSImage* img = [[NSImage alloc]initWithContentsOfURL:[urls objectAtIndex:0]];
        [ivPhotoEdit setImage:img];
      }
    }
    
  }];
}

- (IBAction)back:(id)sender {
  car.make = cbMake.stringValue;
  car.model = tfModelEdit.stringValue;
  car.fueltype = ppFuelSelect.indexOfSelectedItem;
  car.dateAdd = dpDateAdd.dateValue;
  car.photo = ivPhotoEdit.image;
  [self fillTf];
  [fliper flipLeft:sender];
}
@end

Отображение mbViewCars.xib

Все поля связываются с соответствующими IBOutlet ссылками, кнопка "Edit" связывается с методом flipRight добавленного объекта для класса mbFliperViews, кнопка "Return" связывается с методом back

Реализация файла контроллера приложения должна включать два обязательных метода:

  • numberOfRowsInTableView: - метод протокола NSTableViewDataSource, запрашивается таблицей и возвращает количество строк для отображения.
  • tableView:viewForTableColumn:row: - метод протокола NSTableViewDelegate, этот метод обеспечивает наполнение таблицы данными для конкретного столбца и строки.

Листинг mbAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface mbAppDelegate : NSObject <NSApplicationDelegate>
{
  NSMutableArray* cars; //Массив с данными для таблицы
  IBOutlet NSTableView* table1; //таблица
}

@property (assign) IBOutlet NSWindow *window;

@end

Листинг mbAppDelegate.m

#import "mbAppDelegate.h"
#import "mbCars.h"
#import "mbViewCars.h"

@implementation mbAppDelegate

@synthesize window = _window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
  // Insert code here to initialize your application
  
  cars = [NSMutableArray array];
  
  // Mercedes SL500
  mbCars* car = [[mbCars alloc]init];
  car.dateAdd=[NSDate date];
  car.make = @"Mercedes";
  car.model = @"SL500";
  car.fueltype = 0;
  NSString* sPath = [[NSBundle mainBundle] pathForResource:@"sl500" ofType:@"jpg"];
  car.photo = [[NSImage alloc] initWithContentsOfFile:sPath];
  mbViewCars *viewCars = [[mbViewCars alloc] initWithCars:car];
  [cars addObject:viewCars];
  
  //BMW X6 3.0d
  
  mbCars* car1 = [[mbCars alloc]init];
  car1.dateAdd=[NSDate date];
  car1.make = @"BMW";
  car1.model = @"X6 3.0d";
  car1.fueltype = 1;
  sPath = [[NSBundle mainBundle] pathForResource:@"x5" ofType:@"jpg"];
  car1.photo = [[NSImage alloc] initWithContentsOfFile:sPath];
  mbViewCars *viewCars1 = [[mbViewCars alloc] initWithCars:car1];
  [cars addObject:viewCars1];
  
  [table1 reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
  return cars.count;
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)col row:(NSInteger)row
{
  mbViewCars* car = [cars objectAtIndex:row];
  NSView* result = nil;
  result = car.view;
  return result;
}
@end

 

См. также:

Core Animation, разворот пользовательских видов
Core Animation, разворот Окон вокруг оси
 
 
homeЗаметили ошибкукарта сайта  EN
   Made on a Mac