iOS Objective C - 旋转回纵向后 UIView 无法正确显示

Posted

技术标签:

【中文标题】iOS Objective C - 旋转回纵向后 UIView 无法正确显示【英文标题】:iOS ObjectiveC - UIView not show correctly after rotating BACK to Portrait 【发布时间】:2015-09-29 16:45:53 【问题描述】:

我是 Objective C 的新手,在第一次旋转到横向后旋转回纵向时,我似乎无法在 tableViewCell 中设置正确的 UIView。

我查看了几篇相关的帖子,但似乎没有任何问题可以解决我的问题。当我打印宽度时,虽然输出不正确,但我得到了预期的结果。

我创建了一个 UIView“lineView”来在我的 tableView 中的单元格之间添加自定义线条(由于不同部分中的一些分隔符问题,这是必要的)。

以下是部分代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier" forIndexPath:indexPath];    

     ... Content of the cell

     UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(10, 42,tableView.bounds.size.width-20, 0.7);    
     lineView.backgroundColor = [UIColor blackColor];

     [cell.contentView addSubview:lineView];

     return cell;

当我运行整个程序时,我得到以下输出(从左到右:不旋转,旋转到横向,旋转回纵向):

图 1 和图 2 中的分隔线是正确的,但是当我旋转回横向时,右侧的插图消失了。可能有一个微不足道的解决方案,但我的原始技能让我失望。

我错过了什么?

【问题讨论】:

是否可以将约束应用于该分隔符 UIView?我的意思是例如: [lineView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[lineView(==0.7]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(myView)]]; 宽度也类似。跨度> 谢谢!这绝对是一个选择。我尝试了 contraintWithVisualFormat 以及 constraintsWithItem。在对代码进行一些修改后,这两种方式都可以工作。我将在答案中添加代码。 【参考方案1】:

以下是我解决问题的方法(感谢@codedad 的评论),以防有人遇到类似问题:

 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier" forIndexPath:indexPath];    

     ... Content of the cell

    UIView *lineView = [[UIView alloc] init];
    lineView.translatesAutoresizingMaskIntoConstraints=NO;

    [cell.contentView addSubview:lineView];

    NSArray *verticalConstraints =
      [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-41.5-[lineView(0.8)]"
                                            options: 0
                                            metrics:nil
                                            views:NSDictionaryOfVariableBindings(lineView)];


    NSArray *horizontalConstraints =
      [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[lineView(>=50)]-20-|"
                                        options: 0
                                        metrics:nil
                                          views:NSDictionaryOfVariableBindings(lineView)];

    [cell.contentView addConstraints:verticalConstraints];
    [cell.contentView addConstraints:horizontalConstraints];

您也可以使用“constraintsWithItem”。我尝试了这两种方法,它们都运行良好 (https://developer.apple.com/library/prerelease/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/index.html)。

我仍然不明白为什么使用“框架”会导致最初的问题,但使用 NSLayoutconstrainClass 似乎是一种更安全、更可靠的方法。

【讨论】:

以上是关于iOS Objective C - 旋转回纵向后 UIView 无法正确显示的主要内容,如果未能解决你的问题,请参考以下文章

旋转回纵向时视口缩放中断

斯威夫特如何将我的图像移回中间后?或将其旋转回原点位置

在 ios6 和 ios7 的 MPMoviePlayerViewController 中将横向旋转为纵向

使用 Objective C 在 iOS8 中分离横向和纵向视图

在 Objective C 中使用自动布局分离纵向和横向视图

引导页脚旋转问题