Проблема с setPatternPhase: в NSSplitView для NSColor с использованием colorWithPatternImage:
Я искал вокруг и не нашел ничего относительно этой конкретной проблемы. У меня есть окно с вертикальным NSSplitView. В правом представлении splitview у меня есть объект NSBox, установленный для заполнения содержимого представления. Я загружаю в пользовательские кончики, используя setContentView: чтобы поменять местами представления в NSBox на правой стороне splitview. В моих пользовательских представлениях я пытаюсь заполнить представления объектом NSColor, который использует NSImage для создания фона. Все это работает как положено. Я использую код, основанный на этой статье: http://www.mere-mortal-software.com/blog/details.php?d=2007-01-08 чтобы установить фазу шаблона в верхнем левом углу.:
[[NSGraphicsContext currentContext] saveGraphicsState];
[[NSGraphicsContext currentContext] setPatternPhase: NSMakePoint( [self bounds].origin.x,
[self bounds].size.height )];
[[self leatherColor] set];
NSRectFill( [self bounds] );
[[NSGraphicsContext currentContext] restoreGraphicsState];
с намерением, чтобы образец, казалось, оставался постоянным в верхнем левом углу NSBox, когда размеры представления изменяются, как было бы ожидаемое поведение (через перемещение splitview или изменение размера самого окна). Я реализовал это в урезанном тестовом приложении только с окном и пользовательским представлением, и оно ведет себя как ожидалось.
Однако в моем проекте с splitview он ведет себя так, как будто patternPhase устанавливается в верхнем левом углу всего окна, а не в верхнем левом углу правой половины splitview (т.е. он должен смещаться при изменении размера splitview) Он ведет себя так, как будто "раскрывает большее изображение вместо того, чтобы смещаться вместе с ним. Я почти уверен, что это проблема с несколькими пространствами координат, я неправильно понимаю, как работают координаты NSSplitView, или что-то связанное с иерархией представления. документация по NSGraphicsContext, в setPatternPhase: метод, в котором говорится: "Например, установка фазы шаблона в (2,3) приводит к перемещению начала мозаичного элемента ячейки шаблона в точку (2,3) в пользовательском пространстве по умолчанию."Будет ли пространство пользователя по умолчанию соответствовать границам моего пользовательского представления, или это может быть потому, что я создаю точку на основе набора координат вида справа, и setPatternPhase реализует ее для всей ширины spitview (включая левая половина)?
Будем весьма благодарны за любые предложения / советы / помощь, которые вы можете предоставить.
Изменить: Я загрузил копию проекта, чтобы вы могли увидеть поведение: http://dl.dropbox.com/u/6679821/ViewSwitcher.zip
1 ответ
Вам нужно настроить фазу в зависимости от того, где вид находится в окне. Я использую эту категорию на NSView
:
@implementation NSView (RKAdditions)
- (void)rk_drawPatternImage:(NSColor*)patternColor inRect:(NSRect)rect
{
[self rk_drawPatternImage:patternColor inBezierPath:[NSBezierPath bezierPathWithRect:rect]];
}
- (void)rk_drawPatternImage:(NSColor*)patternColor inBezierPath:(NSBezierPath*)path
{
[NSGraphicsContext saveGraphicsState];
CGFloat yOffset = NSMaxY([self convertRect:self.bounds toView:nil]);
CGFloat xOffset = NSMinX([self convertRect:self.bounds toView:nil]);
[[NSGraphicsContext currentContext] setPatternPhase:NSMakePoint(xOffset, yOffset)];
[patternColor set];
[path fill];
[NSGraphicsContext restoreGraphicsState];
}
@end
В вашем случае вы бы изменили -drawRect:
выглядеть так:
-(void) drawRect: (NSRect)dirtyRect
{
[self rk_drawPatternImage:[self leatherColor] inRect:self.bounds];
}