Неправильное позиционирование подпредставлений - PullRequest
0 голосов
/ 23 октября 2011

Я хочу расположить несколько пользовательских NSView один за другим.Но когда я запускаю приложение, представления отображаются с разными (удвоенными) исходными значениями кадра, чем значения, заданные в коде.

Вот упрощенный код с двумя представлениями:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application 

float height1 = 40.0;
float height2 = 65.0;

float width = [[window contentView] frame].size.width;

NSRect r1 = NSMakeRect(0, 0, width, height1);
NSRect r2 = NSMakeRect(0, height1, width, height2);

MyView *c1 = [[MyView alloc] initWithFrame:r1];
MyView *c2 = [[MyView alloc] initWithFrame:r2];

[[window contentView] addSubview:c1];
[[window contentView] addSubview:c2];
}

коддля MyView в основном состоит только из drawRect:

- (void)drawRect:(NSRect)dirtyRect {
// Drawing code here.

NSRect cellFrame = [self frame];

// frame Y coordinates at superview
float superY = [self convertPoint:[self frame].origin 
                      toView:[self superview]].y;

NSLog(@"superY:%f selfY:%f", superY, cellFrame.origin.y);


// top, bottom border and diagonal line of [self frame]
NSBezierPath* borderLine = [NSBezierPath bezierPath];

NSPoint pt1 = NSMakePoint(cellFrame.origin.x, 
                          cellFrame.origin.y);
NSPoint pt2 = NSMakePoint(cellFrame.origin.x + cellFrame.size.width,
                          cellFrame.origin.y);
NSPoint pt3 = NSMakePoint(cellFrame.origin.x,
                          cellFrame.origin.y + cellFrame.size.height);
NSPoint pt4 = NSMakePoint(cellFrame.origin.x + cellFrame.size.width,
                          cellFrame.origin.y + cellFrame.size.height);

[borderLine moveToPoint:pt1];
[borderLine lineToPoint:pt2];
[borderLine lineToPoint:pt3];
[borderLine lineToPoint:pt4];

[[NSColor redColor] setStroke];
[borderLine setLineWidth:01];
[borderLine stroke];
} 

и вот результат (как вы можете видеть - координата 'y' второго вида удваивается и по какой-то причине этот вид рисуется только частично):

результат с консоли

1 Ответ

1 голос
/ 23 октября 2011

Вы смешиваете концепцию рамки и прямоугольников границ.«Границы» относятся к размерам представления в его собственной системе координат, то есть начало координат будет нулевым, а размер будет шириной и высотой представления.

«Рамка» относится к измерениям представления в координате его родительского представления.system, то есть источник будет находиться там, где представление расположено в его суперпредставлении, а ширина и высота будут такими же, как у прямоугольника границ.

Так что для регистрации в вашем примере кода вы вызываете "convertPoint«Излишне и неправильно, потому что вы можете получить фактическое происхождение представления, просто вызвав« [self frame] .origin »

При выполнении рисования вам нужно вызвать« [self bounds] », чтобы получить прямоугольник, в которомрисовать.В вашем коде вы вызываете «[self frame]», который дает вам прямоугольник в системе координат вашего суперпредставления (frame), но это не сработает, потому что процедуры рисования отрисовываются в собственной (bounds) системе координат представления (то есть с началом координат)at {0, 0})

Исключением из этого является случай, когда представление заполняет все содержимое своего суперпредставления, и в этом случае вы можете вызвать либо [self bounds], либо [self frame], так как обавернуть тот же прямоугольник.

Я получил ваш код на работу, изменив

NSRect cellFrame = [self frame];

на

NSRect cellFrame = [self bounds];

Кроме того, проще всего зарегистрировать NSRect, например,

NSLog(@"%@", NSStringFromRect([self frame]));.

Надеюсь, это поможет.

...