我创建了NSImageView捕获mouseEntered 和mouseExited事件的子类.但只有mouseUp和mouseDown事件获取调用.如何捕获mouseEntered并mouseExited在事件NSImageView子类?
所以我习惯了UIImageView,并能够设置不同的方式来显示图像.比如AspectFill模式等......
我想在Mac应用程序上使用NSImageView完成同样的事情.在这方面,NSImageView的工作方式与UIImageView类似吗?或者我将如何在NSImageView中显示图像并选择不同的方式来显示该图像?
我希望我能找到答案.我搜索并搜索过,但答案不对.这是我的情况:
在Mac OS Cocoa应用程序中,我想在我的应用程序窗口的专用区域上绘制一个像素(实际上是几个像素).我想,NSImageView放在那里会更好(我用IB做了这个并将插座连接到我的应用代表)然后用它代替我的NSWindow.
我怎么能这样做呢?Mac OS似乎提供NSBezierPath了最基本的绘图工具 - 这是真的吗?这对我来说是完全令人震惊的.我来自Windows编程的悠久历史,并且通常在画布上绘制像素是最简单的事情.
我不想使用OpenGL,我不确定Quartz参与的程度如何.
我想要的只是帮助我如何在真正的Objective-C/Cocoa中实现这个伪代码:
imageObj.drawPixel(10,10,blackColor);
Run Code Online (Sandbox Code Playgroud)
我很想听听你的回答,我相信这会帮助很多人从Cocoa开始.
谢谢!
我正在使用NSImageView来显示大约80帧的动画GIF,每帧长20ms.NSImageView可以"开箱即用"显示GIF动画,但问题是它需要太多的CPU,大约连续10%(在我的核心i5 proc上).仪器显示它花费了大量的CPU时间来解码GIF.
为了提高效率,我尝试了以下方面但没有取得多大成功:
将帧放入QTMovie并播放(我的进程使用4%,播放电影的QTKitServer进程使用另外15%)
绘图直接与视图CGContextDrawImage(〜5%的CPU使用率) -我没有出口的GIF的框架,我就创建了一个CGImageRef从30x30px巴纽我已经躺在附近.
我不知道还有什么可以尝试的.对NSImageView进行子类化并以某种方式缓存图像听起来是个好主意,但是,唉,我是Cocoa的初学者......任何想法都会受到高度赞赏.谢谢!
我的Mac App中有一些NSImageView,用户可以拖放像.png或.pdf这样的对象,将它们存储到用户共享默认值中,工作正常.
我现在想设置一个动作,当用户双击这些NSImageView时,但它似乎有点困难(我没有NSTableView的麻烦,但'setDoubleAction'不适用于NSImage,并且答案很多(这里)或者谷歌)关于NSImageView的动作指向制作NSButton而不是NSImageView,所以这没有帮助)
这是我的AppDelegate.h的一部分:
@interface AppDelegate : NSObject <NSApplicationDelegate>{
(...)
@property (assign) IBOutlet NSImageView *iconeStatus;
(...)
@end
Run Code Online (Sandbox Code Playgroud)
这是我的AppDelegate.m的一部分:
#import "AppDelegate.h"
@implementation AppDelegate
(...)
@synthesize iconeStatus = _iconeStatus;
(...)
- (void)awakeFromNib {
(...)
[_iconeStatus setTarget:self];
[_iconeStatus setAction:@selector(doubleClick:)];
(...)
}
(...)
- (void)doubleClick:(id)object {
//make sound if that works ...
[[NSSound soundNamed:@"Basso"] play];
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
谁能告诉我最简单的方法是什么?
我需要NSImageView在resizable 上显示NSWindow.如果视图中显示的图像太大而无法适应widnow中的图像视图,则视图中应显示的图像应缩小,并且在调整窗口大小时也应更改其大小.我能够使用自动布局实现正确的行为,并将imageScaling属性设置NSImageView为NSImageScaleProportionallyDown.不幸的是,当我的图像视图的imageFrameStyle属性被设置为时,它不起作用NSImageFrameNone(它适用于任何其他选项,如NSImageFramePhoto或NSImageFrameGrayBezel).我不希望显示任何帧,例如NSImageFrameNone,但禁用帧中断自动调整 - 看起来像帧设置为NSImageFrameNone图像不缩小并按NSImageView比例放大以匹配显示的图像大小.有人解决这个问题吗?
我有一个占用窗口全部范围的NSImageView.图像视图没有边框,其设置显示在左下角.因此,这意味着视图的原点与实际图像的原点匹配,无论窗口的大小如何调整.
此外,图像比我在屏幕上完全适合的尺寸大得多.所以我也将imageview设置为按比例缩小图像的大小.但是,我似乎无法在任何地方找到这种比例因子.
我的最终目标是将鼠标按下事件映射到实际图像坐标.要做到这一点,我想我还需要一条信息......显示的NSImage实际上有多大.
如果我看一下[imageView bounds],我会得到图像视图的边界矩形,它通常会比图像大.
我正在尝试显示一个简单的NSImageView,它的图像居中而不像这样缩放它:

就像iOS设置UIView的contentMode = UIViewContentModeCenter一样
所以我尝试了所有NSImageScaling值,这是我选择NSScaleNone时得到的

我真的不明白发生了什么: - /
(渲染为模板图像)
我试过这段代码:
@IBOutlet weak var imgAdd: NSImageView!
imgAdd.layer?.backgroundColor = CGColor.white
Run Code Online (Sandbox Code Playgroud)
这只会改变背景颜色.
有没有办法以编程方式更改此图像的颜色?
到目前为止,我已经尝试了下面的代码不起作用.(图像颜色不会改变.)
func tintedImage(_ image: NSImage, tint: NSColor) -> NSImage {
guard let tinted = image.copy() as? NSImage else { return image }
tinted.lockFocus()
tint.set()
let imageRect = NSRect(origin: NSZeroPoint, size: image.size)
NSRectFillUsingOperation(imageRect, .sourceAtop)
tinted.unlockFocus()
return tinted
}
imgDok.image = tintedImage(NSImage(named: "myImage")!, tint: NSColor.red)
Run Code Online (Sandbox Code Playgroud) nsimageview ×10
cocoa ×8
macos ×4
objective-c ×3
animated-gif ×1
gif ×1
nsimage ×1
pixel ×1
swift3 ×1
xcode ×1