我有一个 NSScrollView,它的 documentView 是一个巨大的 NSView,由许多子 NSImageView 组成,它们充本地图中的图 block 。 (整个 map 是 NSView,由于它比屏幕尺寸大得多,因此它嵌入在 ScrollView 中)。
我能够显示具有正确图 block 位置的 map ,并使用条形图/手势滚动。但是..当我启用放大功能以便能够缩放时,会发生以下情况: 不知何故,我假设自动布局添加了下面的图 block 边框,但我不知道如何禁用它们。这些肯定是边界,因为我已经检查了数千次我的图 block 和 subview 的大小相同......那么这是从哪里来的呢? 我对 iOS 开发有相当多的经验,但对 NSScrollView 完全迷失了(我的委托(delegate)方法在哪里?)。如何禁用 ScrollView 的这种行为?
这是我的 subview 代码:
- (void)setupSubViews
{
NSLog(@"--------Creating subviews!-------");
//first we create the subviews..
//This is the key part, we traverse from top Left, and since OS X coordinates start at bottom left, we need to invert the rows!
for (int i=0; i< NUMBER_OF_COLUMNS; i++) {
for (int j=NUMBER_OF_ROWS-1; j>=0; j--) {
CGRect frame = CGRectMake(i*256, j*256, 256, 256);
NSImageView *newView = [[NSImageView alloc] initWithFrame:frame];
newView.focusRingType = NSFocusRingTypeNone; //I gave this focusRing a try, it didn't work :(
[self addSubview:newView];
}
}
}
这是我将 subview 连接到实际图像的地方..
-(void)updateMap:(id)tilesPassed{
if (downloadFinished) {
NSLog(@"--------DRAW RECT-------------");
NSImageView *subView;
NSInteger idx = 0;
for (int i =0; i<[self.subviews count]; i++) {
subView = [self.subviews objectAtIndex:i];
[subView setAllowsCutCopyPaste:NO];
[subView setImageFrameStyle:NSImageFrameNone]; //This doesnt work either :(
MapTile *tile = [tilesArray objectAtIndex:idx];
subView.image = tile.image;
idx++;
}
}
}
最佳答案
您可能不想为此使用 subview 。有一个 CALayer
子类正是用于此目的:CATiledLayer
:https://developer.apple.com/library/mac/documentation/GraphicsImaging/Reference/CATiledLayer_class/Introduction/Introduction.html
有了它,您甚至可以根据放大程度加载不同的图像图 block ,就像 Google map 一样。它将无边框渲染,并且性能将比使用大量 subview 好得多。 subview 很昂贵,图层(通常)很便宜。
更新:此示例将帮助您启动并运行:http://bill.dudney.net/roller/objc/entry/catiledlayer_example
关于objective-c - NSScrollView 内的 NSImageView 平铺在缩小时绘制不需要的边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20755995/