从具有特定大小的故事板加载视图控制器

时间:2016-02-29 20:32:25

标签: ios objective-c

我想知道是否可以在模态下加载/呈现具有“自由格式”大小的UIViewController,如下图所示

enter image description here

我想在顶部加载红色(永远可见)并同时与下面的ViewController(蓝色)进行交互。

编辑:我想要的是显示和隐藏FROM APP DELEGATE一个小视图控制器来控制我的应用程序中的音乐。 我尝试使用自定义UIViewController作为文件所有者的xib文件(参见下图)。 xib以我想要的方式正确显示,但与之关联的UIViewController,id不加载,我不知道为什么......

enter image description here

所以我想用自由形成的UIViewController做到这一点,但我没有做到,我不知道这是最好的方式

EDIT2:

使用xib文件的方式我做了下一个:

在AppDelegate中,我有一个函数showPlayer,通过本地通知调用以显示xib

-(void)showPlayer:(int)tag andObjetoCancion:(NSArray *)objetoCancion
{

ZocaloPlayerViewController *vc = [[ZocaloPlayerViewController alloc] initWithNibName:@"ZocaloPlayerView" bundle:nil];
[vc setObjectoCancion:[objetoCancion mutableCopy]];

if (globals.isPlaying) {
    [vc setCambiar:YES];
}else{
    [vc setCambiar:NO];
}

//here playerView is a UIView initiated in didFinishLaunchingWithOptions
if (playerView == nil) {
    playerView = [[UIView alloc] initWithFrame:CGRectMake(0,  self.window.frame.size.height, self.window.frame.size.width, altoPlayer)];
}

//keyWindow is UIWindow
//NSLog(@"Abro view %ld", (long)viewPlayer.tag);
keyWindow = [[[UIApplication sharedApplication] delegate] window];
[keyWindow addSubview:playerView];
[keyWindow bringSubviewToFront:playerView];


NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"ZocaloPlayerView" owner:vc options:nil];
mainView = [subviewArray objectAtIndex:0];
mainView.translatesAutoresizingMaskIntoConstraints = NO;  //This part hung me up


[playerView addSubview:mainView];

//needed to make smaller for iPhone 4 dev here, so >=200 instead of 748
[playerView addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"V:|-0-[mainView]-0-|"
                           options:NSLayoutFormatDirectionLeadingToTrailing
                           metrics:nil
                           views:NSDictionaryOfVariableBindings(mainView)]];

[playerView addConstraints:[NSLayoutConstraint
                           constraintsWithVisualFormat:@"H:|-0-[mainView]-0-|"
                           options:NSLayoutFormatDirectionLeadingToTrailing
                           metrics:nil
                           views:NSDictionaryOfVariableBindings(mainView)]];

[UIView animateWithDuration:0.3 animations:^{
    playerView.center = CGPointMake(self.window.frame.size.width / 2, self.window.frame.size.height - mitadAltoPlayer);
    [self.window layoutIfNeeded];
}];

}

ZocaloPlayerViewController * vc正在实例化,但其中的viewDidLoad函数未被调用....这是我的第一个问题......

随着UIViewController自由形成的方式,我不知道该怎么做......

1 个答案:

答案 0 :(得分:0)

好的,我用这篇文章解决了我的问题Loaded nib but the view outlet was not set - new to InterfaceBuilder (我错过了UIView的出口)

我将showPlayer函数中的代码更改为:

-(void)mostrarPlayer:(int)tag andObjetoCancion:(NSArray *)objetoCancion
{

ZocaloPlayerViewController *vc = [[ZocaloPlayerViewController alloc] initWithNibName:@"ZocaloPlayerView" bundle:nil];
[vc setObjectoCancion:[objetoCancion mutableCopy]];

if (globals.isPlaying) {
    [vc setCambiar:YES];
}else{
    [vc setCambiar:NO];
}


if (playerView == nil) {
    playerView = [[UIView alloc] initWithFrame:CGRectMake(0,  self.window.frame.size.height, self.window.frame.size.width, altoPlayer)];
}

//NSLog(@"Abro view %ld", (long)viewPlayer.tag);
keyWindow = [[[UIApplication sharedApplication] delegate] window];
[keyWindow addSubview:playerView];
[keyWindow bringSubviewToFront:playerView];

[playerView addSubview:vc.view];

[UIView animateWithDuration:0.3 animations:^{
    playerView.center = CGPointMake(self.window.frame.size.width / 2, self.window.frame.size.height - mitadAltoPlayer);
    [self.window layoutIfNeeded];
}];

}