您可以通过操作横幅视图的框架属性及其在横幅视图层次结构中的兄弟姐妹来获得结果。所有这些都可以包含在横幅视图对象中。该frame
属性是可动画的。
将 BannerView 作为 UIView 的子类。添加一些方法到它的 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;
}
每当您展开或折叠横幅视图时,它都可以使用迭代表单遍历其兄弟视图
for (UIView* view in self.superview.subviews) {}
通过设置它们各自的frame
属性相应地向上或向下移动它们。要升高和降低框架,请增加或减少横幅视图的高度...</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;
}];
}
…以及在两种状态之间移动的切换方法
- (void) toggle {
if (CGRectEqualToRect(self.frame, self.collapsedFrame))
[self expand];
else [self collapseBanner];
}