0

既存の iPad アプリ (XCode 4.6、ARC、ストーリーボード、および iOS 6.2) があります。このアプリはポートレート モードでは完璧に動作しますが、自動レイアウトを使用したランドスケープ モードではうまく機能しません (下の画像を参照)。

これはポートレート モードを示しています。 名前が黄色のビューの上にあることに注意してください

上の画像は正しいポートレート モードを示しています。

ここに画像の説明を入力

これはランドスケープ モードです...名前と背景色がないことに注意してください。

上のグリッドを作成するコードは次のとおりです。

-(void) drawTopGrid  {

//  set up notification for redrawing topGrid
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(notificationToRedrawTopGrid:)
                                             name:@"redrawTopGrid" object:nil ];

//  setup for drawing grid
CGContextRef context = UIGraphicsGetCurrentContext();

#define START_VERTICAL_LINE  1  //  was 110
#define VERTICAL_LINE_INCREMENT 110  //  was 110
#define VERTICAL_LINE_LENGTH 52  // (compute based on number of hours)  

//  draw first vertical line
CGContextMoveToPoint(context, START_VERTICAL_LINE, 0); //start
CGContextAddLineToPoint(context, START_VERTICAL_LINE, VERTICAL_LINE_LENGTH); //draw to this point
CGContextStrokePath(context);  // draw it...

//  draw remainder of vertical lines (based on count of staff positions defined)  <--------------- TODO
for(int i = 2; i < 24; i += 2)  {  // will hold 6 staff positiions
    CGContextMoveToPoint(context, (i * VERTICAL_LINE_INCREMENT) - i, 0); //start
    CGContextAddLineToPoint(context, (i * VERTICAL_LINE_INCREMENT- i), VERTICAL_LINE_LENGTH); //draw to this point
    CGContextStrokePath(context);  // draw it...
}

//  get the staff names
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pathForStaffNames = [documentsDirectory stringByAppendingPathComponent:@"staffNames.plist"];
NSDictionary *staffDict = [NSDictionary dictionaryWithContentsOfFile:pathForStaffNames];
staffPos1 = [staffDict objectForKey:Slot1];
staffPos2 = [staffDict objectForKey:Slot2];
staffPos3 = [staffDict objectForKey:Slot3];
staffPos4 = [staffDict objectForKey:Slot4];
staffPos5 = [staffDict objectForKey:Slot5];
staffPos6 = [staffDict objectForKey:Slot6];

const float hourFontSize = 18;
UIFont *hourfont=[UIFont systemFontOfSize:hourFontSize];

//  draw staff names
[[UIColor redColor] set];
[staffPos1 drawAtPoint:CGPointMake(85, 12) withFont:hourfont];  //  increment is 220

[[UIColor blueColor] set];
[staffPos2 drawAtPoint:CGPointMake(303, 12) withFont:hourfont];

[[UIColor magentaColor] set];
[staffPos3 drawAtPoint:CGPointMake(523, 12) withFont:hourfont];

[[UIColor redColor] set];
[staffPos4 drawAtPoint:CGPointMake(743, 12) withFont:hourfont];

[[UIColor blueColor] set];
[staffPos5 drawAtPoint:CGPointMake(963, 12) withFont:hourfont];

[[UIColor magentaColor] set];
[staffPos6 drawAtPoint:CGPointMake(1183, 12) withFont:hourfont];

}

私の質問は、CG 描画方法を使用する場合、何か違うことをする必要がありますか? 左グリッド、上グリッド、中央グリッドはすべて同じ方法で描画されます。背景色は、描画の下の UIView にあります。上部グリッドの唯一の制約は、幅と高さです。

4

1 に答える 1

1

これが私が探していた答えです:

Core Graphics の描画は、ビュー システム (自動レイアウトを含む) について何も知りません。描画しているコンテンツが表示されない場合は、ビュー ジオメトリが原因で、描画が期待するジオメトリを生成しないコンテキストが渡されている可能性があります (通常の解決策は、描画コードがビューのそれに基づいてコンテンツの境界と位置を調整します)。

于 2013-09-12T03:18:11.553 に答える