透明的ViewController

时间:2013-12-21 01:30:59

标签: ios uiviewcontroller

我正在用

推送一个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

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

2 个答案:

答案 0 :(得分:1)

iPhone上,实现此目的的唯一方法(在UIAlertViewUIActionSheet之外)是在UIView上提供UIViewController作为子视图这将作为背景视图。您出现的UIView可以占据整个屏幕,并在其大部分视图中使用透明/半透明视图来完成调光效果。


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

  • UIModalPresentationPageSheet

  • UIModalPresentationFormSheet

然而,这两个选项对我们如何调整它们的大小以及放置它们的位置都有一点限制(在我看来),所以如果你想要完全自定义,你必须以同样的方式去做我在iPhone上进行了解释,在UIView上提供了一个单独的UIViewController作为背景视图。


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


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

答案 1 :(得分:0)

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

这样做的另一个好处是能够使用特定于域的语言 - 在Root VC界面中为您的特定应用程序建模的方法名称 - 例如[rootViewController presentMenuItem:menuItem]。

我有一个使用根视图控制器here的应用程序示例。

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

- (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指出的那样,这是必需的。