如何在iOS中的ViewController中添加View以下的其他视图?

时间:2012-08-07 21:25:17

标签: iphone ios ios5 uiscrollview

在我的应用程序中,我创建了混合了UILabelUITextview的视图控制器,它们希望可滚动,因为文本是动态的,也超出了垂直屏幕大小。

我目前正在使用Scrollview,其子视图如下所示。视图在 Xcode 4.3 Storyboard 中创建。

UILabel1(Say Heading)

UITextView1(可以是任意大小的动态文字)

UILabel2(第二标题)

UITextView2(可以是任意大小的动态文字)

等等。

问题是

UITextView1包含更多内容时,它会与我不想要的UILabel2重叠。

我希望UILabel1位于scrollView之上,而UITextView1位于UILabel1之下。 UILabel2以下UITextView1等等。

我必须做些什么来实现这个目标?

修改

在故事板中

![在此处输入图片说明] [1]

在模拟器中

![在此输入图片说明] [2]

感谢您的帮助。非常感谢。

代码

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.

[scrollView setScrollEnabled:YES];     
[self.view addSubview:cockTailNameLabel];
[self.view insertSubview:txtIngredients belowSubview:cockTailNameLabel];
[self.view insertSubview:scrollView belowSubview:cockTailNameLabel];
//[scrollView]

[self.cockTailNameLabel setText:self.passcockTailName];  

[_txtUse setText:self.passUse]; 
[_txtUse setEditable:NO];
[_txtUse setUserInteractionEnabled:NO];

CGRect useFrame = _txtUse.frame;
useFrame.size.height = _txtUse.contentSize.height;
_txtUse.frame = useFrame; 

[txtIngredients setText:self.passIngredients];
[txtIngredients setEditable:NO];
[txtIngredients setUserInteractionEnabled:NO];
CGRect ingredientFrame = txtIngredients.frame;
ingredientFrame.size.height = txtIngredients.contentSize.height;
txtIngredients.frame = ingredientFrame;  


[txtRecipe setText:self.passReceipe];
[txtRecipe setEditable:NO];
[txtRecipe setUserInteractionEnabled:NO];
CGRect recipeFrame = txtIngredients.frame;
recipeFrame.size.height = txtRecipe.contentSize.height;
txtRecipe.frame = recipeFrame;

[scrollView insertSubview:_txtUse belowSubview:cockTailNameLabel];
[scrollView insertSubview:titleIngredients belowSubview:_txtUse];
[scrollView insertSubview:txtIngredients belowSubview:titleIngredients];
[scrollView insertSubview:btnReceipe belowSubview:txtIngredients];
[scrollView insertSubview:btnHome belowSubview:txtIngredients];
[scrollView insertSubview:txtRecipe belowSubview:btnHome];
[scrollView insertSubview:btnfacebookShare belowSubview:txtRecipe];
[scrollView insertSubview:btnTwitterShare belowSubview:txtRecipe];



/*[scrollView addSubview:_txtUse];
[scrollView addSubview:titleIngredients];
[scrollView addSubview:txtIngredients];
[scrollView addSubview:btnReceipe];
[scrollView addSubview:btnHome];
[scrollView addSubview:txtRecipe];
[scrollView addSubview:btnfacebookShare];
[scrollView addSubview:btnTwitterShare];*/

[scrollView setContentSize:CGSizeMake(320, 1000)];

NSLog(@"RecipeName :%@ ",passcockTailName);

}

6 个答案:

答案 0 :(得分:7)

在Storyboard或IB中,您可以自由重新排列它们。

