Cocoa China 苹果开发中文站

苹果Mac OS X开发 iPhone开发 Cocoa以及Cocoa Touch

推荐使用Safari浏览器阅读本站

NSView

苹果在最新发布的Macbook Air中,应用了最新的触摸板,这种触摸板实现了广为好评的iPhone中的多点触摸MultiTouch技术,你可以用两根或者三根手指在触摸板上做出叫做手势(Gestures)的动作,程序可以对你的动作进行诸如缩放、旋转、翻页等响应。而在未来,新的Macbook Pro也将带有这种全新的触摸板。

不过虽然触摸板硬件本身带有这种技术,不过目前也只有少量苹果随机自带的程序支持多点触摸功能。那么如何在你自己的应用程序中也加入这种全新体验的功能,就是本文讨论的课题。

 

点击这里阅读全文 »

如何获取标题栏的高度

当你对一个窗口使用setFrame:时,你需要把标题栏的高度也算进去。从前标题条的高度是16点,在Aqua里,是22个点。由于这个高度不固定,所以你最好这样计算:

 
- (float) titleBarHeight
{
    NSRect frame = NSMakeRect (0, 0, 100, 100);
           
    NSRect contentRect;
    contentRect = [NSWindow contentRectForFrameRect: frame
                                                                                              styleMask: NSTitledWindowMask];
           
    return (frame.size.height - contentRect.size.height);
           
}

如何为视图设置鼠标指针图形

有时候你希望设置鼠标的样式,比如选择图片时,你希望鼠标指针是一个十字形。将以下代码加入NSView的子类中:

 
- (void) resetCursorRects
{
    [super resetCursorRects];
    [self addCursorRect: [self bounds]
                                      cursor: [NSCursor crosshairCursor]];
           
}

如何在NSView中响应esc键

ESC键并没有预置的常量供使用。不过你可以使用键值27,因为几乎所有电脑的键盘esc用的都是这个键值。

 
- (void) keyDown: (NSEvent *) event
{
    NSString *chars = [event characters];
    unichar character = [chars characterAtIndex: 0];
           
    if (character == 27) {
        NSLog (@"ESCAPE!");
    }
}
 

如何在NSView中响应删除键

实现方法是:在事件中搜索NSDeleteCharacter

 
- (void) keyDown: (NSEvent *) event
{
    NSString *chars = [event characters];
    unichar character = [chars characterAtIndex: 0];
           
    if (character == NSDeleteCharacter) {
        NSLog (@"Delete!");
    }
}

如何将实现类似iPhone形式的页面卷动

像iPhone那种用手指拖拽形式的页面卷动在某些情况下很有用。如果是一个比较大的图形或者列表,显然这种滚动形式更容易看清楚。

您只要阅读本文就知道如何简单地实现了。
 
 

点击这里阅读全文 »

实现方法:

NSView子类中加入:
[self lockFocus];
 
NSBitmapImageRep *bits;
bits = [[NSBitmapImageRep alloc]
                   initWithFocusedViewRect: [self bounds]];
[self unlockFocus];
 
这样就可以将其保存在NSImage中,或者保存为文件等。
 
如果你希望将图形保存为矢量信息,你可以使用 [self dataWithPDFInsideRect: [self bounds]] 然后建立一个NSPDFImageRep。不要使用NSEPSImageRep因为PS格式转换速度比较缓慢。

如何在NSView中检测键盘方向键

以下是实现代码,保存下来吧:)

- (void) keyDown: (NSEvent *) event
{
    NSString *characters;
    characters = [event characters];
           
    unichar character;
    character = [characters characterAtIndex: 0];
           
    if (character == NSRightArrowFunctionKey) {
        [self moveSelectedBlockBy: 1];
                  
    } else if (character == NSLeftArrowFunctionKey) {
        [self moveSelectedBlockBy: -1];
                  
    } //也可以获取其他按键
}

如何在mouseUP事件中检测鼠标选中的CALayer

如果你看过Core Animation,一定希望自己制作动感十足的菜单,CocoaChina带给你如何实现这种菜单的方法。本文主要介绍如何通过点击选中某一个特定菜单项的方法,如果你希望对Core Animation涉及多一点,相信这篇文章会对你有用。

假定我们通过以下层次结构创建了一系列CALayer,这些CALayer实现了一个菜单结构:

rootLayer -> scrollLayer -> menuLayer -> n个菜单项Layer
 
那么我们希望通过鼠标点中对某一个菜单项进行选择,基本思路是这样的:
 
由于菜单项内可能有多个选项,而且可能有滚动的情况,因此需要通过-hitTest:方法获取点中的层。
 
请仔细阅读本文获取更多内容。

点击这里阅读全文 »

将事件转换为视图的坐标系

以下是代码: 

NSPoint point = [self convertPoint: [event locationInWindow] fromView: nil];

检查SHIFT键状态

mouseDown:

 
if ([event modifierFlags] & NSShiftKeyMask) {
            constrain = YES;
}
 
如果不在mouseDown:中,需要调用carbon
 
GetCurrentEventKeyModifiers返回控制键的状态
GetCurrentKeyModifiers返回硬件按键状态
 
热键常量需要转换一下才能在AppKit里使用。

最新讨论