Используя построитель интерфейсов, вы можете выбрать углы, которые должен придерживаться объект при изменении размера. Как вы можете сделать это программно?Cocoa NSView, изменяющий свойства автоопределения
ответ
Смотрите setAutoresizingMask: метод NSView и связанного с ним resizing masks.
Вот рабочая ссылка на [маски для изменения размера] (https://developer.apple.com/documentation/appkit/nsview.autoresizingmask) –
Каждый вид имеет маску флагов, контролируемую настройкой свойства autoresizingMask с OR поведений, которые вы хотите от resizing masks. Кроме того, надстройка должна быть настроена на resize its subviews.
Наконец, в дополнение к основным опций изменения размера маски определены, вы можете полностью контролировать расположение подобозрения путем внедрения -resizeSubviewsWithOldSize:
Я считаю, что autoresizingBit
маски ужасно имени, поэтому я использую категорию на NSView для сделать вещи немного более четко:
// MyNSViewCategory.h:
@interface NSView (myCustomMethods)
- (void)fixLeftEdge:(BOOL)fixed;
- (void)fixRightEdge:(BOOL)fixed;
- (void)fixTopEdge:(BOOL)fixed;
- (void)fixBottomEdge:(BOOL)fixed;
- (void)fixWidth:(BOOL)fixed;
- (void)fixHeight:(BOOL)fixed;
@end
// MyNSViewCategory.m:
@implementation NSView (myCustomMethods)
- (void)setAutoresizingBit:(unsigned int)bitMask toValue:(BOOL)set
{
if (set)
{ [self setAutoresizingMask:([self autoresizingMask] | bitMask)]; }
else
{ [self setAutoresizingMask:([self autoresizingMask] & ~bitMask)]; }
}
- (void)fixLeftEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinXMargin toValue:!fixed]; }
- (void)fixRightEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxXMargin toValue:!fixed]; }
- (void)fixTopEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; }
- (void)fixBottomEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; }
- (void)fixWidth:(BOOL)fixed
{ [self setAutoresizingBit:NSViewWidthSizable toValue:!fixed]; }
- (void)fixHeight:(BOOL)fixed
{ [self setAutoresizingBit:NSViewHeightSizable toValue:!fixed]; }
@end
Что с затем можно использовать следующий образ:
[someView fixLeftEdge:YES];
[someView fixTopEdge:YES];
[someView fixWidth:NO];
Собственно, да. Я работаю над настраиваемым пользовательским интерфейсом для интерфейса с сенсорным экраном, а Interface Builder просто не подходит для этой работы. Я делал все в коде, и я не оглядывался назад. –
Спасибо, этот код полезен. – Karolis
@ Каролис: Рад это услышать. Спасибо, что нашли время оставить заметку. –
@ e.James ответа дал мне идею просто создать новое перечисление с более привычным именованием:
typedef NS_OPTIONS(NSUInteger, NSViewAutoresizing) {
NSViewAutoresizingNone = NSViewNotSizable,
NSViewAutoresizingFlexibleLeftMargin = NSViewMinXMargin,
NSViewAutoresizingFlexibleWidth = NSViewWidthSizable,
NSViewAutoresizingFlexibleRightMargin = NSViewMaxXMargin,
NSViewAutoresizingFlexibleTopMargin = NSViewMaxYMargin,
NSViewAutoresizingFlexibleHeight = NSViewHeightSizable,
NSViewAutoresizingFlexibleBottomMargin = NSViewMinYMargin
};
Кроме того, из моего исследования, я обнаружил, что @ James.s имеет серьезную ошибку в дополнениях NSView. Система координат в какао имеет сдвинутую ось Y в терминах системы координат iOS. Следовательно, для того, чтобы зафиксировать дно и верхнее поле, вы должны написать:
- (void)fixTopEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMaxYMargin toValue:!fixed]; }
- (void)fixBottomEdge:(BOOL)fixed
{ [self setAutoresizingBit:NSViewMinYMargin toValue:!fixed]; }
От какао Документов
NSViewMinYMargin
The bottom margin between the receiver and its superview is flexible. Available in OS X v10.0 and later.
+1 для гибридного подхода! У меня никогда не было проблем с этим кодом, но, возможно, это разница между OSX и iOS? Теперь у меня мне любопытно ... –
- 1. Cocoa nsview cursor cursor
- 2. Замена NSView при сохранении ограничений автоопределения
- 3. Cocoa NsView не отображает изображений
- 4. Cocoa NSView: Создание кругов, но они обрезаются
- 5. Прозрачный PNG в NSView, Cocoa App
- 6. Почему аниматор NSView не работает в Cocoa
- 7. NSView Cocoa, получающий безумные события mouseDown?
- 8. drawrect Vs layoutsubviews - NSView - Touch Cocoa
- 9. Полимер, не изменяющий значение определенного свойства
- 10. Создание распечатки автоопределения
- 11. Отсутствует настройка свойства Autosizing для NSView
- 12. setBackgroudColor NSView
- 13. OS X/Cocoa: Опираясь на NSView внутри прозрачного окна
- 14. Реализация пользовательского NSView в Cocoa на OS X
- 15. Как повернуть текст в NSView? (Mac OS, Cocoa, Swift)
- 16. NSView и NSBezierPath - График не будет отображаться - Cocoa/Objective-C
- 17. Как создать контроллер первого ответа для NSView в Cocoa
- 18. NSView keyDown не вызывается во время перетаскивания в приложении Cocoa
- 19. Как добавить NSView в NSWindow в приложении Cocoa?
- 20. Является ли метод addSubview NSView изначально медленным? (Cocoa OSX)
- 21. Ошибка автоопределения - Невозможно одновременно удовлетворить ограничения
- 22. Отладка программных ограничений автоопределения
- 23. NSView enterFullScreenWithOptions: масштабирование NSView
- 24. Xcode6 - вид автоопределения в другом режиме автоопределения
- 25. Draggable NSView
- 26. Настройка заголовка для NSView
- 27. Ошибка проекта Cocoa
- 28. NSView and Swift 3.0
- 29. Cocoa Touch UIViewController Свойства и класс дизайна
- 30. Cocoa-Touch, NSManagedObject: Исключение при настройке свойства
Обратите внимание, что компания Apple представила [ AutoLayout framework] (http://developer.apple.com/library/mac/#releasenotes/UserExperience/RNAutomaticLayout/_index.html#//apple_ref/doc/uid/TP40010631) для Lion. – JJD