在iPhone上显示弹出透明窗口的最佳方法?

时间:2013-10-22 05:06:49

标签: iphone ios objective-c uiviewcontroller modalviewcontroller

我正在Xcode 4.6中构建一个iOS 6 iPhone应用程序,我想知道实现以下类型弹出窗口的最佳方法:

PopoverScreenshot

具体来说,右侧的iPhone屏幕截图,如果用户点击主窗口中的UIView或部分透明的弹出窗口,会出现更详细的信息 - 例如肖像照片和文字数据 - 但原始视图(此处的照片集)仍然可见,定时器/计数器在该视图中继续滴答。

我认为这是一个可能的解决方案iPhone Modal View Smaller that the screen,但它对我不起作用。上面没有显示的是取消按钮,我也打算将其放入popover中,以便用户可以返回到下面的视图。当计时器到期时,详细视图也会消失。

我应该使用presentModalViewController和presenter / present方案,还是使用与storyboard segue的父子视图关系,或者我应该使用loadNibNamed,还是某种黑客来克服iPhone显示非完整版的限制 - 屏幕模态视图?它将覆盖屏幕的大部分,但我想确保下面的视图是可见的并且仍然是活动的,因为它向不在弹出框中的用户提供信息(计时器等)。用户不需要与下面的屏幕进行交互,但我希望它部分可见。

我在我的主故事板中将弹出视图设计为单独的viewcontroller,而不是作为xib文件。连接和出口由接口构建器到我的代码形成,称为ProfileViewController。

警告:我的术语可能不正确且不准确。弹出窗口或弹出窗口可以是UIView,UIViewController,UIWindow,或者以编程方式解决问题的最佳方法。我并不认为它是一种特定的小部件类型,只要功能反映了我正在寻找的东西。

提前感谢您的建议!

4 个答案:

答案 0 :(得分:16)

你想实现这个目标吗?

enter image description here

以下是另一个viewControllers以上的两个vc2childViewControllervc1 transparentUILabel背景。在您的情况下,您可以使用backgroundColor blackalpha = 0.5放置vc2顶部。

vc2.m的所有事件都将在- (IBAction)imageClick { vc2 *viewController = [[vc2 alloc]init]; [self addChildViewController:viewController]; viewController.view.frame = self.view.frame; [self.view addSubview:viewController.view]; viewController.view.alpha = 0; [viewController didMoveToParentViewController:self]; [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^ { viewController.view.alpha = 1; } completion:nil]; } 上触发。在图像上单击使用此代码:

vc2.m

并在viewDidLoad中将viewController放在self.view.backgroundColor = [UIColor clearColor]; self.view.opaque = YES; 上,以使此viewController透明。

vc2

使UIView透明视图会使您的代码变得干净,因为xib的所有代码都将在一个单独的类中。

修改

所以做一件事,首先在category添加一个backgroundColor,这将是一个圆形边框,框架将根据您的屏幕截图显示。

对于圆形边框,您可以使用此UIView。此clearColor的{​​{1}}将为- (void)setRoundedBorder:(float) radius borderWidth:(float)borderWidth color:(UIColor*)color { CALayer * l = [self layer]; [l setMasksToBounds:YES]; [l setCornerRadius:radius]; // You can even add a border [l setBorderWidth:borderWidth]; [l setBorderColor:[color CGColor]]; }

UILabel/UIView/UIImage

现在放置一个UIView,其框架等于xib以上,alpha为0.5,背景为黑色。您可以直接从UIView执行此操作。无需通过代码设置框架。

然后开始将其他控件放在{{1}}

答案 1 :(得分:7)

试试这个

// create a new view
  UIView *viewPopup=[[UIView alloc]init];
  [viewPopup setBackgroundColor:[UIColor blackColor]];
  viewPopup.alpha=0.6f;

 // add into window
 AppDelegate *appdelgateobj=(AppDelegate *)[[UIApplication sharedApplication]delegate];
 [appdelgateobj.window addSubview:viewPopup];
 [appdelgateobj.window bringSubviewToFront:viewPopup];

答案 2 :(得分:5)

按照以下步骤进行透明视图:

第1步: enter image description here

第2步:

enter image description here

  • 每当你想要它时Transpertview.hidden = NO:
  • 无论何时你不想要Transpertview.hidden = YES:

可能会有所帮助。

答案 3 :(得分:1)

.m 文件中添加#import <QuartzCore/QuartzCore.h>框架并使用以下代码

UIWindow* window = [UIApplication sharedApplication].keyWindow;
    self.dimView = [[UIView alloc] initWithFrame:window.bounds];
    self.dimView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:.6];
    self.dimView.userInteractionEnabled = YES;
    [window addSubview:self.dimView];

以上是透明的dimView,其大小类似于窗口。

self.searchTblContainerView = [[UIView alloc] init];
    self.searchTblContainerView.frame = CGRectMake(15, (window.frame.size.height - 300) / 2, 290, 300);
    self.searchTblContainerView.layer.cornerRadius = 15.f;
    self.searchTblContainerView.layer.borderColor = [UIColor blackColor].CGColor; /// set color as per your requirement
    self.searchTblContainerView.layer.borderWidth = 2.f;
    self.searchTblContainerView.alpha = 0.80; /// set as per your requirement 
    self.searchTblContainerView.clipsToBounds = YES;
    [self.dimView addSubview:self.searchTblContainerView];

上方self.searchTblContainerView是主视图,其中包含您的整个UIControls,例如label,textField,Button等...并根据您的要求进行设置。

默认设置隐藏属性self.dimView.hidden = YES; 动画,例如alertView (苹果)显示和隐藏

以下代码显示dimView。

self.searchTblContainerView.transform = CGAffineTransformMakeScale(0.01, 0.01);
        [UIView animateWithDuration:0.30 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            self.searchTblContainerView.transform = CGAffineTransformIdentity;
            self.dimView.hidden = NO;
        } completion:^(BOOL finished){}];

        UIWindow* window = [UIApplication sharedApplication].keyWindow;
        [window bringSubviewToFront:self.dimView];

以下隐藏dimView的代码。

 self.searchTblContainerView.transform = CGAffineTransformIdentity;
    [UIView animateWithDuration:0.30 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.searchTblContainerView.transform = CGAffineTransformMakeScale(0.01, 0.01);
    } completion:^(BOOL finished){
        self.dimView.hidden = YES;
    }];

上面的代码是简单的逻辑,可能对你的情况有用。