NSView в NSScrollview. Проблемы с прокруткой просмотра документа

У меня есть подкласс NSView ImageTransform, в котором я выполняю масштабирование изображения с помощью фильтра Core Image CILanczosScaleTransform. Затем изображение выводится на поверхность. До этого момента все в порядке. Я хотел бы встроить подкласс NSView (ImageTransform) в NSScrollView, чтобы он выполнял прокрутку, когда объект представления становится больше, чем размер содержимого окна.

По этой причине я реализую представление прокрутки с помощью следующего кода:

@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 (которое является экземпляром класса ImageTransform и которое больше, чем contentView self.window) заполняет contentView. Изображение перемещается, когда я двигаю мышью, но по мере движения оно искажается и размывается. Настройка представления прокрутки прошла нормально, когда я создал объект NSImageView и передал его в scrollview в качестве параметра, но в моем случае я должен использовать imageTransform в качестве представления документа.

Я знаю, что это вопрос новичка, и прошу прощения (потому что я здесь новичок :). Предполагается, что настройка scrollview должна быть простой, но я все перепробовал, и пока мне не повезло.

Я также добавляю код класса 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

person Giedrius    schedule 31.03.2014    source источник


Ответы (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];
person Giedrius    schedule 13.04.2014