Установка содержимого NSScrollView в верхнем левом углу вместо нижнего левого при замене документа
Сегодня ко мне пришел один из моих коллег с проблемой, как он может загрузить или поменять местами documentView
из NSScrollView
так, чтобы загруженный вид был зафиксирован в верхнем левом углу вместо Нижнего.
Вот вопрос по частям:
В Построителе интерфейса перетащите NSScrollView
в проект.
Также в Interface Builder перетащите два пользовательских вида в проект и добавьте несколько текстовых полей, кнопок и т. д.
Создайте класс контроллера (например, myController) со следующими IBOutlet
s:
IBOutlet NSScrollView * myScrollView
IBOutlet NSView * myCustomView1
IBOutlet 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, содержащий все элементы управления.