2

OS X アプリに印刷を実装しようとしていますが、解決できない問題があります。

たとえば、Safari では、印刷をクリックすると、印刷パネルにコンテンツが縦向きモードでどのように印刷されるかが表示されます。方向ボタンをクリックすると、横向きモードで内容が表示されます。

ポートレートモード

横長モード

向きが変わるたびに内容が拡大縮小されることに注意してください。

アプリで同じことを試しても、内容は変わりません。その幅は、縦向きでも横向きでも同じです。

私が見落としているかもしれない NSPrintOperation または NSPrintInfo の設定はありますか?

更新- 今すぐコードで:

- (NSPrintOperation *)printOperationWithSettings:(NSDictionary *)printSettings error:(NSError **)outError {
    NSPrintInfo *pInfo = [NSPrintInfo sharedPrintInfo];
    [pInfo setLeftMargin:32];
    [pInfo setRightMargin:32];
    [pInfo setTopMargin:64];
    [pInfo setBottomMargin:64];
    [pInfo setHorizontalPagination:NSFitPagination];
    [pInfo setVerticallyCentered:NO];
    [[pInfo dictionary] setValue:[NSNumber numberWithBool:YES] forKey:NSPrintHeaderAndFooter];
    [[pInfo dictionary] addEntriesFromDictionary:printSettings];

    PrintTextView *printView = [[[PrintTextView alloc] initWithFrame:[pInfo imageablePageBounds]] autorelease];
    printView.printJobTitle = @"Printed";

    MSTablePrint *tPrint = [[[MSTablePrint alloc] init] autorelease];
    NSMutableArray *itemArray = [[[NSMutableArray alloc] init] autorelease];

    /*
        Objects are added to "itemArray"
     */

    NSAttributedString *atString = [tPrint attributedStringFromItems:itemArray];
    [[printView textStorage] setAttributedString:atString];

    NSPrintOperation *printOp = [NSPrintOperation printOperationWithView:printView printInfo:pInfo];

    return printOp;
}

- (IBAction)print:(id)sender {
    NSError *printError = nil;
    NSPrintOperation *printOperation = [self printOperationWithSettings:nil error:&printError];
    [[printOperation printPanel] setOptions:[[printOperation printPanel] options] | NSPrintPanelShowsPageSetupAccessory];

    [printOperation runOperation];
}

ご協力ありがとうございました。

4

1 に答える 1

3

NSPrintOperation 設定または NSPrintInfo 設定でレイアウトの変更を行うことはできません。継承されたビューを作成する必要があります。そのビューには、2 つのメソッド (adjustPageHeightNew、adjustPageWidthNew) があります。これらのメソッドは、ビューのレイアウトを変更する必要がある場合に通知されます。スーパーメソッドも必ず呼び出してください。

メソッドで、ビューとすべてのサブビューのレイアウトを変更します。

- (void)adjustPageHeightNew:(CGFloat *)newBottom top:(CGFloat)oldTop bottom:(CGFloat)oldBottom limit:(CGFloat)bottomLimit
{
    [super adjustPageHeightNew:newBottom top:oldTop bottom:oldBottom limit:bottomLimit];
    {
        NSPrintOperation *printOperation = [NSPrintOperation currentOperation];

        if(printOperation)
        {
            NSPrintInfo *printInfo = [printOperation printInfo];
            CGFloat pageMargineX = ([printInfo leftMargin] + [printInfo rightMargin]);
            CGFloat pageMargineY = ([printInfo topMargin] + [printInfo bottomMargin]);
            CGFloat pageWidth = ([printInfo paperSize].width - pageMargineX);
            CGFloat pageHeight = ([printInfo paperSize].height - pageMargineY);

            [self setFrame:NSMakeRect(0, 0, pageWidth, ([[self subviews] count] * pageHeight))];

            for(NSUInteger nView = 0; nView < [[self subviews] count]; nView ++)
            {
                NSTextView *PagedView = [[self subviews] objectAtIndex:nView];

                [PagedView setFrame:NSMakeRect(0, (nView * pageHeight), pageWidth, pageHeight)];
            }
        }
    }
}
于 2013-05-27T21:02:13.007 に答える