繁体   English   中英

透明的ViewController

[英]Transparent ViewController

我正在推动一个UIViewController

[otherController presentViewController: newController animated: NO completion: nil];

然后newController的nib具有基本视图,较小的视图和文本字段以及较小视图中的一些按钮。 我希望基本视图是透明的灰色,所以我可以看到它下面的视图控制器的视图,同时使用户明白其他视图被禁用。

我已经尝试将Alpha值设置为低(对其他控件进行alpha-ed),将视图背景设置为透明黑色,并取消设置Opaque标志。 这些都不起作用。 我只是得到一个不透明的浅灰色背景。

这是我的视图控制器:

@interface MyEditQueryViewController : UIViewController

@property (nonatomic, strong) id<MyEditQueryDelegate> delegate;
@property (nonatomic, strong) IBOutlet UITextField* textField;
@property (nonatomic, strong) IBOutlet UIView* editView;
@property (nonatomic, strong) IBOutlet UIButton* cancelButton;
@property (nonatomic, strong) IBOutlet UIButton* saveButton;
@property (nonatomic, strong) NSString* defaultText;
@property (nonatomic) CGFloat verticalOffset;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;
- (id)initWithDefaultText:(NSString*)defaultText orign:(CGPoint)origin;

- (IBAction)cancelTapped:(id)sender;
- (IBAction)saveTapped:(id)sender;
@end

有没有办法让这个视图半透明?

iPhone ,实现此目的的唯一方法(在UIAlertViewUIActionSheet )是通过在UIViewController上呈现UIView作为子视图,该子视图将用作背景视图。 您呈现的UIView可以占据整个屏幕并使用透明/半透明视图来获取其大部分视图以实现调光效果。


iPad ,除了UIAlertViewUIActionSheet ,您还可以模态显示非全屏视图。 它们有自己的视图控制器。 为此,您需要将UIModalPresentationStyle设置为以下之一:

  • UIModalPresentationPageSheet

  • UIModalPresentationFormSheet

但是,这些选项对我们如何调整它们的大小以及放置它们的位置都有一点限制(在我看来),所以如果你想要完全自定义,你必须按照我解释的那样做iPhone,通过在UIViewController上呈现一个单独的UIView作为背景视图。


除了iPad的UIModalPresentationPageSheetUIModalPresentationFormSheet选项之外,为视图控制器设置透明/半透明背景将假设在最后面的图层后面可以设置颜色的白色背景。


还应该注意的是, UIAlertViewUIActionSheet旨在(由Apple)按原样使用,不应该是子类,而你可以将UIView子类化为你想要的任何你想要的东西。

使用自定义RootViewController管理自己的容器视图时,这种事情很简单。 然后,根视图控制器可以定义自己的导航系统或委托给标准的UIKit组件。

这还有一个优点,就是能够使用特定域的语言 - 在Root VC界面中为您的特定应用程序建模的方法名称 - 例如[rootViewController presentMenuItem:menuItem]。

我有使用根视图控制器的应用程序的一个例子在这里

这是另一个代码片段(来自另一个应用程序),它呈现了一个半透明背景的叠加层:

- (void)presentOverlayViewController:(UIViewController*)viewController
{
    LogDebug(@"Presenting overlay view controller: %@", viewController);
    if (_overlayViewController)
    {
        [self dismissOverlayViewController];
    }

    [self.view setUserInteractionEnabled:NO];
    [self.view bringSubviewToFront:_tintView];
    [_tintView setAlpha:0.0];
    [self.view bringSubviewToFront:_overlayViewContainer];
    _overlayViewController = viewController;

    CGSize screenSize = [[UIScreen mainScreen] currentSize];

    [viewController willMoveToParentViewController:self];
    [_overlayViewContainer addSubview:viewController.view];
    [_overlayViewController.view setPosition:(CGPoint) {(screenSize.width / 2) - (_overlayViewController.view.frame.size.width / 2),
            (screenSize.height / 2) - (_overlayViewController.view.frame.size.height / 2)}];

    __weak UIView* overlayViewContainer = _overlayViewContainer;
    __weak UIView* view = self.view;
    __weak UIView* tintView = _tintView;
    [UIView transitionWithView:self.view duration:0.60 options:UIViewAnimationOptionCurveEaseInOut animations:^
    {
        [tintView setAlpha:0.7];
        CGRect newFrame = overlayViewContainer.frame;
        newFrame.origin.y -= screenSize.height;
        [overlayViewContainer setUserInteractionEnabled:YES];
        overlayViewContainer.frame = newFrame;
    } completion:^(BOOL complete)
    {
        [viewController didMoveToParentViewController:self];
        [view setUserInteractionEnabled:YES];
    }];
}

这种方法可以在iOS或iPad上运行,实际上可以写在两者上。

编辑:

如果您没有将自定义根视图控制器设置为UIWindow上的rootVC,您仍然可以通过在将呈现半透明叠加层的VC上添加相同的方法来实现此目的。

EDIT2:

请注意添加:

 [viewController willMoveToParentViewController:self];
 [viewController didMoveToParentViewController:self];

正如Jesse Rusak所指出的,这是必需的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM