【问题标题】:View reloads incorrectly after rotation旋转后视图重新加载不正确
【发布时间】:2013-04-25 15:50:16
【问题描述】:

我在重新加载表格单元格内的自定义 UIView (SBBarChart) 时遇到问题。我不使用自动布局,因为它很难调整单元格的所有组件(可能存在或不存在)。我每次都手动计算矩形并且有效。

关于旋转,我尝试在表格视图控制器中实现 willRotateToInterfaceOrientation 方法,内部带有 [self.tableView reloadData]。这会在旋转后再次生成单元格。很好。

在单元格类中,我调用[self.barChart setNeedsDisplay] 以确保重新加载图表的子视图,这很有效。

现在的问题。最初,纵向视图打开并正确加载。当我旋转到横向时,它也可以。当我旋转回纵向时,条的长度计算正确,但仍显示为横向。因此,条形的新矩形具有正确的度量,但条形显示太长并且部分位于屏幕之外。

具有相同尺寸的框架标签正确显示(并居中),因此应该是条形视图重新加载的问题。

我做错了什么?

【问题讨论】:

    标签: iphone ios objective-c landscape-portrait screen-rotation


    【解决方案1】:

    尝试检查[[UIApplication sharedApplication] statusBarOrientation]

    在重新加载您的 tableview 时,然后进行相应的调整。这将给出当前的旋转状态。

    【讨论】:

    • 谢谢你的回答,但我想要的是用条形图填充屏幕的宽度。所以图表的代码是self.barChart.frame = CGRectMake(20, self.barChart.frame.origin.y, self.frame.size.width - 60, self.barChart.frame.size.height);。计算工作正常,但矩形仍然太长。我试过[self.barChart setNeedsDisplayInRect:self.barChart.frame]; 没有帮助。对于标签,我使用self.myLabel.frame = CGRectMake(self.barChart.frame.origin.x, self.barChart.frame.origin.y, self.barChart.frame.size.width, self.barChart.frame.size.height);,这样就可以了。
    【解决方案2】:

    我刚刚解决了我的问题。我在我的代码中发现了三个主要错误。

    1) 我在从单元格中删除控件后使用dequeueReusableCellWithIdentifier。这导致缺少控件和奇怪的行为。现在我每次从笔尖生成一个新单元格。

    2) 我正在使用已从单元格中删除的控件的 xy 值。我只是把数值代替。

    3) 我使用frame 来确定屏幕的宽度。但是,框架不会改变。为了解决这个问题,我使用了以下线程:How to get orientation-dependent height and width of the screen?

    现在,我什至不需要[self.barChart setNeedsDisplay] 行,我可以随意旋转设备,控件不再移动。 :)

    我仍然不确定是否必须调用reloadData 来调整布局,但我还没有找到更好的解决方案。

    所以,终于成功了!非常感谢您的帮助,我希望这篇文章对其他人有所帮助。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多