我想在 UINavigationController 的 UIToolbar 中显示完全自定义的按钮,并支持纵向和横向。目前,我已经实现了一个 RotatingButton(一个 UIView 子类)类,它包含一个填充整个 RotatingButton 框架的 UIButton。RotatingButton 还包含两个图像,用于纵向和横向,并且这些图像的高度不同。然后这个 RotatingButton 被包装到 UIBarButtonItem 作为自定义视图。
目前,在 RotatingButton 的 layoutSubviews 中,我正在设置整个视图的边界,并将按钮设置为当前方向的适当图像。这很好用,可以根据需要处理旋转。
- (void) createLayout {
[self addButtonIfNeeded];
UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
if(UIInterfaceOrientationIsLandscape(currentOrientation)) {
[self.button setImage:self.landscapeImage forState:UIControlStateNormal];
self.button.frame = CGRectMake(0.0, 0.0, self.landscapeImage.size.width / 2, self.landscapeImage.size.height / 2);
self.bounds = CGRectMake(0.0, 0.0, self.landscapeImage.size.width / 2, self.landscapeImage.size.height / 2);
} else {
[self.button setImage:self.portraitImage forState:UIControlStateNormal];
self.button.frame = CGRectMake(0.0, 0.0, self.portraitImage.size.width / 2, self.portraitImage.size.height / 2);
self.bounds = CGRectMake(0.0, 0.0, self.portraitImage.size.width / 2, self.portraitImage.size.height / 2);
}
}
- (void) layoutSubviews {
[super layoutSubviews];
[self createLayout];
}
但是,这个问题仍然存在:
- 纵向开始视图
- 将视图控制器推入堆栈
- 将设备旋转到横向(当前视图做出适当反应)
- 弹出最后一个视图控制器:前一个视图反应良好,但 RotatingButtons 的 layoutSubviews 没有被调用,并且按钮保持大于它们应该的大小。
因此,当前在弹出视图控制器后,之前的 UIBarButtonItems 没有调用其 layoutSubviews,并且它们仍然太大(或者太小,如果我们从横向开始并在另一个视图中旋转到纵向)。如何解决这个问题呢?