Popover控制背景颜色奇怪的行为

时间:2014-05-12 18:43:11

标签: ios objective-c ios7 uipopover

所以在我的应用程序中,我有一个带有嵌入式导航控件的弹出控件。在导航堆栈的不同部分,我希望弹出窗口是不同的颜色,具体取决于用户的位置。奇怪的是有时候设置popover背景颜色会使这个看起来很糟糕的盒子,有时它不会。它看起来像这样:

enter image description here

这是我想要的样子:

enter image description here

似乎如果我在显示弹出窗口之前更改了背景颜色,它似乎正常工作并转换,但是如果我在显示之前没有设置弹出窗口颜色,那么在显示它之后更改它盒子效应。我还注意到其他似乎随机发生的情况,但我无法解释导致它的原因(我的真实应用程序比这个演示要复杂得多)。以下是相关代码:

- (IBAction)buttonPressed:(id)sender {
    UIViewController *vc = [[UIViewController alloc] init];
    UIButton *b = [[UIButton alloc] init];
    [b addTarget:self action:@selector(innerButtonPressed) forControlEvents:UIControlEventTouchUpInside];
    [b setTitle:@"Button" forState:UIControlStateNormal];
    [b setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [b setFrame:CGRectMake(0,0,100,100)];
    [vc.view addSubview:b];
    _innerNav = [[UINavigationController alloc] initWithRootViewController:vc];
    _popOver = [[UIPopoverController alloc] initWithContentViewController:_innerNav];

    //If this line is here, everything works fine
    _popOver.backgroundColor = [UIColor yellowColor];

    [_popOver presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];

    //If this line is here (and the above line is commented out), the transition will look wrong
    //_popOver.backgroundColor = [UIColor yellowColor];
}

-(void)innerButtonPressed {
    _controller = [[UIViewController alloc] init];
    UIButton *b = [[UIButton alloc] init];
    [b addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
    [b setTitle:@"Make Purple" forState:UIControlStateNormal];
    [b setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [b setFrame:CGRectMake(0,0,200,200)];
    [_controller.view addSubview:b];
    [_popOver setBackgroundColor:[UIColor orangeColor]];
    [_innerNav pushViewController:_controller animated:YES];
}

-(void)test{
    _popOver.backgroundColor = [UIColor purpleColor];
}

知道造成这个问题的原因是什么吗?什么步骤安全地更新弹出窗口的背景颜色而不进入这种状态?我有一个完整的项目来证明这个问题,我认为你可以将项目附加到问题上,但显然你不能。如果有人想要它,我可能会在某个地方举办它。

2 个答案:

答案 0 :(得分:5)

在查看您的示例项目,Apple的"Popover Controllers in iOS"示例项目,仔细阅读Apple's Documentation,并尝试了一些不同的事情后,我得到了以下观察:

  • UIPopoverController只有在backgroundColor属性没有有效值的情况下才显示出这种奇怪的行为。由此我猜测,由于UIPopoverController的{​​{1}}属性默认为backgroundColor,因此它必须使用与nil属性有效时不同的绘图代码。
  • 触发某种重绘(例如,设置backgroundColor)会使彩色框叠加消失(看起来它会剪切彩色图层)。

结论:目前我会在呈现popoverContentSize之前设置backgroundColor,然后根据需要进行更新。如果这不是一个选项,请尝试更新UIPopoverController,使其重绘(作为注释:我无法让它看起来很好看,而且看起来很糟糕)。最后,我会report it as a bug去苹果。

我希望这会有所帮助。

答案 1 :(得分:1)

UIPopoverController现已弃用。我在更新它时使用新的 popoverPresentationController 时发现了类似的问题。在过去,我能够在呈现之前设置UIPopoverController的'~ Create a FileSystemObject Set objFSO=CreateObject("Scripting.FileSystemObject") '~ Provide file path outFile="YouFolderPath\Results.txt" '~ Setting up file to write Set objFile = objFSO.CreateTextFile(outFile,True) strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colFiles = objWMIService.ExecQuery _ ("Select * from CIM_DataFile Where Extension = 'mdb' OR Extension = 'ldb'") For Each obj_File in colFiles 'Wscript.Echo objFile.Name 'Commented out '~ Write to file objFile.WriteLine obj_File.Name Next '~ Close the file objFile.Close 。弹出窗口控制器也有一个backgroundColor属性,但是在演示之前我可以像之前那样工作。为了让它工作,我必须在它出于某种原因开始呈现后分配它:

backgroundColor

对于您在演示文稿完成后更改背景颜色的特定场景,我不认为您只需更改popoverPresentationController的backgroundColor即可。我能想到的唯一解决方案是在没有动画的情况下解散并重新呈现弹出窗口:

contentViewController.modalPresentationStyle = UIModalPresentationPopover;
[[self presentViewController:contentViewController animated:YES completion:^{
    // completion code
}];
contentViewController.popoverPresentationController.backgroundColor = [UIColor orangeColor];