状态消息破坏了我的iPhone应用程序中的主窗口

时间:2012-10-13 14:45:06

标签: iphone ios uiview cgrect beginanimations

在我的iOS应用程序中,按下按钮时会启动一个事件,并在屏幕底部显示一条状态消息,通知用户操作成功或失败。

使用以下代码显示和消失状态消息。

这个显示消息

- (void) showMessage:(NSString*)text
{
        CGRect frame = [[self view] frame];

        if(statusView == nil)
        {
            messageViewWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, frame.size.height-29,
                                                       frame.size.width, 0)];


            statusView = [[StatusMessageView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, 0)
                                                             Text:text
                                                 andShowIndicator:NO];
            [messageViewWindow addSubview:statusView];
            [messageViewWindow makeKeyAndVisible];
        }

        UILabel *label = [statusView getTextLabel]; 
        UIImageView *imageView = [statusView getBackImageView];

        CGSize stringSize = [text sizeWithFont:[Constants getLabelFont]];
        int xCoordinate = (messageViewWindow.frame.size.width - stringSize.width)/2;

        [UIView beginAnimations:nil context:nil];
        messageViewWindow.frame = CGRectMake(0, frame.size.height-59, frame.size.width, 30);
        statusView.frame = CGRectMake(0, 0, frame.size.width, 30);
        label.frame = CGRectMake(xCoordinate,5,stringSize.width,20);
        imageView.frame = CGRectMake(0, 0, frame.size.width, 30);
        [UIView commitAnimations];  

        [NSTimer scheduledTimerWithTimeInterval:2.0f target:self selector:@selector(hideMessage) userInfo:nil repeats:NO];

}

并且这个隐藏了消息

- (void) hideMessage
{
    UILabel *label = [statusView getTextLabel]; 
    UIImageView *imageView = [statusView getBackImageView];

    CGRect labelFrame = label.frame;

    [UIView beginAnimations:nil context:nil];
    messageViewWindow.frame = CGRectMake(0, [UIScreen mainScreen].applicationFrame.size.height-29, [UIScreen mainScreen].applicationFrame.size.width, 0);
    statusView.frame = CGRectMake(0, 0, [UIScreen mainScreen].applicationFrame.size.width, 0);  
    label.frame = CGRectMake(labelFrame.origin.x, 0, labelFrame.origin.y, 0);
    imageView.frame = CGRectMake(0, 0, [UIScreen mainScreen].applicationFrame.size.width, 0);
    [UIView commitAnimations];
}

奇怪的是,消息显示并在两秒钟消失后,但主窗口失去了功能,如复制和粘贴功能。

你觉得我的方法有问题吗?有没有什么方法,调用“动画”代码?

2 个答案:

答案 0 :(得分:0)

由于您正在编写[messageViewWindow makeKeyAndVisible];,因此您必须在[self.view.window makeKeyAndVisible]中编写hideMessage以让self.view.window再次处理所有用户交互。

答案 1 :(得分:0)

  • 这是因为您使用UIWindow来显示您的观点,这不是一个好主意(不建议您自己创建UIWindows,如“概述”段落中所述。文档。
  • 此外,您将窗口设为关键窗口,但在隐藏窗口时不会恢复标准窗口,因此您以后会遇到问题。
  • 最后,你使用过时的API来制作动画,自从iOS4推出以来已经弃用了(我想你不会为iOS3或更早版本编写代码),你应该真正使用已经推出的3个iOS版本的新API以前。此外,它将避免为此创建NSTimer的开销。

所以你的代码可以变成:

- (void) showMessage:(NSString*)text
{
    CGSize sz = self.view.window.frame.size;
    CGRect hiddenFrame = CGRectMake(0, sz.height-29, sz.width, 0);

    if(statusView == nil)
    {
        statusView = [[StatusMessageView alloc] initWithFrame:hiddenFrame
                                                         text:text
                                             andShowIndicator:NO];
        [self.window addSubview:statusView];
    }

    UILabel *label = [statusView getTextLabel]; 
    UIImageView *imageView = [statusView getBackImageView];

    CGSize stringSize = [text sizeWithFont:[Constants getLabelFont]];
    int xCoordinate = (sz.width - stringSize.width)/2;
    label.frame = CGRectMake(xCoordinate,5,stringSize.width,20);
    imageView.frame = CGRectMake(0, 0, frame.size.width, 30);

    [UIView animateWithDuration:1.f animations:^{
        statusView.frame = CGRectMake(0, sz.height-59, frame.size.width, 30);
    } completion:^{
        // When show animation is done, schedule the start of the hide animation with a delay of 2 seconds
        [UIView animateWithDuration:1.f delay:2.f options:0 animation:^{
            statusView.frame = hiddenFrame;
        } completion:nil];
    }];
}