blob: 7d884d88b2800721da6444c6e76e62dc51f5bafd [file] [log] [blame] [edit]
// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <CoreGraphics/CoreGraphics.h>
#import "MDCHeaderStackView.h"
@implementation MDCHeaderStackView
- (CGSize)sizeThatFits:(CGSize)size {
CGFloat height = [_topBar sizeThatFits:size].height;
if (_bottomBar) {
height += [_bottomBar sizeThatFits:size].height;
}
size.height = height;
return size;
}
- (void)layoutSubviews {
[super layoutSubviews];
CGSize boundsSize = self.bounds.size;
CGSize bottomBarSize = [_bottomBar sizeThatFits:boundsSize];
CGFloat remainingHeight = boundsSize.height - bottomBarSize.height;
CGSize topBarSize = [_topBar sizeThatFits:CGSizeMake(boundsSize.width, remainingHeight)];
remainingHeight -= topBarSize.height;
CGRect topBarFrame = CGRectMake(0, 0, topBarSize.width, topBarSize.height);
CGRect bottomBarFrame = CGRectMake(0, 0, bottomBarSize.width, bottomBarSize.height);
if (remainingHeight > 0) {
// Expand the top bar to fill the remaining height.
topBarFrame.size.height += remainingHeight;
} else if (remainingHeight < 0) {
// Negative value causes the top bar to slide up and away.
topBarFrame.origin.y += remainingHeight;
}
bottomBarFrame.origin.y = CGRectGetMaxY(topBarFrame);
_topBar.frame = topBarFrame;
_bottomBar.frame = bottomBarFrame;
}
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];
if (self.traitCollectionDidChangeBlock) {
self.traitCollectionDidChangeBlock(self, previousTraitCollection);
}
}
#pragma mark - Public
- (void)setTopBar:(UIView *)topBar {
if (_topBar == topBar) {
return;
}
[_topBar removeFromSuperview];
_topBar = topBar;
[self addSubview:_topBar];
[self setNeedsLayout];
}
- (void)setBottomBar:(UIView *)bottomBar {
if (_bottomBar == bottomBar) {
return;
}
[_bottomBar removeFromSuperview];
_bottomBar = bottomBar;
[self addSubview:_bottomBar];
[self setNeedsLayout];
}
@end