2

私がやろうとしているのは、さまざまな場所に配置されたボタンとコントロールを備えた、より大きなUIViewに「ナビゲート」することです。メインのUIViewのサイズを通常の2倍にしました。320x480ではなく640x480です。

画面の最初の部分にあるボタンをクリックした後、x方向に-320pxの移動変換を行い、他の機能がユーザーに表示される画面の2番目の「非表示」部分を表示しました。UIViewを元の位置に戻すことができないという事実を除けば、すべてが完璧に機能します。元の位置に戻すために使用する、320pxの「境界外」にあるボタンが機能しないようです。

私のUIViewは「introScreen」として参照され、以下は画面をx方向に変換するために呼び出す関数です。

- (void)secondPartOfTheScreen {

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.15];
        introScreen.transform = CGAffineTransformMakeTranslation(-320, 0);
        [UIView commitAnimations];

}

この関数を呼び出すと、UIViewは正しく移動しますが、画面のこの部分にボタンが表示されても、ユーザーの操作は行われません。画面の最初の部分でそのボタンを動かすと、正しく機能します。それは画面の境界と関係がありますか?それを解決することは可能ですか?

前もって感謝します!

4

3 に答える 3

6

のサブクラス化を試み、UIViewそのメソッドをオーバーライドしてpointInside:withEvent:、境界の外側のポイントもビューに属していると認識されるようにする必要があります。そうしないと、ビューの境界外でのユーザー操作が希望どおりに処理される可能性がありません。

これは、イベント処理ガイドの内容です。

ヒットテストでは、ウィンドウはビュー階層の最上位のビューでhitTest:withEvent:を呼び出します。このメソッドは、YESを返すビュー階層内の各ビューでpointInside:withEvent:を再帰的に呼び出し、タッチが行われた境界内のサブビューが見つかるまで階層を下に進みます。そのビューがヒットテストビューになります。

あなたはあなたの習慣でこのようなものを使うことができますUIView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView* view in self.subviews) {
      if (view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
        return YES;
      }
    }
    return NO;
}

あなたはこれで行うことができます:

@interface MyView: UIView
@end

@implementation MyView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView* view in self.subviews) {
      if (view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) {
        return YES;
      }
    }
    return NO;
}
@end

.mこのクラス定義を、ビューを使用しているファイルの先頭に追加します。(個別の.h / .mファイルを使用することもできますが、すべてが機能するかどうかをテストするには、それで十分です)。次に、現在のインスタンス化でにUIView置き換えれば、機能するはずです。MyViewUIView

于 2013-01-04T18:20:08.200 に答える
0

変換プロパティを適切に使用していない場合は、次のようにプロパティの以前の値を考慮する必要があります。

introScreen.transform = CGAffineTransformConcat(introScreen.transform, CGAffineTransformMakeTranslation(-320, 0));

これがお役に立てば幸いです。詳細については、 AppleのUIViewドキュメントCGAffineTransformドキュメントを確認してください。

于 2013-01-04T18:04:48.887 に答える
0

2つのこと。

まず、単にオブジェクトを移動しているときに変換を使用するのはなぜですか。フレームも簡単にセットできます。

CGRect frame = introScreen.frame;
frame.origin.x -= 320;
introScreen.frame = frame;

(はい、これはアニメーション内で機能します)

次に、ビューを翻訳する場合、最初に表示するサイズに関係なく、そのコンテンツはその境界内にある必要があります。

したがって、コンテナー ビュー (ボタンのあるビュー) は、含まれるすべてのピースがその境界内に収まるようなサイズにする必要があります。その範囲外のものは機能しません。メイン ビューのサイズを 2 倍にすることは、含まれるビューのサイズを 2 倍にすることほど有用ではありません。

このように考えてください。

あなたのテーブルは、あなたが見ているものを何でも保持できるはずです. 表示したい地図がある場合は、テーブル上でスライドさせます。テーブルはマップほど大きくする必要はありませんが、マップはすべてのコンテンツを表示するのに十分な大きさである必要があります。極を表示するにはマップが短すぎると言われ、情報が表示されない場合。いくら地図を変形しても、北極も南極も使えません。

アプリがこれを確実に反映するようにするには、問題のすべてのビューでクリップ サブビューをオンにします。境界の外側にある場合は表示されません。

于 2013-01-04T18:42:07.160 に答える