gpt4 book ai didi

ios - 在模态页面表上呈现模态表单

转载 作者:可可西里 更新时间:2023-11-01 05:57:34 38 4
gpt4 key购买 nike

在 iPad 上,我使用 modalPresentationStyle UIModalPresentationPageSheet 显示模态视图 Controller 。此 View Controller 使用 modalPresentationStyle UIModalPresentationFormSheet 呈现另一个模态视图 Controller 。

因此,用户看到背景 View Controller 、页面表和表单表都在彼此的顶部,因为表单表小于页面表。页表的呈现让背景变暗,因此无法与之交互。不过,表单不会在 iOS 5 上使页面表变暗,因此用户仍然可以与下面的页面表进行交互。但我也希望页面表变暗,以便用户在再次与页面表交互之前必须关闭模态表单。

在 iOS 4 上,这是默认行为,但在 iOS 5 上,我找不到实现此目的的方法。你有什么建议吗?

最佳答案

我认为这是 iOS5 中的错误。我做了一些从其他模态呈现模态视图 Controller 的实验,似乎第二个模态从不使下面的屏幕变暗。我什至设置了一个测试项目,允许您从彼此启动无尽的模态,并且似乎每个其他模态都没有像预期的那样变暗或阻止触摸。

UIWindow subview 上的快速 NSLog 向我们展示了虽然正确添加了阴影,但 dimmingView 却没有。我正在研究一种方法来展示我自己的调光 View 。找到方法后会更新此答案。

Window Subviews: (
"<UILayoutContainerView: 0xf63e3c0; frame = (0 0; 768 1024); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0xf645640>>",
"<UIDimmingView: 0xf683990; frame = (0 0; 768 1024); opaque = NO; layer = <CALayer: 0xf6836d0>>",
"<UIDropShadowView: 0xf683130; frame = (64 64; 640 896); transform = [0, 1, -1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0xf6831c0>>",
"<UIDropShadowView: 0x292110; frame = (74 242; 620 540); transform = [0, 1, -1, 0, 0, 0]; autoresize = LM+RM+TM+BM; layer = <CALayer: 0x292150>>"
)

解决方案二:所以在我最终的动画外观解决方案中。 我还开始考虑我的第一个解决方案及其技术上的可能性,因为 UIDimmingView 没有记录并且我们“触摸它”,这会激怒 Apple 并导致拒绝。我添加了一个背景颜色为 alpha 的 UIView我们想要我的 viewController。然后我在呈现模态时对其进行动画处理,并在调用第二个模态的委托(delegate)时反转动画。对我来说看起来不错。可能会进行一些时间和 alpha 调整以使其恰到好处,但它可以正常工作并且看起来不错。

- (void)viewDidLoad 
{
dim = [[UIView alloc] init];
[dim setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.35]];
[dim setAlpha:0.0];
[dim setUserInteractionEnabled:NO];
[self.view addSubview:dim];
}

- (void)presentModal
{
[self.view bringSubviewToFront:dim];
[dim setFrame:self.view.frame];
[UIView animateWithDuration:0.25 animations:^{
[dim setAlpha:1.0];
}];
}

- (void)modalDelegateFinished
{
[UIView animateWithDuration:0.25 animations:^{
[dim setAlpha:0.0];
}];
}

解决方案一:

好吧,这可行,但它不像我想要的那样具有动画效果。然而,它确实重用了已经存在的东西,所以这可能是一个优势。

- (void)viewDidAppear:(BOOL)animated
{
// Add a gesture to dismiss the view if tapped outside.
UIGesture *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tappedOutsideView:)];
[gesture setNumberOfTapsRequired:1];
[gesture setCancelsTouchesInView:NO];
[self.view.window addGestureRecognizer:gesture];

// Move the dimmingview to just below the dropshadow.
UIView *dim = [self.view.window.subviews objectAtIndex:1];
[self.view.window insertSubview:dim atIndex:2];
}

- (void)tappedOutsideView:(UITapGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateEnded) {
CGPoint location = [sender locationInView:nil];

if (![self.view pointInside:[self.view convertPoint:location fromView:self.view.window] withEvent:nil]) {
// remove the gesture on the window
[self.view.window removeGestureRecognizer:sender];

// Move the dimmingview back where it belongs
UIView *dim = [self.view.window.subviews objectAtIndex:2];
[self.view.window insertSubview:dim atIndex:1];
}
}
}

此外,作为故障保险,在 viewDidDisappear 中处理相同的内容可能是个好主意。我的完成按钮调用 tappedOutside View ,所以我知道手势和 dimmingView 总是正确的。但如果您不那样做,您可以将它放在 viewDidDisappear 中。

- (void)viewDidDisappear:(BOOL)animated
{
// remove the gesture on the window
for (UIGestureRecognizer *gesture in self.view.window.gestureRecognizers) {
[self.view.window removeGestureRecognizer:gesture];
}

// Move the dimmingview back where it belongs
UIView *dim = [self.view.window.subviews objectAtIndex:2];
[self.view.window insertSubview:dim atIndex:1];
}

关于ios - 在模态页面表上呈现模态表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10104706/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com