单击osx 10.6选择一个视图

时间:2013-04-10 04:44:39

标签: macos cocoa

我创建了一个图像视图

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];}    

现在如何通过鼠标点击选择每个图像视图?提前谢谢。

2 个答案:

答案 0 :(得分:1)

我在这里假设您有理由不使用现有的集合视图。因此,从我在您的代码中读到的内容中,您有layoutCustom.view,其中包含一堆NSImageViews。这有两个选择:

  1. 在layoutCustom对象中实现mouseDown :(或mouseUp:或两者)。获取事件位置转换视图坐标并查找CGRectContainsPoint(subview.frame,mouseDownPoint)返回YES的任何子视图。您应该选择该视图。

  2. 子类NSImageView并实现mouseDown :(或mouseUp:或两者)。在mouseDown上:只需设置一个“selected”标志。视图可以在选中时自行绘制内容,或者layoutCustom对象可以观察属性并相应地绘制选择。

  3. 我更喜欢选项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单元格中......