Установка содержимого NSScrollView в верхнем левом углу вместо нижнего левого при замене документа


Сегодня ко мне пришел один из моих коллег с проблемой, как он может загрузить или поменять местами documentView из NSScrollView так, чтобы загруженный вид был зафиксирован в верхнем левом углу вместо Нижнего.

Он потратил некоторое время на поиски в интернете и барахтался и не нашел решения, несмотря на то, что читал документацию в Apple, на StackOverflow и в разных других местах.

Вот вопрос по частям:

В Построителе интерфейса перетащите NSScrollView в проект. Также в Interface Builder перетащите два пользовательских вида в проект и добавьте несколько текстовых полей, кнопок и т. д.

Создайте класс контроллера (например, myController) со следующими IBOutlets:

  • 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 8

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, содержащий все элементы управления.