我创建了一个图像视图
for(int i=0; i<pcount; i++)
{
int x = rand() % 350;
int y = rand() % 350;
NSRect rect = NSMakeRect((x+10),(y+10), 200, 200);
//NSImageView *imageView
imageView1 = [[NSImageView alloc]initWithFrame:rect];
[imageView1 setTag:i];
// imageView = [[NSImageView alloc]initWithFrame:rect];
// [imageView1 rotateByAngle:rand() % 150];
[imageView1 setImageScaling:NSScaleToFit];
[imageView1 canBecomeKeyView];
NSImage *theImage = [[NSImage alloc]initWithContentsOfURL:(NSURL*)[patharray objectAtIndex:(i)]];
[imageView1 setImage:theImage];
[[imageView1 cell] setHighlighted:YES];
[[layoutCustom view] addSubview:imageView1 positioned:NSWindowMovedEventType relativeTo:nil];}
现在如何通过鼠标点击选择每个图像视图?提前谢谢。
答案 0 :(得分:1)
我在这里假设您有理由不使用现有的集合视图。因此,从我在您的代码中读到的内容中,您有layoutCustom.view,其中包含一堆NSImageViews。这有两个选择:
在layoutCustom对象中实现mouseDown :(或mouseUp:或两者)。获取事件位置转换视图坐标并查找CGRectContainsPoint(subview.frame,mouseDownPoint)返回YES的任何子视图。您应该选择该视图。
子类NSImageView并实现mouseDown :(或mouseUp:或两者)。在mouseDown上:只需设置一个“selected”标志。视图可以在选中时自行绘制内容,或者layoutCustom对象可以观察属性并相应地绘制选择。
我更喜欢选项1,因为它更简单,需要更少的类和更少的对象之间的交互。
// Option 1 (in layoutCustom class)
- (void) mouseDown:(NSEvent*)theEvent {
CGPoint mouseDownPoint = [self convertPoint:theEvent.locationInWindow fromView:nil];
for (NSView *view in self.subviews) {
if (CGRectContainsPoint(view.frame, mouseDownPoint)) {
// Do something to remember the selection.
// Draw the selection in drawRect:
[self setNeedsDisplay:YES];
}
}
}
// Option 2 (in Custom subclass of NSImage)
- (void) mouseDown:(NSEvent*)theEvent {
self.selected = !self.selected;
}
// Option 2 (in layoutCustom class)
- (void) addSubview:(NSView*)view positioned:(NSWindowOrderingMode)place relativeTo:(NSView*)otherView {
[super addSubview:view positioned:place relativeTo:otherView];
[self startObservingSubview:view];
}
- (void) willRemoveSubview:(NSView*)view {
[self stopObservingSubview:view];
}
- (void) startObservingSubview:(NSView*)view {
// Register your KVO here
// You MUST implement observeValueForKeyPath:ofObject:change:context:
}
- (void) stopObservingSubview:(NSView*)view {
// Remove your KVO here
}
答案 1 :(得分:0)
我有一个更好的主意:不是在视图中将鼠标点击转换为坐标,然后想出如何将其映射到正确的子视图或子图像,而不是为什么没有一个大(或滚动?)查看然后将您的图像添加为巨型“NSButton
”对象(设置为自定义类型),其中按钮图像可以是您要添加的图像。
至于如何选择每张图片?您可以子类化“NSButton
”并跟踪其中的一些自定义数据,也可以使用“tag
”来确定在“IBAction
”方法中按下了哪个按钮然后决定如何处理它。
另一种方法可能是将您的图像嵌入到NSTableView单元格中......