Установка содержимого NSScrollView в верхнем левом углу вместо нижнего левого при замене документа
Сегодня ко мне пришел один из моих коллег с проблемой, как он может загрузить или поменять местами documentView из NSScrollView так, чтобы загруженный вид был зафиксирован в верхнем левом углу вместо Нижнего.
Вот вопрос по частям:
В Построителе интерфейса перетащите NSScrollView в проект.
Также в Interface Builder перетащите два пользовательских вида в проект и добавьте несколько текстовых полей, кнопок и т. д.
Создайте класс контроллера (например, myController) со следующими IBOutlets:
IBOutlet NSScrollView * myScrollViewIBOutlet NSView * myCustomView1IBOutlet NSView * myCustomView2
Подключите розетки к элементам управления в Interface Builder.
Создайте подкласс NSView, чтобы перевернуть documentView:
@implementation myFlippedView
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect {
// Drawing code here.
}
-(BOOL)isFlipped {
return YES;
}
Выберите documentViewиз NSScrollView в Interface Builder и сделайте его подклассом myFlippedView. В Interface Builder вы можете выбрать NSScrollView, а затем щелкнуть в нем снова, чтобы перейти к documentView, или изменить библиотеку IB, чтобы показать древовидное представление и выбрать дочернее пользовательское представление NSScrollView.
В классе myController замените представления следующими методами:
-(void)awakeFromNib {
[myScrollView setDocumentView:myCustomView1];
}
-(IBAction)swapViews:(id)sender {
if ([myScrollView documentView] == myCustomView1) {
[myScrollView setDocumentView:myCustomView2];
} else {
[myScrollView setDocumentView:myCustomView1];
}
}
Наконец, подключите кнопку в вашем проекте к действию swapViews, постройте и запустите.
Проблема заключается в том, что координаты не были решены, как ожидалось с isFlipped.
2 ответа:
Существует простая, но, по-видимому, часто упускаемая из виду причина этого.
Хотя
isFlippedявляется подклассом пользовательского представления в Interface Builder, documentView заменяется на вид swap, первый из которых используется наawakeFromNib.Решение заключается в подклассе myCustomClass1 и myCustomClass2 к классу myFlippedView.
Сделайте это и протестируйте его, и вы заметите, что представления теперь появляются в левом верхнем углу прокрутки. Он, однако, создал новый проблема. Все содержимое в пользовательском представлении теперь раскладывается снизу вверх (поскольку по умолчанию все макеты
К счастью, есть еще одно простое решение этой проблемы. Читайте дальше : -)NSViewрасположены слева снизу, поэтому при переворачивании также переворачиваются их координаты).В Построителе интерфейсов выделите все элементы управления в
myCustomView1и в менюLayoutВыберите встраивать объекты в --> пользовательский вид. Измените размер, как вам нужно, сделайте то же самое для myCustomView2 и перестроить.Вуаля. An
NSScrollViewс вид содержимого меняется местами и появляется в верхнем левом углу экрана прокрутки вместо нижнего левого.
Чтобы правильно сделать
documentViewПервоначально выровнять по верхней части scrollview и также закрепить его к вершине, когдаdocumentViewменьше, чем это clipview, это то, что работает для меня:1-In Interface Builder заключите все элементы управления в вашем documentView в пользовательский
NSViewПример. (Не перевернутый вид)2-Создайте подкласс
NSView, который будет использоваться дляdocumentView, и переопределите эти методы:- (BOOL)isFlipped { return YES; } - (void)resizeWithOldSuperviewSize:(NSSize)oldSize { CGFloat superViewHeight = self.superview.frame.size.height, height = self.frame.size.height; if(superViewHeight>height) { [self setFrameOrigin:NSMakePoint(self.frame.origin.x, superViewHeight-height)]; } }Мнение подклассы должно быть scrollViews'
documentViewкоторый содержит второй (нормальный) NSView, содержащий все элементы управления.