UIView动画导致UIButton跳转

时间:2013-10-24 11:07:02

标签: ios iphone objective-c

用户界面以编程方式生成UI。我在UI中的buttonstexboxes很少。我开发了一个自定义uidatapicker对象,它从顶部弹出,动画到屏幕中间。弹出uidatapicker时,我会使用屏幕大小绘制另一个UIView(称为帮助程序视图),因此除了uiobject之外,屏幕上的所有其他uidatepicker都将被禁用。 但是当UIDatePicker动画时,UI中的按钮会跳转到另一个位置。我的UI中还有三个按钮。它只发生一个按钮(UIView中的一个UIButon)。其他两个按钮都可以。除了按钮文本之外,这些按钮之间没有显着差异。

  • 我删除了之前描述的视图(帮助视图),但仍然是 问题正在发生。
  • 我需要知道为什么会发生这种情况 防止它。
  • 此外,我还有很多其他网页可以正常使用。

代码

-(void)openEditDateTime:(UIDatePickerMode) mode {
    if ([clientView viewWithTag:9]) {
        [self cancelPressed];
    }
    CGRect toolbarTargetFrame = CGRectMake((clientView.frame.size.width/2)-160, (clientView.frame.size.height/2)+91, 320, 44);
    CGRect datePickerTargetFrame = CGRectMake((clientView.frame.size.width/2)-160, (clientView.frame.size.height/2)-125, 320, 216);

    backgroundView = [[UIView alloc] initWithFrame:clientView.bounds];
    backgroundView.alpha = 0;
    backgroundView.backgroundColor = [UIColor blackColor];
    backgroundView.tag = 9;
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cancelPressed:)];
    [backgroundView addGestureRecognizer:tapGesture];
    [clientView addSubview:backgroundView];
    [self bringToFront:backgroundView];

    datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, self.bounds.size.height+44, 320, 216)];
    datePicker.tag = 10;
    datePicker.datePickerMode = mode;
    [clientView addSubview:datePicker];
    [clientView bringSubviewToFront:datePicker];
    [datePicker becomeFirstResponder];
    [self bringToFront:datePicker];
    if(date != nil){
        datePicker.date = date;
    }

    toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, self.bounds.size.height, 320, 44)];
    toolBar.tag = 11;
    toolBar.barStyle = UIBarStyleBlackTranslucent;
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(donePressed:)];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelPressed:)];
    [toolBar setItems:[NSArray arrayWithObjects:spacer, doneButton, cancelButton, nil]];
    [clientView addSubview:toolBar];
    [clientView bringSubviewToFront:toolBar];

    [UIView beginAnimations:@"MoveIn" context:nil];
    toolBar.frame = toolbarTargetFrame;
    datePicker.frame = datePickerTargetFrame;
    backgroundView.alpha = 0.5;
    [UIView commitAnimations];
}


  - clientViewUIScrollView   - backgroundView是前面描述的助手视图
这是我添加按钮的方式。
我只会放置按钮渲染代码的一部分,因为所有代码都是不必要的,并且它还有许多其他依赖性。

-(RenderedElement*)renderElement:(NSObject*)element:(ParentView*)parent:(PageView*)page:(Page*)modelPage:(RenderedElement*)parentRenderedElement {

    UIButton *buttonView = nil;
    Button *templateElement = nil;
    buttonView = [UIButton buttonWithType:UIButtonTypeCustom];
    [buttonView setLineBreakMode:UILineBreakModeWordWrap];        
    [buttonView addTarget:parent action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; 
    [parent addSubview:buttonView];
}


更新
当我改变渲染顺序时,如果我首先渲染按钮,则不会发生跳跃效果。用户界面工作正常。它暂时解决了这个问题。但我想找到原因并找到更好的解决方案。

3 个答案:

答案 0 :(得分:2)

也许你可以添加

[UIView setAnimationBeginsFromCurrentState:YES];

[UIView beginAnimations:@"MoveIn" context:nil];

答案 1 :(得分:2)

你真的说过哪个按钮正在移动吗?没有更多细节,有点难以帮助。但是这里有一些建议:

而不是将日期选择器添加到堆栈的底部,然后将其向前拉:

[clientView addSubview:datePicker];
[clientView bringSubviewToFront:datePicker];

为什么不尝试通过以下方式添加它:

[clientView insertSubview:datePicker atIndex:0];

另外,在添加datPicker然后向前拉动之后,您正在添加工具栏,我假设该工具栏包含有问题的按钮。您是否希望工具栏位于视图层次结构中的日期选择器上方?

也许将其插入:

[clientView insertSubview:toolBar aboveSubview:datePicker];

最后,您是否需要为工具栏框架设置动画?

答案 2 :(得分:0)

我能想象的唯一可能是你在客户端视图上有这个按钮。因为你正在添加和移动这个

[clientView addSubview:datePicker];
[clientView bringSubviewToFront:datePicker];

这可能会导致重新调整UIButton的帧。并且由于在此过程中发生这种情况,它也会动画显示其跳跃按钮的动作。所以我想你应该尝试

[jumpingButton setAnimationsEnabled:NO];  //you-know jumping button is the outlet of the -you-know-who