2013-12-21 34 views
3

我推着一個UIViewController與透明的ViewController

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

然後筆尖爲newController都有基本視圖,小圖和文本字段,並在較小的視圖的一些按鈕。我希望基本視圖是透明的灰色,所以我可以看到它下面的視圖控制器的視圖,同時讓用戶明白其他視圖是禁用的。

我已經嘗試設置低Alpha值(這是我的其他控件),將視圖背景設置爲透明黑色,並且取消設置不透明標誌。這些都沒有工作。我只是得到一個不透明的淺灰色背景。

這裏是我的視圖控制器:

@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 

有沒有一種方法,使這種觀點半透明?

+0

iPhone或iPad? – nhgrif

回答

1

iPhone,爲了實現這一點(的UIAlertViewUIActionSheet外)的唯一方式是通過呈現UIView爲對UIViewController一個子視圖,將作爲背景圖。您呈現的UIView可以佔據整個屏幕,並使用透明/半透明的視圖獲取其大部分視圖以實現調光效果。


iPad,除了UIAlertViewUIActionSheet,你也可以模態存在的觀點是不能全屏顯示。這些有他們自己的視圖控制器。要做到這一點,你需要將UIModalPresentationStyle設置爲以下之一:

  • UIModalPresentationPageSheet

  • UIModalPresentationFormSheet

然而,這兩個選項都有點限制(在我意見),關於如何調整它們的大小以及放置位置,所以如果您想要完全自定義,則必須按照我爲iPhone解釋的方式進行操作,方法是在0123上單獨提供UIView作爲背景視圖的。


除了UIModalPresentationPageSheetUIModalPresentationFormSheet選項爲iPad,設置視圖控制器的透明的/半透明的背景將假設可設置的顏色的背最層後面的白色背景。


還應當指出的是,UIAlertViewUIActionSheet意(蘋果機)被用作是,不應該被繼承,而你也可以繼承UIView所有你想要得到什麼看你的願望。

+0

除了默認的UIViewController之外,你還在說UIView嗎? – kwiqsilver

+0

是的。向UIViewController的'view'添加一個子視圖。 – nhgrif

+0

在筆尖中,我在「視圖」下添加了Alpha:0.5和黑色背景下的視圖,但我仍然看不到其他視圖控制器的內容。全是灰色的。 – kwiqsilver

0

使用自定義RootViewController來管理自己的容器視圖時,這種事情很容易。然後,根視圖控制器可以定義自己的導航系統或委託給標準的UIKit組件。

這也有能夠使用域特定的語言 - 方法名稱,在根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,並可以在事實上被寫入工作雙方。

編輯:

如果你沒有得到正確的設置下爲rootVC上的UIWindow的自定義根視圖控制器,你還可以通過添加對將要呈現的VC同樣的方法做到這一點半透明覆蓋層。

EDIT2:

請注意添加量:

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

。 。這是必需的,正如傑西·魯斯克指出的那樣

+0

這很有道理,但您需要使用UIViewController包含API,而不是將視圖從視圖控制器中取出。 –

+1

是的,旋轉,視圖卸載,事件處理等等,都會在令人驚訝的情況下破裂或成爲痛苦。它基本上不支持iOS 5以前的版本,因此至少可以通過這些API調用「正確」的方式來完成此操作。 –

+0

支持子視圖,但不支持屬於不同視圖控制器的子視圖。 –