Автоматическое изменение размеров заголовков UITableView на поворот (в основном на iPad)
Я чувствую, что это будет простой ответ, вращающийся вокруг AutoResizingMasks, но я, похоже, не могу обойти эту тему.
У меня есть приложение для iPad, которое показывает 2 UITableViews бок о бок. Когда я поворачиваюсь из "Портрет" в "Пейзаж" и обратно, ячейки в UITableView изменяются без изменений, "на лету", пока происходит поворот. Я использую UITableViewCellStyleSubtitle UITableViewCells (пока не подклассы), и я установил UITableView в IB для привязки к верхнему, левому и нижнему краям (для левой UITableView) и иметь гибкую ширину.
Я поставляю свой собственный объект UIView для
- (UIView *)tableView:(UITableView *)tableView
viewForHeaderInSection:(NSInteger)section
Вот что я до сих пор (называемый методом класса из другого класса):
+ (UIView *)headerForTableView:(UITableView *)tv
{
// The view to return
UIView *headerView = [[UIView alloc]
initWithFrame:CGRectMake(0, 0, [tv frame].size.width, someHeight)];
[headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth |
UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin];
// Other layout logic... doesn't seem to be the culprit
// Return the HeaderView
return headerView;
}
Итак, в любой ориентации все загружается точно так же, как я хочу. После поворота, если я вручную вызову reloadData или дождитесь, пока мое приложение вызовет его, или прокрутите UITableView, заголовочные окна изменят размер и будут отображаться правильно. Я не могу понять, как правильно установить свойство AutoResizeMask, чтобы размер заголовка изменился так же, как и ячейки.
Ответы
Ответ 1
Не очень хорошее исправление. Но работает:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
[mTableView reloadData];
}
Ответ 2
Недавно я столкнулся с той же проблемой. Трюк состоял в том, чтобы использовать пользовательское представление как headerView таблицы. Переопределение layoutSubviews позволило мне контролировать макет по своему усмотрению. Ниже приведен пример.
#import "TableSectionHeader.h"
@implementation TableSectionHeader
- (id)initWithFrame:(CGRect)frame title:(NSString *)title
{
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
// Initialization code
headerLabel = [[UILabel alloc] initWithFrame:frame];
headerLabel.text = title;
headerLabel.textColor = [UIColor blackColor];
headerLabel.font = [UIFont boldSystemFontOfSize:17];
headerLabel.backgroundColor = [UIColor clearColor];
[self addSubview:headerLabel];
}
return self;
}
-(void)dealloc {
[headerLabel release];
[super dealloc];
}
-(void)layoutSubviews {
[super layoutSubviews];
NSInteger xOffset = ((55.0f / 768.0f) * self.bounds.size.width);
if (xOffset > 55.0f) {
xOffset = 55.0f;
}
headerLabel.frame = CGRectMake(xOffset, 15, self.bounds.size.width - xOffset * 2, 20);
}
+(UIView *) tableSectionHeaderWithText:(NSString *) text bounds:(CGRect)bounds {
TableSectionHeader *header = [[[TableSectionHeader alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, 40) title:text] autorelease];
return header;
}
+(CGFloat) tableSectionHeaderHeight {
return 40.0;
}
@end
Ответ 3
Мне бы хотелось получить реальный ответ на этот вопрос, но пока я только что переработал свой UITableView, чтобы мои "заголовки" были всего лишь ячейками внутри таблицы. Изменение размера не имеет таких проблем.
Ответ 4
Я создал подкласс UIView, где я использовал визуальные ограничения, чтобы привязать субвью к сторонам экрана. И вращение прекрасное.
class MLFlexibleView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.addSubview(self.segmentedControl)
self.setUpConstraints()
}
func setUpConstraints() {
let views = ["view" : self.segmentedControl]
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-7-[view]-7-|", options: [], metrics: nil, views: views))
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-15-[view]-15-|", options: [], metrics: nil, views: views))
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
let segmentedControl:UISegmentedControl = {
let segmentedControl = UISegmentedControl(items: ["Searches".localized, "Adverts".localized])
segmentedControl.selectedSegmentIndex = 0
segmentedControl.tintColor = UIColor.white
segmentedControl.translatesAutoresizingMaskIntoConstraints = false
return segmentedControl
}()
}