バナー ビューのフレーム プロパティと、バナーのビュー階層内の兄弟のフレーム プロパティを操作することで、結果を取得できます。これらはすべて、バナー ビュー オブジェクト内に含めることができます。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];
}