3

こんにちは私のアプリでは、下の写真のように、いくつかのuiButtonをサブビューとしてビューに追加しています。 代替テキストhttp://img99.imageshack.us/img99/5244/portraitc.png

ユーザーが横向きで電話を回転させると、ビューとボタンの位置を次のように変更する必要があります: alt text http://img193.imageshack.us/img193/5931/landscapeq.png

最初にビューがポートレートモードの場合、ボタンはタッチに反応します。電話を傾けるとボタンが動き、2番目の画像のようにすべてが正常に見え、ボタンはタッチに反応します。電話をポートレートモードに戻すと、ボタンは元に戻りますが、タッチに反応しません。横向きに戻すと、ボタンが機能します...

私のボタンは次のように作成されています。

nextNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25)];
[nextNewsP setImage:[UIImage newImageFromResource:@"next_arrow.png"] forState:UIControlStateNormal];
[nextNewsP addTarget:self action:@selector(nextNewsAction:) forControlEvents:UIControlEventTouchUpInside];
[nextNewsP setShowsTouchWhenHighlighted:TRUE];
[bottomTools addSubview:nextNewsP];
[nextNewsP release];

previousNewsP = [[UIButton alloc] initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25)];
[previousNewsP setImage:[UIImage newImageFromResource:@"previous_arrow.png"] forState:UIControlStateNormal];
[previousNewsP addTarget:self action:@selector(previousNewsAction:) forControlEvents:UIControlEventTouchUpInside];
[previousNewsP setShowsTouchWhenHighlighted:TRUE];
[bottomTools addSubview:previousNewsP];
[previousNewsP release];

bottomToolsはビューであり、次のようなサブビューとしても追加されます。

[self.view addSubview:bottomTools];
[bottomTools release];

そして、shouldAutorotateToInterfaceOrientation関数は次のようになります。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {


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


    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        NSLog(@"set frames for portrait");
        closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 30, 2, 23, 25);
        newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.width - 10, 22);
        internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 55, 5, 18, 18);
        industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22);
        bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height-40, [[UIScreen mainScreen] bounds].size.width, 40);
        nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 40, 10, 25, 25);
        previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.width - 85, 10, 25, 25);
    }
    else
    {
        NSLog(@"set frames for landscape");
        closeView.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 30, 2, 23, 25);
        newsInfo.frame = CGRectMake(10, 10, [[UIScreen mainScreen] bounds].size.height - 10, 22);
        internetActivityIndicator.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 55, 5, 18, 18);
        industryLabel.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height/2.0 - [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width/2, 3, [industryTitle sizeWithFont:[UIFont systemFontOfSize:14]].width, 22);
        bottomTools.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.width-40, [[UIScreen mainScreen] bounds].size.height, 40);
        nextNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 40, 10, 25, 25);
        previousNewsP.frame = CGRectMake([[UIScreen mainScreen] bounds].size.height - 85, 10, 25, 25);
    }

    [UIView commitAnimations];

return YES;

}

同様の問題が発生したことはありますか?よろしくお願いします、ソリン

4

3 に答える 3

1

私は実際にはまだ同じ問題に苦しんでいます(1年後... iOS 3.0との互換性が必要です)。回転部分は簡単でした。ただし、ビューとボタンはタッチイベントと移動/ドラッグイベントを処理していないようです。ウィンドウ(UIWindow)がタッチイベントを適切な場所で受信していることを確認しました。

これは、画面の最後の1/3(つまり、480-320)が、縦向きから横向きに回転した後、受信者にイベントを伝播しないかのようです。

回転したViewControllerにはレスポンダーがないため、slfによるリンクの例は役に立ちません。


いくつかのビューを掘った後、私はちょうどそれを理解しました。そのため、viewController.viewを回転させ、viewController.viewのサブビューで一連のsetNeedsLayoutを実行していました。しかし、私がする必要があるのは[self.navigationController.viewsetNeedsLayout]でした。その1回の呼び出しで、すべてが修正されました。何らかの理由で、navigationController.viewは、以前に非表示にされていたサブビューの一部にタッチイベントを渡していませんでした(フレーム/バウンドに関する限り)。これにより、他の多くの問題も実際に修正されました。

于 2010-10-06T17:36:23.313 に答える
0

あなたの問題はあなたのフレーム調整にあると思います。shouldAutorotateToInterfaceOrientation私の腸は、回転が実際に行われる前に発生するため、内部にあるロジックと関係があると言っています。この記事で彼らがするようにあなたの数学をやってみて、それが役立つかどうか確かめてください。

于 2009-08-19T15:10:03.980 に答える
0

私が抱えていた問題を修正しました..基本的に行う必要があり[self.navigationController.view setNeedsLayout]ました。

私がこれを理解する方法(おそらく間違っているのは、self.navigationController.view.frame同じでself.view.frameあり、両方が(x = 0、y = 0、width = 320、height = 480)に等しいことです)次に、回転self.viewしてM_PI/2、選択時にいくつかのフレーム操作を行いましたself.view.subviewsを使用して、すべてを正しくアニメーション化/配置/スケーリングします。

それは問題なく機能しましたが、ナビゲーションコントローラーは320の右側にあるself.viewの一部へのタッチイベントを認識しませんでした。本質的に、これself.navigationController.view.clipsToBoundsが真実である場合、self.viewのその部分を表示していなかった可能性があります。

とにかく、ナビゲーションコントローラーのビューでsetNeedsLayoutを設定すると、問題が解決しました。これが他の誰かに役立つことを願っています。それは、SorinAがボタンにタッチイベントが発生しないという問題でもあったと思います。

于 2010-10-06T21:15:50.717 に答える