NSScrollView не похож на другие представления. Он делает вещи настолько по-разному, что поначалу всех сводит с ума, особенно после того, как вы привыкли к мышлению Auto Layout. Это также одно из тех представлений (наряду с NSTableView, NSOutlineView, NSCollectionView и другими), где нужно настроить множество частей, прежде чем вы сможете увидеть, как все работает. Auto Layout также немного добавляет к этому.
NSScrollView по умолчанию содержит как минимум 3 подпредставления:
- Один объект NSClipView. (Apple называет это Content View. Это то, что видно.)
- Два объекта NSScroller.
Объект NSClipView или Content View содержит некоторый вид NSView.
(Apple называет это представлением документа)
Если вы добавите простой NSScrollView в свой xib из библиотеки объектов, он будет иметь размер в Interface Builder, но во время выполнения он будет иметь нулевой размер. Это будет бить вас по заднице каждый раз. Вы можете увидеть это, добавив запись в журнал.
NSLog(@" size of document view:%@", NSStringFromRect(_myScrollView.documentView.frame);
Даже если вы добавите подпредставление и будете звонить setNeedsDisplay:YES
весь день, вы ни хрена не увидите.
Однако есть вещи, которые вы можете сделать. Во-первых, вы можете установить размер documentView с помощью setFrameSize:NSMakeSize(somePointsWide, somePointsHigh)
Вы также можете сделать его настраиваемым подклассом NSView, который имеет реализацию intrinsicContentSize
, которая вычисляет это на основе любых логических правил, которые вы хотите поместить туда (включая некоторый минимум по умолчанию).
Вы также можете просто сказать, что все подпредставления должны быть на расстоянии не менее N точек от documentView или более на каждом краю с помощью автоматического макета. VFL (язык визуального формата) будет выглядеть так: @"H:|-nPoints-[aSubviewOfDocumentView]-nPoints-|"
и этот @"V:|-nPoints-[aSubviewOfDocumentView]-nPoints-|"
(убедитесь, что ваши подпредставления имеют внутренний размер или какое-то собственное подпредставление, которое дает им минимальный размер... и реализует - (BOOL)translatesAutoresizingMaskIntoConstraints { return NO; }
и отключает автоматическое изменение размеров подпредставлений для ваш documentView с помощью флажка в IB или вызовом setAutoResizesSubviews:NO
или вы будете ненавидеть жизнь.)
Теперь это приводит к странной вещи. С Auto Layout, как правило, хорошо перестать думать о фреймах и прямоугольниках, насколько это возможно, но с NSScrollView documentView вы можете рассмотреть возможность не использовать Auto Layout для позиционирования подпредставлений. В некоторых случаях может быть проще не делать этого и просто позволить documentView расти, чтобы приспособиться. Если вы используете описанный выше подход «nPoints», и ваши подпредставления можно перетаскивать, вы хотите просто захватить NSPoint для начала кадра подпредставления (используйте его для определения вашей дельты), а затем точку mouseDown и, когда перетаскивание завершено, захватить мышь точка и рассчитайте дельту для новой точки начала кадра. Затем вызовите setFrameOrigin: с новой точкой.
person
uchuugaka
schedule
30.01.2014