我正在尝试做一些不应该那么复杂的事情,但我无法弄明白。 我有一个显示UITableView的UIViewController。我想在用户按行时显示上下文菜单。我希望这是一个带有标签和按钮的半透明视图。 我可以使用AlertView,但我希望完全控制标签和按钮的格式,并希望使用Interface Builder。
所以我创建了我的小视图250x290,将alpha设置为.75并创建一个带有出口的视图控制器来处理不同的用户事件。
现在我想介绍一下。 如果我使用presentModalViewController两个(不希望的)事情发生 1)视图覆盖了所有屏幕(但状态栏)。 2)它是半透明的,但我看到它“背后”它不是父视图而是应用程序根视图。
我曾尝试将其添加为子视图,但没有任何反应,所以我没有做正确的事情:
RestaurantContextVC* modalViewController = [[[RestaurantContextVC alloc] initWithNibName:@"RestaurantContextView" bundle:nil] autorelease];
[self.view addSubview:modalViewController.view];
有可能做我想要的吗? 提前谢谢。
Gonso
答案 0 :(得分:11)
我正在编写类似的东西。我的方法包括......
不使用dismissModalViewControllerAnimated和presentModalViewController:动画。
在IB中设计自定义的全尺寸视图。在viewDidLoad消息体中,将背景颜色设置为clearColor,以使控制器未覆盖的视图上的空间透明。
我在浮动视图的控制器下放置了一个UIImageView。 UIImageView包含一个photoshoped图像,它有圆角,背景设置为透明。此图像视图用作容器。
我使用CoreAnimation在模态视图样式中显示/关闭浮动视图:(FloatingViewController.m)
- (void)viewDidLoad
{
[super viewDidLoad];
[self.view setBackgroundColor:[UIColor clearColor]];
[UIView beginAnimations:nil context:nil];
[self.view setFrame:CGRectMake(0, 480, 320, 480)];
[UIView setAnimationDuration:0.75f];
[self.view setFrame:CGRectMake(0, 0, 320, 480)];
[UIView commitAnimations];
}
答案 1 :(得分:3)
wangii
这就是我发现的解决方案。 我使用loadNibNamed加载视图,然后使用addSubView将其添加到顶部,如下所示:
//Show a view on top of current view with a wait indicator. This prevents all user interactions.
-(void) showWaitView{
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"WaitView" owner:self options:nil];
#ifdef __IPHONE_2_1
waitView = [ nibViews objectAtIndex: 0];
#else
waitView = [ nibViews objectAtIndex: 1];
#endif
CGFloat x = self.view.center.x - (waitView.frame.size.width / 2);
CGFloat y = self.view.center.y - (waitView.frame.size.height / 2);
[waitView setFrame:CGRectMake(x,y,waitView.bounds.size.width,waitView.bounds.size.height)];
[self.view addSubview:waitView];
}
你能详细说明第3点和第4点吗?
我所做的是为圆形矩形方面提供圆形矩形按钮。
此代码实际上允许您拥有一个小的浮动视图,但如果视图比其父视图小,则用户可以与父视图的可见部分进行交互。
最后,我创建了具有相同大小的视图,但保留了代码以防万一。
Gonso
答案 2 :(得分:2)
我强烈考虑使用导航控制器在子视图中滑动而不是覆盖它。这是预期的模型,你可能认为通过自己的方式做到的任何小好处都会被(最少)意外的原则大大抵消。
如果你真的必须这样做,我相信诀窍是将第一个表视图添加为视图控制器维护的透明“保持”视图的子视图。然后将您的新子视图添加为该子视图的另一个子视图。
答案 3 :(得分:1)
同样,如果你真的想这样做,而不是添加一个透明的“持有”视图,因为这个弹出窗口本质上是模态的,我会把它直接作为窗口的子视图。
您可能需要在其后面放置一个透明的黑色屏蔽,以防止触摸背景并在弹出窗口上对焦输入。
但严重的是,考虑在堆栈上弹出控制器或使用该警报视图。除非您聘请了一位$$设计师,否则它可能不适合iPhone。
答案 4 :(得分:1)
我所做的是在我的app委托中的UINavigation控制器上创建一个UIViewController,并为方便起见使其成为单例对象的属性:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//--- create root navigation controller
self.window.rootViewController = self.navigationController;
//--- create view controller for popups:
popupViewController = [[BaseViewController alloc] init];
popupViewController.view.backgroundColor = [UIColor clearColor];
popupViewController.view.hidden = true; //for rendering optimisation
[self.window addSubview:popupViewController.view];
[AppState sharedInstance].popupViewController = self.popupViewController;
//--- make all visible:
[self.window makeKeyAndVisible];
return YES;
}
在我的应用程序中的任何时候,我都可以打电话,例如。
MyViewController * myVC = [[UIViewController alloc] init];
//... set up viewcontroller and its view...
// add the view of the created view controller to the popup view:
[AppState sharedInstance].popupViewController.view.hidden = false;
[[AppState sharedInstance].popupViewController.view addSubview:myVC.view];
顶部使用的BaseViewController只是继承自UIViewController并设置全屏视图:
//----- in BaseViewController implementation
- (void)loadView {
//------- create root view:
CGRect frame = [[AppState sharedInstance] getScreenFrame];
rootView = [[VCView alloc] initWithFrame:frame];
rootView.backgroundColor = [UIColor whiteColor];
self.view = rootView;
}