2

ここで説明されているような、展開/折りたたみアニメーションを持つカスタムビューバナーがありますiphone: expand and collapse a UIView a programmatically

そのビューを既存のView Controllerに統合するときに、既存のビューをプッシュダウンするために拡張するときに、私が望むこと。今はただの重なりです。

iOSでそれを達成するにはどうすればよいですか? Android では Visibility.Gone を使用して実行しましたが、ここではそのようなものを見つけることができませんでした。バナーはメイン ビューの直接の子である任意のビュー階層に配置できますが、展開時にすべてのビューを下に移動して、展開時にすべてを押し下げる効果が必要です。

ここでは、Visibility.Gone Android を使用した Android アプローチのリンク: アニメーションの展開/折りたたみ

4

1 に答える 1

4

バナー ビューのフレーム プロパティと、バナーのビュー階層内の兄弟のフレーム プロパティを操作することで、結果を取得できます。これらはすべて、バナー ビュー オブジェクト内に含めることができます。frameプロパティはアニメート可能です。

UIView のサブクラスとして BannerView を作成します。public にいくつかのメソッドを追加します@interface

    - (void) collapse;
    - (void) expand;
    - (void) toggle;

バナーの展開されたフレームと折りたたまれたフレームには、いくつかのプロパティが必要です。

@property (nonatomic, assign) CGRect expandedFrame;
@property (nonatomic, assign) CGRect collapsedFrame;

これらは、(パブリック) @interface または (プライベート) カテゴリ拡張に入れることができます。BannerView の初期化中に設定します。

    //initialising in code
    - (id)initWithFrame:(CGRect)frame{
        if (self = [super initWithFrame:frame]) {
            [self initialiseFrames:frame];
        }
        return self;
    }

    //initialising from XIB/Storyboard
    - (void)awakeFromNib {
        [self initialiseFrames:self.frame];
    }

    - (void)initialiseFrames:(CGRect)frame {
        self.expandedFrame = frame;
        frame.size.height = 0;
        self.collapsedFrame = frame;
    }

bannerView を展開または折りたたむときはいつでも、反復フォームを使用して兄弟ビューを反復処理できます

for (UIView* view in self.superview.subviews) {}

frameそれぞれのプロパティを設定して、それに応じて上下に移動します。フレームを上げ下げするには、bannerView の高さを加算または減算します…</p>

- (CGRect)lowerFrame:(CGRect)frame {
    frame.origin.y += CGRectGetHeight(self.expandedFrame);
    return frame;
}

- (CGRect)raiseFrame:(CGRect)frame {
    frame.origin.y -= CGRectGetHeight(self.expandedFrame);
    return frame;
}

これらのピースをまとめると、フレームを設定することで兄弟ビューを正しい位置に移動し、フレームを設定することでバナー ビューを折りたたんだり展開したりするアニメーション メソッドを折りたたんだり展開したりできます。

- (void) collapse {
    if (CGRectEqualToRect(self.frame, self.collapsedFrame)) return;
    [UIView animateWithDuration:0.5 animations:^{
        for (UIView* view in self.superview.subviews) {
            if (CGRectGetMinY(view.frame) > CGRectGetMaxY(self.frame))
                view.frame = [self raiseFrame:view.frame];
        }
        self.frame = self.collapsedFrame;
    }];

}

- (void) expand {
    if (CGRectEqualToRect(self.frame, self.expandedFrame)) return;
    [UIView animateWithDuration:0.5 animations:^{
        for (UIView* view in self.superview.subviews) {
            if (CGRectGetMinY(view.frame) > CGRectGetMaxY(self.frame))
                view.frame = [self lowerFrame:view.frame];
        }
        self.frame = self.expandedFrame;
    }];

}

…そして、2 つの状態間を移動するトグル メソッド

- (void) toggle {
    if (CGRectEqualToRect(self.frame, self.collapsedFrame))
        [self expand];
    else [self collapseBanner];
}
于 2013-08-25T19:23:30.060 に答える