先看三种效果图:
NSImageView 与 UIImageView 大同小异,代码如下:
NSImageView *imageView = [[NSImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
imageView.image = [NSImage imageNamed:@"blackRobot”];
imageView.wantsLayer = YES;
imageView.layer.backgroundColor = [NSColor darkGrayColor].CGColor;
[_m_windowMain.contentView addSubview:imageView];
如果不做其他处理的话,上面几行代码的效果就是图片1,背景色是灰色,图片不填充,图片本身大小比设置的图层要小一些。相反,如果设置的图层大小比图片本身小的话,那么图片显示的时候会变小,并且按照宽或者高的最大来显示,如下图:
NSImageView 有个属性 imageScaling ,它控制了图片的填充模式,加上下面这句:
imageView.imageScaling = NSImageScaleAxesIndependently;
效果如图2所示。
typedef NS_ENUM(NSUInteger, NSImageScaling) {
NSImageScaleProportionallyDown = 0, // 下填充优先
NSImageScaleAxesIndependently, // 平铺
NSImageScaleNone, // 无填充
NSImageScaleProportionallyUpOrDown, // 上下优先
//下面三个已然废弃
NSScaleProportionally NS_ENUM_DEPRECATED_MAC(10_0, 10_10, "Use NSImageScaleProportionallyDown instead") = 0,
NSScaleToFit NS_ENUM_DEPRECATED_MAC(10_0, 10_10, "Use NSImageScaleAxesIndependently instead"),
NSScaleNone NS_ENUM_DEPRECATED_MAC(10_0, 10_10, "Use NSImageScaleNone instead")
}
NSImageView 也可以设置边框样式,imageView.imageFrameStyle = NSImageFrameNone;
typedef NS_ENUM(NSUInteger, NSImageFrameStyle) {
NSImageFrameNone = 0, //无边框
NSImageFramePhoto, //照片边框,感觉就是加了一圈黑边
NSImageFrameGrayBezel,//灰色曲线框,圆角
NSImageFrameGroove, //凹陷效果,但不明显
NSImageFrameButton //按钮效果,等同于 突出效果
};
NSImageView 设置边框以及圆角与 UIImageView 几乎一样:
imageView.wantsLayer = YES;
imageView.layer.cornerRadius = 50;
imageView.layer.borderColor = [NSColor greenColor].CGColor;
imageView.layer.borderWidth = 4.0;
我把图层的大小设置为宽高均为100,再加上上面这几句,效果如图3。
有一个比较坑的,但也许是我自己没搞明白,就是设置阴影,经过反复验证,发现有个属性叫 shadow。
NSShadow *shadow = [[NSShadow alloc]init];
shadow.shadowOffset = NSMakeSize(-3, -3);
shadow.shadowColor = [NSColor blackColor];
shadow.shadowBlurRadius = 5.f;
imageView.shadow = shadow;
这样的话阴影可以显示了,或者不用给这个设置属性,可以继续给Layer层设置阴影,但必须给imageview 设置 shadow。
imageView.shadow = [[NSShadow alloc]init];
imageView.layer.shadowColor = [NSColor blackColor].CGColor;
imageView.layer.shadowRadius = 5.f;
imageView.layer.shadowOffset = NSMakeSize(3, 3);
imageView.layer.shadowOpacity = 0.75;
以上这个种写法也可以显示。但是有个问题,就是给layer设置了圆角无效了,这个暂时没有找到解决办法。
显示差不多了,那么看交互吧,UIImageview 可以添加手势,但目前我给NSImageView添加手势无效,也没有个属性叫用户交互开关。NSImageView 继承与 NSControl,那么有个属性叫 action,这个可以在NSButton中详细介绍,但是NSImageView 设置 action 也无效,暂时没找到原因。
NSImageView 响应点击事件,换另一种思路:自定义一个NSImageView的子类,监测这个类的鼠标事件即可。详情见《OS开发笔记一鼠标事件》。