我在拆分视图控制器的主窗格中有一个导航控制器。它在导航栏上设置了色调。当此导航控制器显示在拆分视图的弹出窗口中时,弹出窗口不显示黑色popover样式的导航项,而是布局有点搞砸了,它使用之前设置的色调:
色彩:
alt text http://img6.imageshack.us/img6/2650/tint.png
在popover中显示:
alt text http://img707.imageshack.us/img707/9725/screwedup.png
我尝试处理willPresentViewController等以在弹出框中显示之前清除色调,并在返回时恢复色调。这几乎可以正常工作,但是当转换回横向模式时,标准的iPad色调在动画期间在更改之前可见,并且某些导航项目的色调未正确设置:
在显示弹出窗口之前清除色调:
alt text http://img38.imageshack.us/img38/3237/betterfq.png
但在回来的路上,按钮处于不一致的状态:
alt text http://img802.imageshack.us/img802/1937/inconsistent.png
调用setNeedsDisplay
等不起作用。
当然有一种更简单的方法吗?
编辑:
Apple已经回复,这是一个bug,在bugreport.apple.com上以8276014的形式提交。它应该在4.2中固定(从beta 2开始)。
答案 0 :(得分:0)
我认为您在SDK中发现了一个非常模糊的错误:) - 您应该向Apple提交错误报告
我构建了一个测试应用程序并让它重现您的问题:
这显示布局错误(如上面的屏幕截图所示)
然后我构建另一个并且它绝对没问题:(创建这些应用程序之间的唯一区别是我没有在弹出视图中设置导航项的色调。
我尝试将原始项目中导航项目的色调设置回“默认”以查看发生了什么,并且布局错误仍然存在,因此无论设置色调如何,我都能看到它是不可逆转的。
我会与Apple取得联系:)
萨姆
PS我知道这不是一个真正的答案,但它是我所拥有的最好的 - 我会继续玩它来看看发生了什么:)
好的,我已经玩过了,可以看到发生了什么 - 即使我不是100%肯定我理解它。
我使用git拍摄了我正在工作的第二个项目的快照(在主视图工具栏上有一个色调但在弹出窗口上有一个工作布局)。
然后我通过在弹出窗口的导航栏上设置色调来打破它。
然后,我运行了git diff
,唯一的变化是(在我的MainWindow.xib文件中)
<bool key="IBUIClipsSubviews">YES</bool>
<bool key="IBUIMultipleTouchEnabled">YES</bool>
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
+ <object class="NSColor" key="IBUITintColor">
+ <int key="NSColorSpace">1</int>
+ <bytes key="NSRGB">MSAwLjg4NTI1MDE4NjEgMC42NDExMjQ4OTI1AA</bytes>
+ </object>
</object>
这是添加到我的导航控制器定义的新色调颜色,正在打破布局。
然后我进入界面构建器,将弹出窗口导航栏的样式设置为“默认” - 色调恢复为默认值,当我运行应用程序时,它再次被修复。
果然,当我做了另一个git diff
时,我发现上面添加的行已被删除。
然后我尝试使用这些样式 - 我将样式设置为'Black Opaque'并运行应用程序 - 它很好地工作了。这是因为设置样式不会设置黑色,而是将此行添加到xib:
+ <int key="IBUIBarStyle">1</int>
这告诉我你可以通过
修复它1)在界面构建器中设置样式
2)手动编辑xib文件以删除指定色调的行
3)在你的代码中设置barStyle property(但我不能100%确定这个会有效)
希望这有用,谢谢你的挑战,
萨姆
答案 1 :(得分:0)
我的上一个答案完全是在错误的轨道上!
此代码在旋转到纵向模式后删除色调,并将旋转前的色调设置为横向模式:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
[super willRotateToInterfaceOrientation:orientation duration:duration];
if (orientation == UIInterfaceOrientationLandscapeLeft ||
orientation == UIInterfaceOrientationLandscapeRight) {
[bar setTintColor:[UIColor redColor]];
}
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
if (orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown) {
[bar setTintColor:nil];
}
}
这是在主视图控制器(包含拆分窗格视图的控制器)中,并以横向模式显示横向红色条和正确格式化的黑色条。
你说你已经在willPresentViewController中尝试了它并且它没有用 - 这似乎适用于我将它放在这两种方法中。
答案 2 :(得分:0)
事实证明,这是一个由苹果公司(bugreport.apple.com上的8276014)确认并在iOS 4.2中修复的错误。我从来没有找到任何可接受的解决方法。