- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
有一个 NSImageView 的子类,并创建了 CALayer 的实例,所以我们在图像上看到了一个矩形。问题是当鼠标按下时(当鼠标指针在矩形内时)并拖动时如何移动此矩形。当鼠标悬停时,这个矩形 (CALayer) 应该留在图像上的新位置。
例如
class ImageViewWithRectangle: NSImageView
{
var shape : CAShapeLayer!
func drawRectangle()
{
shape = CAShapeLayer()
shape.lineWidth = 1.0
shape.fillColor = NSColor.clear().cgColor
shape.strokeColor = NSColor.gray().cgColor
shape.lineDashPattern = [1,1]
self.layer?.addSublayer(shape)
let path = CGMutablePath()
path.moveTo(nil, x: 1, y: 1)
path.addLineTo(nil, x: 1, y: 50)
path.addLineTo(nil, x: 50, y: 50)
path.addLineTo(nil, x: 50, y: 1)
path.closeSubpath()
self.shape.path = path
}
}
最佳答案
You are very close to your goal, just implement the mouse events !
这是一个工作片段:
class ImageViewWithRectangle: NSImageView {
var shape : CAShapeLayer!
var shapeRect = NSMakeRect(10, 10, 100, 50)
var shouldMove = false;
var anchorPoint : NSPoint!
override func awakeFromNib() {
//We MUST implement layers! Otherwise nothing will work!!
//You could do it even through Interface Builder
self.wantsLayer = true;
}
override func drawRect(dirtyRect: NSRect) {
//Every time the view is drawn, remove the old layer
self.layer?.sublayers?.forEach({ $0.removeFromSuperlayer() })
//Draw the new one
self.drawRectangle()
}
func drawRectangle()
{
//Draw the layer
shape = CAShapeLayer()
shape.lineWidth = 1.0
shape.fillColor = NSColor(calibratedWhite: 1, alpha: 0).CGColor
shape.strokeColor = NSColor.grayColor().CGColor
shape.lineDashPattern = [1,1]
shape.backgroundColor = NSColor.greenColor().CGColor
//No need for CGPaths for a simple rect, just set the frame and fill it
shape.frame = self.shapeRect
self.layer?.addSublayer(shape)
}
//Implmenet mouse events
override func mouseDown(theEvent: NSEvent) {
//get coordinates
let pos = theEvent.locationInWindow
//Check if inside the rect
if ((pos.x >= self.shapeRect.origin.x) && (pos.x <= self.shapeRect.origin.x + self.shapeRect.size.width)) {
//X match, now check Y
if ((pos.y >= self.shapeRect.origin.y) && (pos.y <= self.shapeRect.origin.y + self.shapeRect.size.height)) {
//If we get here, then we're insisde the rect!
self.shouldMove = true;
//OPTIONAL : Set an anchor point
self.anchorPoint = NSMakePoint(pos.x - self.shapeRect.origin.x, pos.y - self.shapeRect.origin.y);
}
}
}
override func mouseDragged(theEvent: NSEvent) {
if (self.shouldMove) {
let pos = theEvent.locationInWindow
//Update rect origin, or whatever you want to use as anchor point
self.shapeRect.origin = NSMakePoint(pos.x - self.anchorPoint.x, pos.y - self.anchorPoint.y)
//Redraw the view
self.display()
}
}
override func mouseUp(theEvent: NSEvent) {
if (self.shouldMove) {
//Reset value
self.shouldMove = false;
}
}
}
The output will be something like this (No bg images have been set though)
您甚至可以添加过渡效果、边框、渐变等等!
CALayers 和更普遍的 CoreAnimation 真的很强大!
如果您需要说明,请告诉我,
我希望这对您有所帮助,如果有帮助,请将此答案标记为正确,以便其他人可以使用它!
干杯。
关于swift - 如何在 NSImageView 上移动 CALayer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39311698/
我有一个 NSTableView,它包含所有 NSImageView 的名称,并且根据 NSImageView 的添加顺序,最后一个将位于前面。 但是如果我希望用户能够将 NSImageViews 放
我有一个 NSImageView 可以很好地作为图像运行。它也是通过绑定(bind)的。使用值路径属性显示每个记录的已保存图像的值转换器(值转换器只是附加文件路径——我只是将图像的文件名存储在数据库中
我想在 NSImageView 中捕捉图像变化的事件,我该怎么做? 最佳答案 您可以尝试使用 KVO监视image键。如果这不起作用,您可能必须继承 NSImageView 并将逻辑插入到 setIm
我创建了 NSImageView 的子类,因为我想自定义一些 mouseClick 事件。但是,我还没开始,就出了问题。我创建了 NSImageView 子类: (文件/新建/文件.../Cocoa(
所以,我的 Cocoa 应用程序中遇到了这个奇怪的问题。一个工具栏项,和一些 NSImageViews 只是渲染他们的图像颠倒,没有明显的原因。当我出于某种原因启动应用程序时,工具栏项目实际上是这样的
我是Mac开发新手,我们有类似的方法吗 imagev = [NSArray arrayWithObjects 我需要一些类似于我们在 iOS 中所做的事情想要在 mac 中做的事情, imageVie
任何人都可以给我推荐一个在 NSImageView 中缩放图像的好示例代码吗?谢谢。 最佳答案 如果你看the documentation ,你会发现 NSImageView 不支持这一点。使用Ima
我有一个 Cocoa 应用程序。在窗口 View 中我放置了一个 NSImageView。使用自动布局,我添加了前导和尾随空格,使得 NSImageView 锚定到 View (以及窗口)。 NSIm
目前我想创建一个圆角NSImageView,我是新手,怎么做? 最佳答案 我不知道这是否有效,所以请尝试一下,我们会祈祷的。在 iPhone 上,您可以使用任何 UIView(iOS 中的 NSVie
所以我习惯了UIImageView ,并能够设置其图像在其中显示的不同方式。例如 AspectFill模式等... 我想使用 NSImageView 完成同样的事情在 Mac 应用程序上。是否NSIm
我有一个使用以下代码的 iOS 应用程序。我现在正在为 Mac OS X 创建应用程序并希望获得相同的效果,但是我似乎无法使用 clipsToBounds .我应该使用什么? 我有其余的代码在 Mac
我正在玩 AppKit 和 NSDocument,但我不知道为什么这不起作用?: 我刚刚写了这个,图像不是零,但从不加载任何图像,它的大小始终为零。 这是我必须实现的正确方法才能将文件读入我的文档吗?
我的 Mac 应用程序中有一些 NSImageView,用户可以在其中拖放 .png 或 .pdf 等对象,将它们存储到用户共享默认值中,这很好用。 我现在想在用户双击这些 NSImageView 时
我是 OS X 编程的初学者,在设置 NSImageView 透明度时遇到问题。 在 iOS 中这很简单,在 UIImageView 中有一个名为 alpha 的属性,我可以更改它并为其设置动画。 (
我如何能够在 Objective C 中屏蔽 nsimageview?例如,有一个带圆角的 nsimageview。 最佳答案 你不知道。如果你想以 NSImageView 不支持的方式绘制图像,则需
出于某种原因,分配两个 NSImageView 会造成巨大的内存泄漏。 尽管 dealloc 方法在两个 NSImageView 中都会被调用。 我正在使用ARC。 使用NSImageViews 一旦
我正在尝试制作一个简单的双骰子游戏。在过去的一年里,我完成了大量的 C 编程,并且正在尝试转换为 GUI 和 Obj C。我的窗口内有一个按钮和两个图像单元。图像被视为输出(染料、染料2),按钮保持
我有多个不同尺寸和比例的 NSImageView,它们垂直堆叠在水平空间有限的 View 中。 由于图像尺寸可能大于父 View 的尺寸,我想使用 NSImageScaleProportionally
我已经 Hook 了 NSTableView 的选择更改事件。我需要在 ImageView 中显示所选图像 func tableViewSelectionDidChange(_ notificatio
我创建了一个 NSView 的自定义子类来控制 2 个 NSImageView。创建图像的代码如下: - (id)initWithFrame:(NSRect)frameRect AndMap:(NSI
我是一名优秀的程序员,十分优秀!