如何在不同的方向设置 UILabel 的位置

Posted

技术标签:

【中文标题】如何在不同的方向设置 UILabel 的位置【英文标题】:how to set the postion for UILabel in Different UIOrientation 【发布时间】:2011-10-18 12:13:00 【问题描述】:

我有一个视图,我正在以编程方式创建一个 UILabel 并将其称为我的参数传递,因为我需要许多具有不同位置框架的 UILabel 文本,所以我通过参数传递来调用它。

使用下面的代码,当我旋转到横向模式时,纵向视图标签仍然出现。我该如何克服呢?我需要在下面的代码中完成。我希望将标签框的位置从纵向视图更改为横向视图。

注意:我需要创建很多标签,大约 15 到 20 个,所以我使用参数传递,这样我就不需要为创建每个标签编写尽可能多的方法。

-(UILabel*)createLabel:(CGRect)frame :(NSString*)labelTitle

    UILabel *myLabel = [[UILabel alloc] initWithFrame:frame]; 
    [UIFont fontWithName:@"Arial" size:13];  
    myLabel.text = labelTitle;     


-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

 
    if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    
        [self.view addSubview:[self createLabel:CGRectMake(450,140,60,20):@"Ratings:"]];  
        [self.view addSubview:[self createLabel:CGRectMake(450,170,60,20):@"Reviews:"]];  
    
    else
    
        [self.view addSubview:[self createLabel:CGRectMake(650,140,60,20):@"Ratings:"]];
        [self.view addSubview:[self createLabel:CGRectMake(650,170,60,20):@"Reviews:"]];  
    

    return YES;

【问题讨论】:

【参考方案1】:

不要在shouldAutorotateToInterfaceOrientation 中创建它们,因为每次方向更改时都会调用它,从而创建更多标签。

而是在 - (void) loadView 中创建一次,并为它们提供正确的 autoResizingMask 属性,例如:

myLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth ;

当方向改变时,这将导致所需的行为:标签将自动调整大小,整个转动动画将变得平滑。

PS:请注意,您创建标签的方式会导致内存泄漏,请使用release 方法来防止这种情况发生。

【讨论】:

我在 ViewDidLoad 方法中尝试了以下代码 CGRect frame = CGRectMake(600,140,​​60,20); myLabel = [[UILabel alloc] initWithFrame:frame]; [UIFont fontWithName:@"Arial" size:13]; myLabel.text = 标签标题;但它显示了未声明的 LabelTitle 如何在调用以下命令时分配 labeltitle -(BOOL)shouldAutorot if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) myLabel.frame = CGRectMake(600,140,​​60,20); myLabel.text = @"评分:"; 其他 那是因为您将LabelTitle作为参数发送给createLabel方法,如果不传递则无法访问。相反,您可以使用 myLabel.text = @"" 我写了 myLabel.text = @"Ratings";并调用 (BOOL)ShouldnautoRotate 方法中接下来显示的以下代码,但仍在运行其抛出异常 (BOOL)ShouldnautoRotate myLabel.frame = CGRectMake(600,140,​​60,20); myLabel.text = @"评分:"; 请阅读我的第一个 awnser 并使用该方法进行操作。或 /dev/null【参考方案2】:

纵向标签仍然出现,因为每次旋转设备时,您都在添加一个新标签,而不会删除旧标签。

我认为创建新标签并不是一个好主意,而您只能更改现有标签的框架。为此,您应该向您的类添加两个属性(例如 reviewLabel 和 ratingLabel),并在首次创建它们时将标签分配给它们。然后在您的 shouldAutorotate 函数中,您可以访问这些标签并更改它们的框架。

【讨论】:

我可以有一个示例代码吗..因为我是 iphone 开发的新手..还有一个问题是我需要在 15 左右创建许多标签,所以我需要为所有标签提供属性。 ..? 如果您有这么多标签,为每个标签设置一个属性不太实用。尝试按照 Wolfert 的建议设置它们的 autoresizingMask 以正确布置它们。您还可以使用视图标签。在创建时设置每个标签的标签,如 myLabel.tag = 10,并使用 myLabel = [self.view viewWithTag:10] 在 shouldAutorotate 函数上检索标签。

以上是关于如何在不同的方向设置 UILabel 的位置的主要内容,如果未能解决你的问题,请参考以下文章

在 Tableview 中,我想知道如何在单元格最后位置设置多行 UILabel

如何在多行 UILabel 中找到最后一个文本行的位置,或者让 UILabel 有 0 填充

如何在单元格中设置 UILabel 相对于图像的位置

使用 AutoLayout,当导航栏消失时,如何将 UILabel 保持在同一位置?

如何布局可以有无限行数的UILabel

调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何