【问题标题】:UIButton not responding after animationUIButton在动画后没有响应
【发布时间】:2013-09-24 22:24:53
【问题描述】:

我希望先从以下链接下载项目,然后继续提问(仅 36kb)

Download Link

一开始我所拥有的如下所示。

当我单击“我的办公室”按钮时,我正在调用操作 actionSeenButton,它将打印 NSLog(@"actionSeenButton");

- (IBAction)actionSeenButton:(id)sender {
    NSLog(@"actionSeenButton");
}

这很完美。

当我点击显示隐藏按钮时,我将视图滑动 100 并显示顶部的图像和按钮,如下图所示

使用的代码是

- (IBAction)showHiddenButton:(id)sender {
    CGAffineTransform translation = CGAffineTransformIdentity;
    translation = CGAffineTransformMakeTranslation(0, 100);
    [UIView beginAnimations:nil context:nil];
    self.view.transform = translation;
    [UIView commitAnimations];
}

当我单击此按钮时,我正在调用操作actionHiddenButton,它将打印NSLog(@"actionHiddenButton");

- (IBAction)actionHiddenButton:(id)sender {
    NSLog(@"actionHiddenButton");
}

但问题是,当我点击看到的新按钮时,没有调用操作。

知道为什么会这样吗?


注意

当我将顶部隐藏按钮从 y=-70 移动到 y=170 时,会调用操作。

示例项目可以从here下载

我想要实现的是,通过向下移动视图,在一行的顶部显示三个按钮(作为菜单)。

【问题讨论】:

    标签: ios objective-c uibutton ibaction cgaffinetransform


    【解决方案1】:

    确认您的按钮不在另一个视图的框架后面。即使按钮是可见的,如果有东西覆盖它也不会起作用。我目前无法访问 xcode,但我的猜测是您的视图“堆栈”禁止您与按钮交互。一个按钮本质上是一个 uiview,你可以对按钮和标签做所有相同的动画,你可以使用视图。您最好的选择是将视图单独留在背景中,然后移动您的按钮。因为您的“隐藏”按钮不是您的主要“视图”层次结构的一部分,这就是您的问题所在。

    经过进一步调查,您的问题与自动布局有关,并确保您的按钮对象保留在视图层次结构中。如果您关闭自动布局,您将看到问题出在哪里。当您为主视图设置动画时,“隐藏”按钮会关闭视图并且处于非活动状态。最简单的解决方案是只为按钮设置动画。最接近您所拥有的下一个最佳解决方案是将另一个视图添加到您的“主视图”中,然后将按钮放入该视图中。还有为什么你有两次背景图片?为什么不将视图的背景颜色设置为相同的黄色?

    【讨论】:

    • 最简单的解决方案是只为按钮设置动画。 很难,因为我很难为所有视图控制器执行此操作。
    【解决方案2】:

    我下载了你的项目,看来你正在为self.view 进行翻译。所以 actionHiddenButton 不在框架中。最好让 controls 在单独的视图中制作动画。
    如果您想查看问题,请在您的视图转换后将clipsToBounds 设置为YES。喜欢

        self.view.transform = translation;
        self.view.clipsToBounds = YES;
    

    【讨论】:

    • 好的,我知道了问题所在。那有什么解决办法呢?
    • 最好将按钮放在UIView 中。然后为该视图执行CGAffineTransform
    【解决方案3】:

    耶!以下是我的做法。

    .h

    添加了新变量。

    @property (retain, nonatomic) NSString *hideStatus;
    

    .m

    -(void) viewDidAppear:(BOOL)animated {
        NSLog(@"viewDidAppear");
        CGAffineTransform translation = CGAffineTransformIdentity;
        translation = CGAffineTransformMakeTranslation(0, -100);
        self.view.transform = translation;
        self.view.clipsToBounds = YES;
        [UIView commitAnimations];
        self.view.frame = CGRectMake(0,-80,320,560);
        hideStatus = @"hidden";
    }
    
    - (IBAction)showHiddenButton:(id)sender {
        NSLog(@"hideStatus===%@", hideStatus);
        CGAffineTransform translation = CGAffineTransformIdentity;
        if ([hideStatus isEqualToString:@"hidden"]) {
            translation = CGAffineTransformMakeTranslation(0, 0);
            hideStatus = @"shown";
        } else {
            translation = CGAffineTransformMakeTranslation(0, -100);
            hideStatus = @"hidden";
        }
    
        [UIView beginAnimations:nil context:nil];
        self.view.transform = translation;
        self.view.clipsToBounds = YES;
        [UIView commitAnimations];
    }
    

    附件是示例项目。您可以从here下载。

    【讨论】:

    • 不用@"hidden" 字符串,为什么不直接使用 BOOL 呢?这是他们的预期目的。所以你可以有“@property (assign) BOOL isHidden;”那么在你的 if 语句中,你要么有“if(isHidden)...”要么“if(!isHidden)...”。还有这个“CGAffineTransform 翻译 = CGAffineTransformIdentity;”是不必要的。它应该只是“CGAffineTransform 翻译;”。由于您以不同的方法重用它,因此不妨将其设为属性。
    • @DoS:废话..我知道我可以使用布尔值,但由于某种原因我没有使用...我有更多的隐藏状态,因此我使用字符串..我有很多状态,我将根据状态显示/隐藏所需的内容......不过,感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多