2012-11-18 48 views
0

我已經認爲幾乎適合A4頁面。現在我想打印它。請注意,我沒有使用drawRect或類似的東西,只是具有子視圖和文本標籤的普通視圖。我的問題是,我對這個視圖有一些看法,我使用圖層來放置背景顏色和圓角矩形。子視圖不打印,但打印所有文本標籤。在可可中打印

_printReport只是一個帶有視圖和一堆文本標籤的普通窗口。

我在做什麼錯,我怎麼能做得更好?我真的不想做一個正確的,但我會如果我必須。

這裏是當有人打印出發生代碼:

- (void)printWorksheet { 
    TJContact *worksheet = [[self.workSheets selectedObjects] objectAtIndex:0]; 
    if (worksheet == nil) return; 

    _printReport = [[TJPrintReportWindowController alloc] initWithWindowNibName:@"TJPrintReportWindowController"]; 
    [self.printReport setCompany:self.company]; 
    [self.printReport setContact:worksheet]; 

    [self.printReport showWindow:self]; 
    [self.printReport becomeFirstResponder]; 
    [self.printReport.view becomeFirstResponder]; 
    NSPrintInfo* printInfo = [NSPrintInfo sharedPrintInfo]; 

    [printInfo setHorizontalPagination:NSFitPagination]; 
    [printInfo setVerticalPagination:NSFitPagination]; 
    [printInfo setHorizontallyCentered:YES]; 
    [printInfo setVerticallyCentered:YES]; 
    [printInfo setLeftMargin:20.0]; 
    [printInfo setRightMargin:20.0]; 
    [printInfo setTopMargin:10.0]; 
    [printInfo setBottomMargin:10.0]; 

    NSPrintOperation* printOperation = [NSPrintOperation printOperationWithView:self.printReport.view printInfo:printInfo]; 
    [printOperation setShowsPrintPanel:YES]; 
    [printOperation runOperationModalForWindow:[self window] delegate:nil didRunSelector:nil contextInfo:nil]; 
} 

不知道這是否會有所幫助,但主要的觀點確實有setWantsLayers爲YES,這裏是我的裝飾品之一:

CALayer *customerLayer = [self.customerView layer]; 
[customerLayer setCornerRadius:10]; 
[customerLayer setBackgroundColor:[NSColor colorWithDeviceWhite:0 alpha:0.30].CGColor]; 
[customerLayer setBorderColor:[NSColor blackColor].CGColor]; 
[customerLayer setBorderWidth:1.5]; 

當我在屏幕上顯示窗口時,它看起來就像我想要的那樣,但上面的圓形矩形不會被打印,但是它上面的所有標籤都可以。

回答

0

打印時不顯示圖層。我不得不做我自己的NSView對象,並做一個drawRect函數作爲背景視圖。然後它自動打印出來而不做任何事情。

1

有時,自定義繪圖可以更容易地再現由圖層提供的簡單效果。但有時這是一個真正的痛苦。要打印圖層支持的視圖,可以先將它們呈現爲圖像,然後打印一張NSImageView。

我給你一個通用的解決方案,將整個NSView及其所有子視圖和子層次結構轉換爲NSImageView。請注意,這是用C#使用MonoMac編寫的。你應該能夠很容易地將其轉換爲objC。嘗試在Layer.RenderInContext上搜索示例以獲取objC中的進一步參考。下面的方法適用於複雜視圖層次結構(例如:包含在其行視圖中具有圓角的半透明層支持的子視圖的表視圖):

//convert printView (your ready-to-print view which contains layer backed views) to a image view 
{ 
    //first we enclose the view in a new NSView - this fixes an issue which prevents the view to print upside down in some cases - for instance if printView is a NSScrollView, it will be drawn upside down 
    NSView container = new NSView (printView.Frame); 
    container.AddSubview (printView); 
    printView = container; 

    printView.WantsLayer = true; 
    RectangleF bounds = printView.Bounds; 
    int bitmapBytesPerRow = 4 * (int)bounds.Size.Width; 
     using (CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB()) 
    using (CGBitmapContext context = new CGBitmapContext (null, 
             (int)bounds.Width, 
             (int)bounds.Height, 
             8, 
             bitmapBytesPerRow, 
             colorSpace, 
             CGImageAlphaInfo.PremultipliedLast)) { 
     printView.Layer.RenderInContext (context); 
     NSImageView canvas = new NSImageView (bounds); 
     canvas.Image = new NSImage (context.ToImage(), bounds.Size); //instead of context.ToImage() in objC you have CGBitmapContextCreateImage 
     printView = canvas; 
    } 
}