在我的应用程序中,我创建了混合了UILabel
和UITextview
的视图控制器,它们希望可滚动,因为文本是动态的,也超出了垂直屏幕大小。
我目前正在使用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);
}
答案 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;
,然后将其添加到其init
或layoutSubviews
方法中:
_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;
}