在代码中,您执行- (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview

答案 1 :(得分:1)

在代码中(在viewDidLoad中):

UIScrollView *scroll =[[UIScrollView alloc] initWithFrame:CGrectMake(0,0 320, 480)];
[self.view addSubview:scroll];
// code to init your UI object
UILabel *uilabel1 = [[UIlabel alloc] initWithFrame:CGrectMake(10,10, 100, 40)]; // example 
uilabel1.font = [UIFont systemFontOfSize:10];
uilabel1.text = @"UILabel1";
uilabel1.backgroundColor = [UIColor clearColor];
//
//
UILabel *uilabel2 = [[UIlabel alloc] initWithFrame:CGrectMake(10, 10 + 10 + uilabel1.frame.origin.y, 100, 40)]; // example
uilabel2.font = [UIFont systemFontOfSize:10];
uilabel2.text = @"UILabel2";
uilabel2.backgroundColor = [UIColor clearColor];
//
//
[scroll addSubview:uilabel1];
[uilabel1 releale];
[scroll addSubview:uilabel2];
[uilabel2 releale];
//
//
// in end 
float offset = 10.0 * 2; // offset between uiobjects, N - number of objects
scroll.contentSize = CGSizeMake (0, 0, uilabel1.frame.size.height + uilabel2.frame.size.height + offset, 320);

请注意,您可以设置您的uiobjects的框架(和其他属性)并添加它以便下降。

答案 2 :(得分:0)

您可以告诉下一个视图从第一个视图的结尾开始,如下所示:

startYOfNextView = firstView.frame.origin.y position + firstView.frame.size.height;

对其他视图的其余部分执行相同操作。如果您的视图具有可变文本长度,则可能需要根据特定字体预先确定字符串的高度,例如:

CGSize maxSize = CGSizeMake(widthOfView, 9999999);
CGSize expectedSize = CGSizeMake(stringVar sizeWithFont:[UIFont fontWithName:@"Arial"] withMaxSize:maxSize lineBreakMode:UILineBreakModeWordWrap);

然后告诉你的动态视图使用expectedSize变量的高度,如下所示:

myDynamicView = [[UILabel alloc] initWithFrame:CGRectMake(..., expectedSize.height)];

答案 3 :(得分:0)

您的问题是标签出现在textview(Overlapped)之上,对吧?

在这种情况下,您将动态修改textview的高度。如果仅用于显示目的,您可以将文本设置为具有numberOfLines = 0而不是UITextview的UILabel;随着它添加到scrollview添加标签将没问题。

此外,您还需要修改剩余视图的origin.y,以便正确对齐。即,secondView.origin.y = firstView.origin.y + firstView.size.height + offset。同样,在上面的视图中修改剩余视图的原点。因此它的起源将位于前一个视图框之外。

答案 4 :(得分:0)

在我的情况下,我必须将其投影到父视图上,所以请记住还有一些东西,

db.collection.aggregate([
  {
     $addFields: {
         phrases: {
           $toString: "$phrases"
         }
     }
  }, 
  {
     $project: {
         _id: 0,
         phrases: 1,
         length: {
            $strLenCP: "$phrases"
         }
     }
  },
  {
     $sort: {
       length: -1
     }
  }
])

答案 5 :(得分:0)

我认为添加透明的UI按钮是最快的解决方案。您可以添加一次,然后在需要禁用当前视图下方的所有视图时显示/隐藏(假设“当前”视图,例如弹出窗口,是最后添加到您的超级视图)。

在弹出视图中声明实例变量UIButton* _parentDisablingOverlay;,然后将其添加到其initlayoutSubviews方法中:

_parentDisablingOverlay = [[UIButton alloc] initWithFrame:CGRectMake(0,0, self.superview.frame.size.width, self.superview.frame.size.height)];
[self.superview insertSubview:_parentDisablingOverlay belowSubview:self];
_parentDisablingOverlay.hidden = true;

稍后,当您想要显示弹出窗口并禁用以下所有内容时:

- (void) open {
   self.hidden = false;
   _parentDisablingOverlay.hidden = false;
}

类似地,关闭并重新启用所有内容:

- (void) close {
    self.hidden = true;
    _parentDisablingOverlay.hidden = true;
}