我可以混合搭配程序化添加视图并同时使用故事板进行iOS操作吗?

时间:2014-11-25 15:56:02

标签: ios objective-c iphone layout programmatically-created

我的故事板中有一个特定视图控制器的默认布局。我想以编程方式添加一些内容,但我不知道如何去做,以便调整其他视图的布局。

由于我只是将内容拖放到布局中,因此没有像android中那样清晰的结构(布局中的布局,相对性等)。

例如,我希望能够单击视图,并在该视图下方展开图表,按下展开视图下方的每个视图。

目前,我可以在我的布局中的特定位置添加一个视图,但它将落后于其他视图,除非它前面没有任何东西落后。

所以我想我问我是否可以在故​​事板中完成大部分布局,并通过这种方式为它们提供某种结构,然后以编程方式在项目之间添加内容。

OR

我应该以编程方式执行所有操作吗?我需要做一些改造工作,因为我的视图控制器和其他东西之间的交互已经在我的故事板中。

谢谢!

3 个答案:

答案 0 :(得分:0)

您应该在Interface Builder中正确构建视图,您可以使用约束来完成。当然,您也可以通过编程方式添加视图。请记住,Interface Builder不会执行任何操作,然后定义一个存储接口结构的文件,以便从nib加载它。 因此,您只需要使用addSubview方法以编程方式添加视图,并在代码中以相同的方式添加约束。

这些方法可能会更新你的观点:

[self.view setNeedsLayout];
[self.view setNeedsUpdateConstraints];
[self.view setNeedsDisplay];

答案 1 :(得分:0)

答案是"当然"。 故事板仅用于放置始终显示的元素。 之后,如果你想制作一些出现和消失的观点,你必须以编程方式进行;)它真的很简单

看看这个,当我点击故事板中创建的按钮时,记事本是一个IBAction。

- (IBAction)Notepad:(id)sender {
    if(!isAppearing){
        isAppearing = YES;
        if(notepad==nil)
        {
            [self Notepad_Show];
        }
        else
        {
            [self Notepad_Hide];
        }
    }
}


-(void)Notepad_Show
{
    [self Recherche_Hide];

    DB_Plist* plist = [[DB_Plist alloc] initDatabase];
    float notepadWidth = 300;
    float notepadHeight = 500;

    notepad = [[UIView alloc] initWithFrame:CGRectMake(500, 80, notepadWidth, notepadHeight)];

    UIImageView* background = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, notepadWidth, 0)];
    [background setImage:[UIImage imageNamed:@"notepad.png"]];

    UILabel* titre = [[UILabel alloc] initWithFrame:CGRectMake(0, 10, notepadWidth, 30)];
    [titre setText:[language BlocNotes]];
    [titre setTextAlignment:NSTextAlignmentCenter];
    [titre setFont:[UIFont fontWithName:@"Verdana" size:24]];

    UITextView* textView = [[UITextView alloc] initWithFrame:CGRectMake(40, 40, notepadWidth-50, notepadHeight)];
    [textView setFont:[UIFont fontWithName:@"Verdana" size:18]];
    [textView setBackgroundColor:[UIColor clearColor]];
    [textView setText:[plist Get_Notepad]];

    [notepad addSubview:background];

    [UIView animateWithDuration:ANIMDURATION
                          delay:0.0f
                        options: UIViewAnimationOptionTransitionNone
                     animations:^{
                         CGRect viewFrame = background.frame;
                         viewFrame.size.height = notepadHeight;
                         [background setFrame:viewFrame];

                     }
                     completion:^(BOOL finished){
                         [notepad addSubview:textView];
                         [notepad addSubview:titre];
                         isAppearing = NO;
                     }];


    [self.view addSubview:notepad];
}

-(void)Notepad_Hide
{
    if(notepad!=nil){
        DB_Plist* plist = [[DB_Plist alloc] initDatabase];
        UITextView* textView = [notepad.subviews objectAtIndex:1];
        [plist Set_Notepad:textView.text];

        NSArray* SubViews = [notepad subviews];
        for (int i = 0; i < [SubViews count]; i++)
        {
            if(i!=0)
            {
                UIView* tempView = [SubViews objectAtIndex:i];
                [tempView removeFromSuperview];
            }
        }

        [UIView animateWithDuration:ANIMDURATION
                              delay:0.0f
                            options: UIViewAnimationOptionTransitionNone
                         animations:^{
                             CGRect viewFrame = notepad.frame;
                             viewFrame.size.height = 0;
                             [notepad setFrame:viewFrame];

                             NSArray* SubViews = [notepad subviews];
                             for (int i = 0; i < [SubViews count]; i++)
                             {
                                 UIView* tempView = [SubViews objectAtIndex:i];
                                 CGRect viewFrame = tempView.frame;
                                 viewFrame.size.height = 0;
                                 [tempView setFrame:viewFrame];
                             }

                         }
                         completion:^(BOOL finished){
                             NSArray* SubViews = [notepad subviews];
                             for (int i = 0; i < [SubViews count]; i++)
                             {
                                 UIView* tempView = [SubViews objectAtIndex:i];
                                 [tempView removeFromSuperview];
                                 tempView = nil;
                             }
                             [notepad removeFromSuperview];
                             notepad = nil;
                             isAppearing = NO;
                         }];
    }
}
编辑:不要判断我^^我在学习Obj-C时写过这个!它只是告诉您,当您从Storyboard

中点击某个项目时,可以以编程方式创建字段

答案 2 :(得分:-1)

如果视图在xib文件中进行布局,则可以在从xib文件创建的界面之上以编程方式添加视图。通过制作视图并使用addSubview(myCustomView)和myCustomView.isHidden = true添加/隐藏它们。请记住,添加子视图后还要添加约束。