2011年3月17日木曜日

iOSでの印刷

大雑把に次の2つの手順となる。
1.UIPrintInteractionControllerを起動する。
2.UIPrintPageRenderer のサブクラスで印刷処理をする。

【1.について】
イベント発生時(通常はメニュー選択)に呼び出される関数を作成する。
- (IBAction)printPage:(id)sender
{
 UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
  void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
 ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
  if(!completed && error){
   NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
  }
 };

 // UIPrintInfo の作成
 UIPrintInfo *printInfo = [UIPrintInfo printInfo];
 printInfo.outputType = UIPrintInfoOutputGeneral;
 printInfo.jobName = [NSString stringWithFormat: @"job title"];
 printInfo.duplex = UIPrintInfoDuplexLongEdge;// 両面印刷
 printInfo.orientation = m2pView.frame.size.width < m2pView.frame.size.height ?
  UIPrintInfoOrientationPortrait : UIPrintInfoOrientationLandscape;// 用紙方向を画面の方向と同じする
 controller.printInfo = printInfo;
 controller.showsPageRange = YES;// 複数ページ

 // UIPrintPageRendererのサブクラスを作成
 MyPrintPageRenderer *myRenderer = [[MyPrintPageRenderer alloc] init];
 myRenderer.jobTitle = printInfo.jobName;
 myRenderer.m2pView = m2pView;//描画用のコントロールを渡しておく
 controller.delegate = myRenderer;//印刷時のdelegate関数はMyPrintPageRendererに記述
 // ビューフォーマッターとやらの定義も必要らしい
 UIViewPrintFormatter *viewFormatter;
 viewFormatter = [self.m2pView viewPrintFormatter];
 [myRenderer addPrintFormatter:viewFormatter startingAtPageAtIndex:0];
 controller.printPageRenderer = myRenderer;
 [myRenderer release];
 // 印刷ダイアログ表示(印刷ボタンを押せばMyPrintPageRendererのdelegate関数が呼ばれる)
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  [controller presentFromBarButtonItem:bbiPrint animated:YES completionHandler:completionHandler];  // iPad
 else
  [controller presentAnimated:YES completionHandler:completionHandler];  // iPhone
}
【2.について】
Appleが提供するサンプルコードのMyPrintPageRenderer.mがほぼ流用できる。
印刷領域は、ヘッダー・コンテンツ・フッターの上中下3分割となっている。
以下をページ単位に描画すればOK.
- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect;
- (void)drawContentForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)contentRect;
- (void)drawFooterForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)footerRect;

2011年3月6日日曜日

The end のリードギター

以下へ移動
http://www.facebook.com/pages/MID2PRN/128787497224101?sk=app_235501026504227

人月という単位はそれを理解出来ない人に対して使われる

一人で一ヶ月かかる作業は10人ですれば3日でできる。
ベテラン1人月と素人1人月は同じ作業量である。

論理的に反論出来ない人を押さえ付けるには便利な言葉である。

(追記)
プログラマーの場合、1人月の個人差が大きく、給与の比では収まらない。
数学の試験で直ぐに解答してしまう人もいれば、
一生かかっても解けない人がいるのと同じである。