NSScrollview中的NSView。文档视图滚动的问题

问题描述 投票:1回答:1

我有一个NSView子类ImageTransform,我通过使用核心图像过滤器CILanczosScaleTransform执行图像缩放。然后图像被绘制到表面。我想把NSView子类(ImageTransform)嵌入到NSScrollView中,这样当视图对象大于Window的内容尺寸时,它就会执行滚动。

为此,我用下面的代码实现了滚动视图的功能,但是,我想把NSView子类(ImageTransform)嵌入到NSScrollView中,这样当视图对象大于Window的内容大小时,它就会执行滚动。

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

    ImageTransform *imageTransform = [[ImageTransform alloc]init];
    [imageTransform doZooming];
    [self.window setContentSize:NSMakeSize(800, 600)];


    //Get width and height of the image after zooming and set the ImageTransform     instance bounds to match output image dimensions.
    float height = imageTransform.imgOutHeight;
    float width = imageTransform.imgOutWidth;
    [imageTransform setFrame:NSMakeRect(0, 0, width, height)];

    //Set up a scroll view
    self.scrollView = [[NSScrollView alloc]initWithFrame:[[self.window contentView]frame]];
    [self.scrollView setHasVerticalScroller:YES];
    [self.scrollView setHasHorizontalScroller:YES];
    [self.scrollView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable];
    [self.scrollView setBorderType:NSNoBorder];
    [self.scrollView setDocumentView:imageTransform];
    [self.window setContentView:self.scrollView];
    NSLog(@"NSView width %f height %f", imageTransform.bounds.size.width, imageTransform.bounds.size.height);

}
@end

但是 问题是,ScrollViewer的document 视图(它是ImageTransform类的一个实例,并且比self.window的contentView大)。填充到内容视图中. 当我移动鼠标时,图像会四处移动,但当它移动时,图像会变得扭曲和模糊。当我创建一个NSImageView对象并将其作为参数传递给scrollview时,设置滚动视图很顺利,但在我的情况下,我必须使用imageTransform作为文档视图。

我知道这是一个新手问题,我很抱歉(因为我是新手:)。设置滚动视图应该是很容易的,但我已经尝试了所有的方法,但到目前为止还没有成功。

我也添加了ImageTransform类的代码(这是图像调整大小和绘制的地方)。

-(CIImage*)doZooming
{

    NSURL *imageURL = [[NSBundle mainBundle]URLForResource:@"the-shining-axe" withExtension:@"jpg"];
    CIImage *inputImage = [CIImage imageWithContentsOfURL:imageURL];
    self.transformFilter = [CIFilter filterWithName:@"CILanczosScaleTransform"];
    [self.transformFilter setValue:[NSNumber numberWithFloat:2.0] forKey:@"inputScale"];
    [self.transformFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputAspectRatio"];
    [self.transformFilter setValue:inputImage forKey:@"inputImage"];
    self.outputImage = [self.transformFilter valueForKey:@"outputImage"];
    self.outputImageExtent = self.outputImage.extent;
    self.imgOutHeight = self.outputImageExtent.size.height;
    self.imgOutWidth = self.outputImageExtent.size.width;
    return self.outputImage;
}


- (void)drawRect:(NSRect)dirtyRect
{
    //[super drawRect:dirtyRect];

    self.cIContext = [[NSGraphicsContext currentContext] CIContext];

    [self.cIContext drawImage:[self doZooming] inRect:dirtyRect fromRect:self.outputImage.extent];
}

@end
nsview nsscrollview
1个回答
1
投票

我设法解决这个问题,通过改变下面一行代码。

[self.cIContext drawImage:[self doZooming]
                   inRect:dirtyRect
                 fromRect:self.outputImage.extent];

改成这样

[self.cIContext drawImage:[self doZooming]
                   inRect:self.outputImage.extent
                 fromRect:self.outputImage.extent];
© www.soinside.com 2019 - 2024. All rights reserved.