objective-c - NSScrollView 内的 NSImageView 平铺在缩小时绘制不需要的边框

标签 objective-c macos cocoa appkit nsscrollview

我有一个 NSScrollView,它的 documentView 是一个巨大的 NSView,由许多子 NSImageView 组成,它们充本地图中的图 block 。 (整个 map 是 NSView,由于它比屏幕尺寸大得多,因此它嵌入在 ScrollView 中)。

我能够显示具有正确图 block 位置的 map ,并使用条形图/手势滚动。但是..当我启用放大功能以便能够缩放时,会发生以下情况:enter image description here 不知何故,我假设自动布局添加了下面的图 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/

相关文章:

ios - 检查日期是否存在于 objective-c 中的这一年

objective-c - NSInspiration setArgument 问题

windows - 尝试注册安装时出现 Genymotion 网络错误

objective-c - NSCollectionView的setContent : memory management

ios - 使用最新 SDK 的 iOS 中的 Facebook 登录问题

iphone - 如何获取iphone通讯录中所有联系人的家庭住址

objective-c - 监听驱动器安装事件/通知

objective-c - 当 NSString 更改时,即使更改后, `do something` 也仅被调用一次

cocoa - NSButton setAlignment 不起作用

objective-c - 从 Core Data 中删除选定的 NSTableView 行?