Установка содержимого NSScrollView в верхний левый угол вместо нижнего левого при замене документа - PullRequest
10 голосов
/ 15 января 2011

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

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

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

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

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

  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1
  • IBOutlet NSView * myCustomView2

Подключите розетки к элементам управления в Интерфейсном Разработчике.

Создать подкласс 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 в Интерфейсном Разработчике и сделайте его подклассом myFlippedView. В Интерфейсном Разработчике вы должны выбрать 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 ]

10 голосов
/ 15 января 2011

Для этого есть простая, но, по-видимому, часто пропускаемая причина.

Хотя isFlipped является подклассом пользовательского представления в Интерфейсном Разработчике, documentView заменяется на своп представления, первый из которых используется в awakeFromNib.

Решение заключается в создании подкласса myCustomClass1 и myCustomClass2 для класса myFlippedView.

Сделайте это и протестируйте, и вы увидите, что представления теперь отображаются в левом верхнем углу представления прокрутки. Это, однако, создало новую проблему. Все содержимое в пользовательском представлении теперь расположено снизу вверх (потому что по умолчанию все NSView макеты расположены снизу слева, поэтому при переворачивании их координаты также меняются).

К счастью, есть еще одно простое решение этой проблемы. Читайте дальше: -)

В Интерфейсном Разработчике выделите все элементы управления в myCustomView1 и в меню Layout выберите Вставить объекты в -> Пользовательский вид. Измените размер, как вам нужно, сделайте то же самое для myCustomView2 и перестройте.

Вуаля. NSScrollView с представлением содержимого, которое переключается и отображается в верхнем левом углу представления прокрутки вместо нижнего левого.

3 голосов
/ 06 июня 2017

Чтобы правильно выровнять documentView, сначала выровняйте по вершине прокрутки, а также прикрепите к вершине, когда documentView меньше, чем его клип, это то, что мне подходит:

1 - В Интерфейсном Разработчике заключите все элементы управления в вашем 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, который содержит все элементы управления.

...