1

次のように、UIButton を作成して UIView に動的に追加しています。

UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.frame = CGRectMake(100, 10, btn.bounds.size.width, btn.bounds.size.height);
[btn addTarget:self action:@selector(myAction:) forControlEvents:UIControlEventTouchUpInside];
[myView addSubview:btn];

これは期待どおりに機能し、myAction が呼び出されます。次のように、表示されている myView の外側にこれを追加すると、問題が始まります。

btn.frame = CGRectMake(-100, 10, btn.bounds.size.width, btn.bounds.size.height);

後で、myView を画面外にアニメーション化して btn を表示します。

[UIView beginAnimations:nil context:NULL];
[myView layer].frame = CGRectMake(320, 0, 320, 48);
[UIView commitAnimations];

しかし問題は、myAction が呼び出されなくなったことです。なんで?そして、それを修正する方法は?

4

3 に答える 3

3

アートの答えに対するあなたのコメントは、問題をかなり説明しています。親の表示領域の外側にあるボタンがあります。ボタンがスタックの上位に表示されるように親が配置されているかどうかは関係ありません。ボタンがクリップされ、ペイントされていません。

2つの選択肢があります。

1)myViewのフレームを大きくし、すべての座標を適切に調整します。myViewには常にコンテンツの一部が画面外にあり、一部は画面上にあり、必要な場所に簡単に配置できます。ボタンが画面に表示されると表示されます。(たとえば、myViewの最初のフレームの上のコードでは、xの負の値で始まり、iPhone画面よりもはるかに広くなりますが、btnはmyViewの左上に対して正のx、yの位置に配置されます。次に、myViewを移動して、たとえば、0,0に移動し、画面上でbtnを移動しながら、コンテンツの一部を画面外にプッシュします。)

2)myViewにボタンを配置しないでください。myViewをアニメートているときに、アニメートする新しいビューに配置ます。

#1の簡単なコード:

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
    UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(-100, 0, 420, 480)]; // start 100 pixels to the left
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
    btn.frame = CGRectMake(0, 10, btn.bounds.size.width, btn.bounds.size.height);
    [myView addSubview:btn];

    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [btn1 setTitle:@"DoIt" forState:UIControlStateNormal];
    btn1.frame = CGRectMake(100, 100, 50, 50);
    [btn1 addTarget:self action:@selector(doit:) forControlEvents:UIControlEventTouchUpInside];
    [myView addSubview:btn1];
    self.view = myView;
}

- (void) doit: (id) bt {
    [UIView beginAnimations:nil context:NULL];
    self.view.frame = CGRectMake(100, 0, 420, 480);
    [UIView commitAnimations];
}
于 2009-11-06T04:01:50.790 に答える
1

私があなたのコードで気づいた2つのこと:

まず、frameはビューのスーパービューに関連しているため、メイン画面btn.frameではなく、画面外の場所ではなく、の相対的な場所に配置する必要がありmyViewます。すでにmyView負のx位置にあるとすると、ボタンもそこにあります。

次に、Core Animationを使用する場合は、 'sレイヤーのプロパティUIViewではなく、アニメーション化するプロパティを設定する必要があります。UIView

これをテストして確認しました。コードは次のとおりです。

[super viewDidLoad];
offscreenView = [[UIView alloc] initWithFrame:CGRectMake(-100, 0, 200, 200)];
offscreenView.backgroundColor = [UIColor blueColor];
UIButton * btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
//note we put this at 10, 10 *relative to the button's superview*
btn.frame = CGRectMake(10.0, 10.0, 50.0, 25.0);
[btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
[offscreenView addSubview:btn];
[self.view addSubview:offscreenView];
[UIView beginAnimations:@"animateVIew" context:self];
offscreenView.frame = CGRectMake(0.0, 0.0, 200, 200);
[UIView setAnimationDuration:2.0];
[UIView commitAnimations];

お役に立てば幸いです。

于 2009-11-06T03:28:39.020 に答える
1

CALayer には CATransform3D プロパティがあります

[[btn layer] setTransform:CATransform3DMakeTranslation(-100, 0, 0)];

このプロパティに CAAnimation を適用できます

于 2014-04-16T19:21:11.157 に答える