3

我想在 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];
}

但是,这个问题仍然存在:

  1. 纵向开始视图
  2. 将视图控制器推入堆栈
  3. 将设备旋转到横向(当前视图做出适当反应)
  4. 弹出最后一个视图控制器:前一个视图反应良好,但 RotatingButtons 的 layoutSubviews 没有被调用,并且按钮保持大于它们应该的大小

因此,当前在弹出视图控制器后,之前的 UIBarButtonItems 没有调用其 layoutSubviews,并且它们仍然太大(或者太小,如果我们从横向开始并在另一个视图中旋转到纵向)。如何解决这个问题呢?

4

2 回答 2

1

这是一个非常棘手的问题。每当视图即将出现时,您应该尝试覆盖viewWillAppear:调用以强制更新布局。[self.view setNeedsLayout]

于 2013-03-22T15:04:06.747 回答
0

我没有找到完全令人满意的解决方案,但我的按钮恰好大小合适,这种解决方案对我来说效果很好:

UIBarButtonItem* b = [[UIBarButtonItem alloc] initWithTitle:@"" style:UIBarButtonItemStylePlain target:target action:selector];
UIImage *barButton = [portraitImage resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
UIImage *barButton_land = [landscapeImage resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
[b setBackgroundImage:barButton forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[b setBackgroundImage:barButton_land forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

然后显然将创建的按钮添加为 rightBarButtonItem/leftBarButtonItem,或者您可能想要使用它。

这样做的问题是,如果您的按钮不够宽,按钮可能看起来完全错误(因为在此解决方案中图像的中间内容是平铺的)。

于 2013-03-25T22:34:47.177 回答