用户界面以编程方式生成UI。我在UI中的buttons
和texboxes
很少。我开发了一个自定义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];
}
- clientView
是UIScrollView
- 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];
}
的更新
当我改变渲染顺序时,如果我首先渲染按钮,则不会发生跳跃效果。用户界面工作正常。它暂时解决了这个问题。但我想找到原因并找到更好的解决方案。
答案 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