【问题标题】:UIVIew from XIB with Autolayout to UItableView Header从 XIB 到 UItableView Header 的 UIVIew
【发布时间】:2015-06-08 14:24:19
【问题描述】:

我之所以写,是因为我的自动布局有问题。 我正在尝试使用自动布局在 InterfaceBuilder 中创建一个简单的视图我想加载代码并作为表的标题输入(而不是作为标题部分)。我简要解释一下有哪些特点。 imageView 必须是方形的,并且必须与屏幕一样宽。 图片下方到包含按钮和标签的视图底部的空间必须高 50 磅。 图像和按钮之间必须是 12 点的固定距离。 图像和标签之间必须是 13 点的固定距离。

所有这些功能都可以通过自动布局获得。我为图像的纵横比(1:1)和距离的各种约束添加了一个约束。好的。

真正的问题是,通过在 iphone 6+ 模拟器(414 点宽度)上启动应用程序,图像(带有标签和按钮)会出现在单元格上方。

启用各种透明胶片我注意到 Image View 的 superView 只会增加宽度。它不会增加它的高度!我该如何解决?

这是代码:

- (void)viewDidLoad{
//...    
PhotoDetailsHeaderView *hView = (PhotoDetailsHeaderView *)[[[NSBundle mainBundle] loadNibNamed:@"PhotoDetailsHeaderView" owner:self options:nil] objectAtIndex:0];
    hView.delegate = self;
    
    self.tableView.tableHeaderView = hView;
//...
}

这就是我创建 xib 的方式:

模拟器上是这样的,绿框是Uiimageview,黄框(绿框下方)是主视图(或超级视图):

如何解决?

非常感谢大家!

【问题讨论】:

  • 无法理解您的问题,请详细说明一下这个完整的视图是您在 tableView 上方的视图,或者这个视图是您的 uitableview 的一部分。
  • 我设置为 headerView 的视图是 UIView 的子类: PhotoDetailsHeaderView *hView = (PhotoDetailsHeaderView *)[[[NSBundle mainBundle] loadNibNamed:@"PhotoDetailsHeaderView" owner:self options:nil ] objectAtIndex:0]; hView.delegate = 自我; self.tableView.tableHeaderView = hView;

标签: objective-c uitableview xcode6 autolayout xib


【解决方案1】:

您需要添加一个属性来存储您的PhotoDetailsHeaderView

@property (nonatomic, strong) PhotoDetailsHeaderView *headerView;

然后在viewDidLayoutSubviews 中计算它的预期帧。如果需要更新,请更新其框架并重新设置tableHeaderView 属性。最后一步将强制 tableView 适应 header 的更新帧。

- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];

    CGRect expectedFrame = CGRectMake(0.0,0.0,self.tableview.size.width,self.tableView.size.width + 50.0);

    if (!CGRectEqualToRect(self.headerView.frame, expectedFrame)) {
        self.headerView.frame = expectedFrame;
        self.tableView.tableHeaderView = self.headerView;
    }
}

【讨论】:

  • 有了这个解决方案,我得到了想要的结果。谢谢你。我希望避免编写代码,我想避免在代码中编写大小,但如果不能以其他方式做到这一点,那没关系。使用自动布局做所有事情的结果会很棒。非常干净..
  • 要使用自动布局实现相同的效果,您需要使用systemLayoutSizeFittingSize: 计算框架。见stackoverflow.com/a/28102175
  • 我试过但不幸的是高度为零。在我的情况下它不起作用
  • 这可能意味着您的约束允许零高度;也许没有任何东西被固定在超级视图的底部。您会将此答案标记为正确吗?
【解决方案2】:

问题可能是在 iOS 中您必须手动重置表格视图的标题(如果它已更改其大小)。尝试以下方式:

CGRect newFrame = imageView.frame;
imageView.size.height = imageView.size.width;
imageView.frame = newFrame;
[self.tableView setTableHeaderView:imageView];

此代码应在视图控制器的-(void)viewDidLayoutSubviews 方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多