2010-08-24 2 views
0

У меня есть NSView, который отображает изображение, и я хотел бы, чтобы этот вид действовал как эффект обрезанного изображения. Тогда я сделать 3 прямоугольников (imageRect, secRect и IntersectRect), то imageRect является прямоугольник, который показывает изображение, secRect это прямоугольник, который просто действовать, чтобы затемнить весь imageRect и intersectRect является прямоугольником, который, как наблюдать прямоугольник, то, что я хочу сделать, как сделать «дыру» на secRect, чтобы увидеть прямо в imageRect (без темного). вот мой метод DrawRect:Использование операции NSImage для создания эффекта обрезки

- (void)drawRect:(NSRect)rect { 
    // Drawing code here. 
NSImage *image = [NSImage imageNamed:@"Lonely_Tree_by_sican.jpg"]; 
NSRect imageRect = [self bounds]; 

[image compositeToPoint:NSZeroPoint operation:NSCompositeSourceOver ]; 

if (NSIntersectsRect([myDrawRect currentRect], [self bounds])) { 
    //get the intersectionRect 
    intersectionRect = NSIntersectionRect([myDrawRect currentRect], imageRect); 

    //draw the imageRect 
    [image compositeToPoint:imageRect.origin operation:NSCompositeSourceOver]; 

    //draw the secRect and fill it with black and alpha 0.5 
    NSRect secRect = NSMakeRect(imageRect.origin.x, imageRect.origin.y, imageRect.size.width, imageRect.size.height); 
    [[NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:0.5] set]; 
    [NSBezierPath fillRect:secRect]; 

    //have no idea for the intersectRect 
    /*[image compositeToPoint:intersectionRect.origin 
     fromRect:secLayer 
     operation:NSCompositeXOR 
     fraction:1.0];*/ 

} 

//draw the rectangle 
[myDrawRect beginDrawing]; 

} 

У меня есть свой класс (myDrawRect), чтобы нарисовать прямоугольник, основанный на мыши на [self bounds], так что просто игнорировать команду beginDrawing.

Любая помощь будет в порядке, спасибо. Хебб.

ответ

4

Вы делаете гораздо больше работы, чем вам нужно, и вы используете устаревшие методы (методы compositeToPoint:operation: и compositeToPoint:fromRect:operation:fraction:) для этого.

Все, что вам нужно сделать, это сделать отправь картинку drawInRect:fromRect:operation:fraction: message. Параметр fromRect: - это прямоугольник, который вы хотите обрезать; если вы не хотите масштабировать обрезанную секцию, то целевой адрес (параметр drawInRect:) должен иметь тот же размер.

О единственной дополнительной работе, которую может потребоваться сделать, - если изображение может быть больше, чем вид, и вы хотите только нарисовать раздел, который находится в пределах видимости: когда это произойдет, вам понадобится inset урожай прямоугольник на разницу в размере между прямоугольником обрезки и границами обзора.

Смежные вопросы