我的故事板中有一个特定视图控制器的默认布局。我想以编程方式添加一些内容,但我不知道如何去做,以便调整其他视图的布局。
由于我只是将内容拖放到布局中,因此没有像android中那样清晰的结构(布局中的布局,相对性等)。
例如,我希望能够单击视图,并在该视图下方展开图表,按下展开视图下方的每个视图。
目前,我可以在我的布局中的特定位置添加一个视图,但它将落后于其他视图,除非它前面没有任何东西落后。
所以我想我问我是否可以在故事板中完成大部分布局,并通过这种方式为它们提供某种结构,然后以编程方式在项目之间添加内容。
OR
我应该以编程方式执行所有操作吗?我需要做一些改造工作,因为我的视图控制器和其他东西之间的交互已经在我的故事板中。
谢谢!
答案 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添加/隐藏它们。请记住,添加子视图后还要添加约束。