1

在我正在创建的应用程序中,我希望NSOpenGLViews在用户按下按钮时有一定的淡入和淡出视图。为此,我使用 创建了一个简短的测试应用程序NSViewAnimation,尝试在 10 秒内淡出视图。该代码与这篇文章中的代码密切相关。

该代码非常适用于从 继承的一般对象NSView,例如NSBox对象,但是当我尝试将它与NSOpenGLView对象一起使用时,视图在 10 秒钟内什么都不做,然后突然消失。有没有什么额外的事情我必须做才能NSViewAnimation使用NSOpenGLView,或者NSViewAnimation在这种情况下不是适合这项工作的工具?

相关代码:

// AppDelegate.m
#import "AppDelegate.h"

@implementation AppDelegate
@synthesize theForeground;  // an instance of a the Foreground class - a subclass of NSOpenGLView
@synthesize theBox;
@synthesize theBackground;

//code omitted

- (IBAction)buttonPressed:(id)sender
{
    NSViewAnimation *theAnim;
    NSMutableDictionary * theViewDict;

    theViewDict = [NSMutableDictionary dictionaryWithCapacity:2];
    [theViewDict setObject: theForeground forKey:NSViewAnimationTargetKey];
    [theViewDict setObject:NSViewAnimationFadeOutEffect
                   forKey:NSViewAnimationEffectKey];

    theAnim = [[NSViewAnimation alloc] initWithViewAnimations:  [NSArrayarrayWithObject:theViewDict]];

    [theAnim setDuration:10.0];
    [theAnim setAnimationCurve:NSAnimationEaseInOut];

    [theAnim startAnimation];

    [theAnim release];
}
@end


// Foreground.m

#import "ForegroundView.h"

@implementation ForegroundView

// code omitted
- (void)drawRect:(NSRect)dirtyRect
{
    glClearColor(0, 0, 0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_QUADS);
        glVertex2f(-0.5, -0.5);
        glVertex2f(0.5, -0.5);
        glVertex2f(0.5, 0.5);
        glVertex2f(-0.5, 0.5);
    glEnd();
    glFlush();
}

@end
4

2 回答 2

1

我设法通过创建一个CAOpenGLLayer子类来绘制 OpenGL 内容来达到预期的结果。有关 Apple 示例代码,请参见此处。然后通过以下方式实现淡入和淡出:

- (IBAction)buttonPressed:(id)sender
{
    static int isVisible = 1;
    [theGLView.layer setHidden: isVisible];
    isVisible = (isVisible + 1) % 2;
}
于 2012-10-11T02:00:46.633 回答
0

您可以尝试将 NSOpenGLView 分配为容器 NSView 的子视图,其 alphaValue 您使用动画器设置。

[[containerView animator] setAlphaValue: 0.0f];

这对我来说很有用。

于 2012-10-08T04:39:57.753 回答