Показаны сообщения с ярлыком Cocoa. Показать все сообщения
Показаны сообщения с ярлыком Cocoa. Показать все сообщения

Как использовать NSTreeController?

Создадим обычный Cocoa Application проект.



Как работает метод convertRectToScreen: класса NSWindow

В окне три представления (NSView). Синее вложено в зеленое, а зеленое в красное. Красное представление находится прямо в окне. 


Из чего состоит Cocoa-приложение работающее с Core Data


Базовый шаблон Cocoa Application проекта с поддержкой Core Data состоит из следующих файлов:
  • AppDelegate.h
  • AppDelegate.m
  • ViewController.h
  • ViewController.m
  • Assets.xcassets
  • Main.storyboard
  • Info.plist
  • Core_Data_Template.xcdatamodeld
  • main.m

Рассмотрим все файлы и код в них чтобы понять какую роль они играют в проекте.

Кривые Безье в Cocoa на примере создания простой прямоугольной выноски

Рассмотрим как с помощью класса NSBezierPath можно нарисовать простую прямоугольную выноску.


Для этого в методе drawRect: класса NSView напишем следующий код:

    NSBezierPath *thePath = [NSBezierPath bezierPath];
    [thePath moveToPoint:NSMakePoint(NSMidX(aDirtyRect), NSMaxY(aDirtyRect))];
    
    NSUInteger theArrWidth = 32, theArrHeight = 24;
    [thePath lineToPoint:NSMakePoint(NSMidX(aDirtyRect) + theArrWidth / 2, NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMaxX(aDirtyRect), NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMaxX(aDirtyRect), NSMinY(aDirtyRect))];
    [thePath lineToPoint:NSMakePoint(NSMinX(aDirtyRect), NSMinY(aDirtyRect))];
    [thePath lineToPoint:NSMakePoint(NSMinX(aDirtyRect), NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMidX(aDirtyRect) - theArrWidth / 2, NSMaxY(aDirtyRect) - theArrHeight)];
    
    [thePath closePath];
    
    [[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setFill];
    [thePath fill];
    
    [[NSColor blueColor] setStroke];
    [thePath stroke];

Крыша у выноски получилась более четкая, чем остальные краевые линии собственно потому что мы краевые линии рисовали на границе вьюхи. Тут не помешало бы сделать отступ с помощью NSInsetRect.

Если дальше развивать код, то с помощью функции curveToPoint:controlPoint1:controlPoint2: можно сделать закругленные углы, сделав тем самым скругленную прямоугольную выноску.

исходники

P.S. Кстати еще можно автоматически парсить SVG path и рисовать его на вью.

Как работает функция NSInsetRect?

Функция NSInsetRect смещает стороны прямоугольника на заданную величину.

Например, следующий код:

    [[NSColor redColor] setFill];
    NSRectFill(aDirtyRect);
    
    float theLineThickness = 50;
    NSRect theContentRect = NSInsetRect([self bounds], theLineThickness, theLineThickness);
    [[NSColor greenColor] setFill];
    NSRectFill(theContentRect);

выдаст:


Изначально мы залили весь вью красным цветом. Потом с помощью функции NSInsetRect сместили стороны и по горизонтали и по вертикали на 50 единиц. И залили получившийся прямоугольник зеленым цветом. Ширина образовавшейся красной полоски составляет 50 px.

исходники

Что означает canBecomeKeyWindow?

Если метод canBecomeKeyWindow подкласса NSWindow возвращает YES, то фокус ввода переходит в показанное окно:

Разбираемся с NSDate

UTC — это всемирное координированное время, стандарт времени, принятый на Земле. От UTC отсчитываются часовые пояса. UTC заменил устаревшее время по Гринвичу (GMT). UTC расшифровывается как Coordinated Universal Time (по-английски).


Что такое NSResponder

NSResponder is one of the fundamental classes in Cocoa. Any class that can respond to events like key presses or menu commands should be a subclass of NSResponder. Each responder keeps track of it's "next responder", and each window keeps track of the object that's currently the "first responder". When an event happens in a window, a message is sent to the first responder. If that object handles the message, great. If not, it passes it along to its next responder. This is known as the "responder chain."

Normally, you don't mess much with the responder chain in Cocoa. The first responder is mostly determined by user actions, such as clicking on a control.

Как в Cocoa получить путь к папке с документами пользователя

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [NSString stringWithFormat:@"%@/", paths.firstObject];

Дайджест по программировании №19




Иконки для Retina дисплея

В 2010 году вместе с iPhone 4 компания Apple запустила на рынок новую технологию — экраны ультравысокой четкости Retina Display. Сегодня ее можно увидеть также в планшетах и ноутбуках компании.


Дайджест по саморазвитию в программировании №18

Circular Views


You can do the same sort of thing with NSView instances:
    NSWindow *win = [self window];
    NSView *a = [[NSView alloc] initWithFrame: NSMakeRect(0, 0, 1, 1)];
    [a addSubview: a];
    [[win contentView] addSubview: a];
To make this break, all you have to do is attempt to show the window. You don't even have to try to print a description or compare it for equality like that. When trying to show the window, the app will just crash trying to chase down to the bottom of the view hierarchy:
    (lldb) bt
    * thread #1: tid = 0x458bf, 0x00007fff8c972528 AppKit`NSViewGetVisibleRect + 130, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=2, address=0x7fff5f3ffff8)
                    frame #0: 0x00007fff8c972528 AppKit`NSViewGetVisibleRect + 130
                    frame #1: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #2: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #3: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #4: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #5: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #6: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #7: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #8: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #9: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #10: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #11: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #12: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #13: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #14: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #15: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #16: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #17: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #18: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #19: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288
                    frame #20: 0x00007fff8c9725c6 AppKit`NSViewGetVisibleRect + 288


источник

Какая разница между frame и bounds

bounds - это прямоугольник, заданный координатами (x,y) и размером (width,height) относительно собственной координатной системы (0,0).

frame - это прямоугольник, заданный координатами (x,y) и размером (width,height) относительно своего контейнера (superview).


--
iphone - Cocoa: What's the difference between the frame and the bounds? - Stack Overflow

Настройка типа документа в document-based Cocoa приложении

Для начала нужно выбрать нужный target в проекте, далее перейти на вкладку Info.


Если смотреть UTI файла с помощью утилиты mdls, то соответствие будет таким:
$ mdls exampleFile.exampleExtension
kMDItemContentType = "Identifier" kMDItemKind = "Name"

Примеры:
kMDItemContentType             = "public.plain-text"
kMDItemKind                    = "Документ простого текста"

kMDItemContentType             = "com.apple.xcode.model.data-version"
kMDItemKind                    = "Versioned Core Data Model"

По умолчанию в методы:
  • - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
  • - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError
в параметре typeName передается значение Name. Но если указан Identifier, то будет передаваться значение поля Identifier.

В поле Class указывается подкласс NSDocument.

В поле Extensions указывается расширение документа с которым работает приложение.


--