Проблема с setPatternPhase: в NSSplitView для NSColor с использованием colorWithPatternImage: - PullRequest
2 голосов
/ 22 октября 2011

Я искал вокруг и не нашел ничего относительно этой конкретной проблемы.У меня есть окно с вертикальным 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 устанавливается наверхний левый угол всего окна вместо верхнего левого угла правой половины разделенного вида (т.е. он должен смещаться с изменением размера разделенного вида). Он ведет себя так, как будто «показывает большее изображение, а не смещается вместе с ним.уверен, что это проблема с несколькими координатными пространствами, я неправильно понимаю, как работают координаты NSSplitView, или что-то связанное с иерархией представления. Из документации по NSGraphicsContext, в методе setPatternPhase: он говорит: «Например, установка шаблонаФаза в (2,3) приводит к перемещению начала мозаичного элемента ячейки в точку (2,3) в пользовательском пространстве по умолчанию. "Будет ли пользовательское пространство по умолчанию соответствовать границам моего пользовательского представления или это может бытьчто я создаю точку баsed с правой стороны отображает набор координат, и setPatternPhase реализует его для всей ширины spitview (включая левую половину)?

Будем весьма благодарны за любые предложения / советы / помощь, которые вы можете предоставить.

Редактировать: я загрузил копию проекта, чтобы вы могли увидеть поведение: http://dl.dropbox.com/u/6679821/ViewSwitcher.zip

1 Ответ

6 голосов
/ 24 октября 2011

Вам необходимо настроить фазу в зависимости от того, где вид находится в окне. Я использую эту категорию на 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...