6

我在我的应用程序中使用新的(在 iOS 7 中) UIPopoverController.backgroundColor 设置来根据需要更改弹出框的颜色,但我发现使用此设置会导致每当我打开我的popovers - 在大约半秒内,它会从默认的半透明白色开始,然后逐渐变为我选择的颜色。这是不希望的;它应该只是我打开它时设置的颜色。

该文档指出:

使用此属性自定义弹出框的背景颜色。在弹出框可见时更改此属性的值会触发到新颜色的动画转换。该属性的默认值为 nil,对应于默认的背景颜色。

但是,即使我在我的应用程序打开时设置它并且不再设置它,它仍然会在我每次打开任何弹出窗口时闪烁。

我对使用 UIPopoverBackgroundView 持开放态度,但我不确定它是否允许我即时更改背景颜色,因为它似乎是一个静态解决方案,仅用于更改应用程序中所有弹出框的样式。在此先感谢您的任何建议。

编辑(代码):

当我的主视图控制器加载并准备 UI 的其余部分时(这是许多弹出框初始化之一):

fileOptionsController = [[FileOptionsViewController alloc] initWithNibName:@"FileOptionsViewController" bundle:nil];
fileOptionsController.delegate = self;

self.fileOptionsPopoverController = [[UIPopoverController alloc] initWithContentViewController:fileOptionsController];
[popoverControllers addObject:self.fileOptionsPopoverController];

初始化弹出框后,我正在运行它(仍在主初始化代码中),目的是在设置 backgroundColor 和交互之间有很长的延迟进行测试(注意:更改 alpha 没有效果,设置为 1 时仍然会发生):

for (UIPopoverController *po in popoverControllers) {
    [po setBackgroundColor:[UIColor colorWithWhite:0.3f alpha:0.90f]];
}

然后,当用户点击按钮以显示弹出框时调用它:

- (void)showPopover:(UIPopoverController *)popover from:(UIButton *)btn {
    [popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}

很直接。这些是唯一可以访问此弹出框或任何弹出框的相关位置,除非它已经显示在何处将其关闭。

4

3 回答 3

2

我解决了这个问题,在更改 backgroundColor 之前解除了弹出框,然后再次显示它:

[popover dismissPopoverAnimated:NO];

if ([popover respondsToSelector:@selector(backgroundColor)]) {
    popover.backgroundColor = [UIColor someColor];         
}

[popover setContentViewController:viewController animated:NO];
[popover setPopoverContentSize:CGSizeMake(320.0f, 480.0f) animated:NO];

[popover presentPopoverFromRect:popoverRect
                         inView:self.view
       permittedArrowDirections:UIPopoverArrowDirectionRight
                       animated:NO];

这样做会再次显示弹出框,您不会看到任何不需要的过渡效果。

于 2014-02-08T09:54:06.723 回答
1

由于文档说它backgroundColor将为您的颜色设置动画,因此这似乎是导致此闪光/动画的原因(Apple 应该给 setBackgroundColor 带/不带动画)。

如果您有能力在没有动画的情况下呈现弹出框,我建议您可以在呈现时尝试关闭动画。就像这两个之一 -

选项 1 -

// last parameter as 'NO'
[popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:NO]; // Don't animate to present

选项2 - (使用setAnimationsEnabled方法UIView暂时关闭动画)

- (void)showPopover:(UIPopoverController *)popover from:(UIButton *)btn {
    [UIView setAnimationsEnabled:NO];   // Turn off animation

    [popover presentPopoverFromRect:CGRectMake(btn.frame.origin.x + 5.0f, btn.frame.origin.y - 1.0f, btn.frame.size.width, btn.frame.size.height) inView:btn.superview permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

    [UIView setAnimationsEnabled:YES];   // Turn back on
}

从逻辑上讲,这应该可以工作,除非 Apple 在其 sdk 中进一步破解此属性。

于 2013-11-15T22:59:16.060 回答
0

如果您添加代码会更好......没有代码我只能说如果您在视图出现后设置颜色,那么它将动画到该颜色。因此,首先更改背景颜色,然后使弹出框可见。

于 2013-09-22T18:13:57.933 回答