Выбор NSCollectionViewItem в NSImageView, граница вокруг изображения с помощью CALayer

У меня есть NSCollectionViewItem с NSImageView.

Я хочу иметь тень вокруг изображения. После того, как он выбран, я хочу, чтобы изображение имело тень и границу. В настоящее время NSImageView получает рамку вокруг изображения.

Как я могу получить тень + границу при выборе? Кажется, что граница вокруг изображения устанавливается правильно, но граница устанавливается вокруг представления изображения.

[self.templateImageView setWantsLayer:YES];
self.templateImageView.layer.borderWidth = 0.0;
self.templateImageView.layer.borderColor = borderColor.CGColor;
self.templateImageView.layer.masksToBounds = YES;

[self.templateImageView.layer setShadowColor: [NSColor blackColor].CGColor];
[self.templateImageView.layer setShadowOpacity:0.8];
[self.templateImageView.layer setShadowRadius:5.0];

person spacecash21    schedule 10.01.2017    source источник


Ответы (2)


Во-первых, ваше изображение должно иметь прозрачный фон. Затем вы можете нарисовать границу вокруг содержимого изображений:

func drawOutlie(image:UIImage, color:UIColor) -> UIImage
{
    let newImageKoef:CGFloat = 1.08

    let outlinedImageRect = CGRect(x: 0.0, y: 0.0, width: image.size.width * newImageKoef, height: image.size.height * newImageKoef)

    let imageRect = CGRect(x: image.size.width * (newImageKoef - 1) * 0.5, y: image.size.height * (newImageKoef - 1) * 0.5, width: image.size.width, height: image.size.height)

    UIGraphicsBeginImageContextWithOptions(outlinedImageRect.size, false, newImageKoef)

    image.draw(in: outlinedImageRect)

    let context = UIGraphicsGetCurrentContext()
    context!.setBlendMode(CGBlendMode.sourceIn)

    context!.setFillColor(color.cgColor)
    context!.fill(outlinedImageRect)
    image.draw(in: imageRect)

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage!

}

Вы можете изменить размер контура, изменивnewImageKoef.

Ответ основан на ответе haawa и обновлен до быстрой версии 3.0.

person Martin Le    schedule 10.01.2017

Спасибо за ответ. Это помогло найти то, что я искал. Вот решение:

- (NSImage*)borderAroundImage:(NSImage*)image
{
NSSize size = NSMakeSize([image size].width, [image size].height);

NSImage* im = image;
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc]
                         initWithBitmapDataPlanes:NULL
                         pixelsWide:size.width
                         pixelsHigh:size.height
                         bitsPerSample:8
                         samplesPerPixel:4
                         hasAlpha:YES
                         isPlanar:NO
                         colorSpaceName:NSCalibratedRGBColorSpace
                         bytesPerRow:0
                         bitsPerPixel:0];

[im addRepresentation:rep];

[im lockFocus];

CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];

CGContextSetStrokeColorWithColor(ctx, [NSColor colorWithDeviceRed:0.200 green:0.529 blue:0.957 alpha:1.000].CGColor);
CGContextSetLineWidth(ctx, 25.0);
CGContextStrokeRect(ctx, CGRectInset(CGRectMake(0, 0, [image size].width, [image size].height), 0, 0));

[im unlockFocus];

return im;
}
person spacecash21    schedule 11.01.2017