当 UILabel 动态调整大小时,在 UIView 中移动 UIButton。 iOS

Posted

技术标签:

【中文标题】当 UILabel 动态调整大小时,在 UIView 中移动 UIButton。 iOS【英文标题】:Move UIButton in UIView when UILabel is resized dynamically. iOS 【发布时间】:2014-03-27 09:47:26 【问题描述】:

我在自定义 UIView 中有一个 UILabel 和一个 UIButton。我的UIButton 站点位于我的UILabel 下方。

我的 UILabel 文本改变了它的大小并与我的 UIButton 重叠。

当 UILabel 自行调整大小时,我希望能够将我的 UIButton 向下移动?

我只设法动态调整UILabel 的大小,但无法调整或移动我的UIButton

self.chosenCategoriesLabel.font = [UIFont fontWithName:@"Helvetica-Light" size:17.0];
self.chosenCategoriesLabel.textColor = [UIColor colorWithRed:161.0/255.0 green:205.0/255.0 blue:86.0/255.0 alpha:1.0];
self.chosenCategoriesLabel.font = [UIFont fontWithName:@"Helvetica-Light" size:15.0];
self.chosenCategoriesLabel.numberOfLines = 0;
self.selectedCategoriesString = [self.selectedCategoriesArray componentsJoinedByString:@","];
self.chosenCategoriesLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.chosenCategoriesLabel.text = [self.selectedCategoriesString stringByAppendingString:@"\n\n\n\n"];
[self.selectionsWrapper addSubview:self.chosenCategoriesLabel];

self.chosenCategoriesLabel.frame = CGRectMake(self.chosenCategoriesLabel.frame.origin.x, self.chosenCategoriesLabel.frame.origin.y, self.chosenCategoriesLabel.frame.size.width, [self sizeLabel]);

[self.itemThumbnail setImageWithURL:self.item.itemImageURL placeholderImage:[UIImage imageNamed:@"profile-image-placeholder"]];
[self.view addSubview:self.itemThumbnail];

[self.selectCategorieButton setTitle:@"Select Categories" forState:UIControlStateNormal];
[self.selectCategorieButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[self.selectCategorieButton setTitle:@"Select Categories" forState:UIControlStateHighlighted];
[self.selectCategorieButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
self.selectCategorieButton.titleLabel.font = lightHelveticaFont;
[self.selectCategorieButton setBackgroundImage:[UIImage imageNamed:@"btn_choose_categories.png"] forState:UIControlStateNormal];
[self.selectCategorieButton setBackgroundImage:[UIImage imageNamed:@"btn_choose_categories.png"] forState:UIControlStateHighlighted];
[self.selectCategorieButton.titleLabel setFont:[UIFont boldSystemFontOfSize:15]];
[self.selectCategorieButton.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Light" size:15.0]];
[self.selectionsWrapper addSubview:self.selectCategorieButton];

[self changeLabel];

self.chosenCategoriesLabel.frame = CGRectMake(self.chosenCategoriesLabel.frame.origin.x, self.chosenCategoriesLabel.frame.origin.y, self.chosenCategoriesLabel.frame.size.width, [self sizeLabel]);

-(void)changeLabel 

self.chosenCategoriesLabel = [NSString stringWithFormat:@"%@",array]; 

self.chosenCategoriesLabel.frame = CGRectMake(self.chosenCategoriesLabel.frame.origin.x, self.chosenCategoriesLabel.frame.origin.y, self.chosenCategoriesLabel.frame.size.width, [self sizeLabel]);

 

- (CGFloat) sizeLabel

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
CGSize sizeToFit = [self.chosenCategoriesLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0f] constrainedToSize:CGSizeMake(276.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
#pragma clang diagnostic pop
return fmaxf(22.0f, sizeToFit.height + 40); 

【问题讨论】:

这是你的初始化代码吗?你能显示你调整标签大小的部分吗? 您首先在哪里创建按钮和标签?因为您似乎是通过代码将它们添加到视图中? 我在界面生成器中创建了 uibutton 和 uilabel。我只在我的代码中更改了两者的配置 如果你想实现这一点,那么更好的选择是以编程方式创建并基于字符串值动态设置按钮和标签的框架。 你使用自动布局吗? 【参考方案1】:

有几件事...

当您说您在 IB 中创建了 UI 组件时,我不确定您为什么要再次重新添加它们?例如,如果控件已经在视图中,则不需要像下面这样的行

[self.selectionsWrapper addSubview:self.chosenCategoriesLabel];

你也执行了这行两次?

self.chosenCategoriesLabel.frame = CGRectMake(self.chosenCategoriesLabel.frame.origin.x, self.chosenCategoriesLabel.frame.origin.y, self.chosenCategoriesLabel.frame.size.width, [self sizeLabel]);

要调整按钮的框架,请执行以下操作...

// Get the original frames;
CGRect buttonFrame = self.selectCategorieButton.frame;
CGRect labelFrame = self.chosenCategoriesLabel.frame;

//Work out the new height
CGFloat newHeight = [self sizeLabel];

//Work out what the difference is
CGFloat adjustment = newHeight - labelFrame.size.height;

//Set the labels new height
labelFrame.size.height = newHeight;
self.chosenCategoriesLabel.frame = labelFrame;

//add the difference to the buttons frame
buttonFrame.origin.y = buttonFrame.origin.y + adjustment;
self.selectCategorieButton.frame = buttonFrame;

根据您定义自定义视图的方式,您可能还必须调整其高度以适应按钮的新位置?

【讨论】:

以上是关于当 UILabel 动态调整大小时,在 UIView 中移动 UIButton。 iOS的主要内容,如果未能解决你的问题,请参考以下文章

UILabel 动态内容自动调整大小问题

AutoLayout动态调整UILabel高度和宽度

在 Xcode 界面构建器中创建动态调整大小的 UILabel

UILabel 动态调整大小 - Swift

以编程方式根据行数动态调整 UILabel 的大小

自动布局以动态调整 UILabel 大小不起作用