アプリで UI がプログラムによって生成されます。UIにはほとんどbuttons
ありません。画面の上部からポップアップし、画面の中央にアニメーション化するtexboxes
カスタムオブジェクトを開発しました。ポップアップが表示されたら、画面のサイズで別のビュー (ヘルパー ビューと呼ばれる) を描画uidatapicker
して、画面内の他のすべての s を除くが無効になるようにします。しかし、UI のボタンをアニメーション化すると、別の場所にジャンプします。また、UI には 3 つのボタンがあります。1 つのボタン (UIView 内の 1 つの UIButton) のみで発生します。他の2つのボタンは問題ありません。また、ボタンのテキストを除いて、これらのボタン間に大きな違いはありません。uidatapicker
UIView
uiobject
uidatepicker
UIDatePicker
- 前述のビュー (ヘルパー ビュー) を削除しましたが、まだ問題が発生しています。
- なぜこれが発生するのかを知る必要があります。
- また、うまく機能する他のページもたくさんあります。
コード
-(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];
}
更新
レンダリングの順序を変更すると、ボタンを最初にレンダリングすると、ジャンプ効果が発生しません。UIは正常に動作します。問題を一時的に解決します。しかし、私はその理由を見つけて、より良い解決策を見つけたいと思っています。