UILabel 和 UITableView CGrectMake 重构 - iPhone

Posted

技术标签:

【中文标题】UILabel 和 UITableView CGrectMake 重构 - iPhone【英文标题】:UILabel and UITableView CGrectMake reframing - iPhone 【发布时间】:2014-01-23 07:09:30 【问题描述】:

我有一个 NavigationControllers A 和一个 UIViewController B 。 A 有一个标签,其下方是 UITableView。当从 A 导航到 B 并从 B 导航回 A 时,我重新构建了标签和表格视图。我尝试通过 ViewWillAppear 方法中的代码设置框架。然而我没有它的确切框架。我在这里缺少什么基本的东西?

[self.labelUser setFrame:CGRectMake(71, 73, 179, 20)];
[self.customersTable setFrame:CGRectMake(0, 102, 320, 421)];

正在使用自动布局。但我无法解决这个问题。我已经附上了相同的图片

![在此处输入图像描述][2] ![在此处输入图像描述][3]

编辑:KVO 代码检查帧值并将帧改回原来的值

在 ViewDidLoad 中

[labelUser addObserver:self forKeyPath:@"frame" options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:NULL];

然后

- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context 

    if ([keyPath isEqual:@"frame"]) 
        NSLog(@"changed %@ %@", NSStringFromCGRect(labelUser.frame), NSStringFromCGRect(customersTable.frame));
        if (![NSStringFromCGRect(labelUser.frame) isEqual:NSStringFromCGRect(CGRectMake(71, 73, 179, 20))]) 

            [labelUser removeObserver:self forKeyPath:@"frame"];
            [self.labelUser setFrame:CGRectMake(71, 73, 179, 20)];
            [self.customersTable setFrame:CGRectMake(0, 102, 320, 421)];

        

    

像这样推送视图

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath


    [self performSegueWithIdentifier:@"segueToOrd" sender:self];


也尝试了KVO方法..但没有运气...有什么建议吗??

故事板图片

【问题讨论】:

你用的是xib还是storyboard? 如果我是你,我会使用键值观察来观察标签的框架。 嗨,我试过了,发现在导航过程中高度发生了变化。不知道为什么,但我尝试再次重新构建它并不起作用.. 设置断点,你会看到调用堆栈。它说什么?您还可以打印旧值和新值。 我已经打印了新旧值...旧值 71, 73, 179, 20 更改了新值是 71, 73, 179, 0 ...我将添加我对问题所做的代码..请检查编辑 【参考方案1】:

假设您使用的是 ios 7 ,这是因为默认情况下已将来自 XCode 5 及更高版本的 AUTOLAYOUT 添加到项目中。因此,Storyboard 中的帧最终会转换为恒定的帧。因此,如果您更改帧,它可能会在那一刻生效,但是当再次加载视图时,它将从情节提要中取回帧,而不是您更改的帧。

因此,您的问题的解决方案是您必须手动添加约束并且只更改约束常量而不是框架。Apple 很快就会放弃框架,所以开始学习 Autolayout。

PS:如果您取消选中情节提要检查器中的“使用自动布局”选项,您的代码将按预期工作。

【讨论】:

嗨...... iOS 6 及更低版本不存在 AutoLayout,因此不使用它......还有一件事是我没有在故事板以外的任何地方更改或设置框架。我添加的代码只是为了确保标签保留其框架。 我想您可能没有注意到 iOS 6 中引入了 Autolayout。请检查您的 Storyboard 设置并指定您使用的 XCode 版本。 好的...如果您的部署目标是 iOS 5 及更高版本,那么您不能使用 AutoLayout,因为它是从 iOS6 开始引入的,这就是我的意思。我正在使用 Xcode 5.. 所以我的部署目标是 iOS 5,因此我不能使用自动布局。 我已经检查了你所说的 XCode 5 和部署到 iOS 5 的方式,默认情况下它确实采用自动布局,正如我回答的那样。打开 Storyboard -> 并检查 Inspector 中的第一个选项卡是否启用了自动布局。我确定它已启用。首先请检查它然后回复。 好的...请去构建设置...将您的部署目标更改为iOS5..然后尝试启用自动布局,看看您是否可以启用..它会给你一个错误...

以上是关于UILabel 和 UITableView CGrectMake 重构 - iPhone的主要内容,如果未能解决你的问题,请参考以下文章

UITableView中的UIlabel多行

在UITableview swift中使用UILabel和UIWebView设置heightForRow

如果 UITableView 没有数据如何添加 UIImage 和 UILabel

UILabel 和 UITableView CGrectMake 重构 - iPhone

如何在 UITableView 中设置 UILabel 的动作

在 UITableview swift 中使用 UILabel 和 UIWebView 设置 heightForRow