下载图像后iOS更新tableheader高度(约束未更新)

时间:2017-03-15 09:39:58

标签: ios uitableview

我在Tableheader中有这样的图像。

enter image description here

下载图像后,我需要更新该图像的高度,并更新tableheader的高度。

[self.ivMain setImageWithURL:[NSURL URLWithString:@"http://www.naturefineartphotos.com/wordpress/wp-content/uploads/2014/11/utah_aspenfamilyportrait_1001.jpg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

    dispatch_async(dispatch_get_main_queue(), ^{
        CGFloat height = (image.size.height/ image.size.width) * CGRectGetWidth(self.frame);
        [self.constraintIVMainHeight setConstant:height];

        [self.delegate setTableHeader];
    });

} usingActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];

但是桌面高度不会改变。我想tableview限制,我尝试像这样更新我的布局。

- (void)setTableHeader {
        [self.vwEventDetail removeFromSuperview];
        [self.tblDetail setTableHeaderView:[[UIView alloc] initWithFrame:CGRectZero]];
        [self.vwEventDetail layoutSubviews];
        [self.vwEventDetail setNeedsLayout];
        [self.tblDetail setTableHeaderView:self.vwEventDetail];
}

这也不行。我该怎么办?如果我使用自动调整大小,很容易。为什么使用约束很困难?难道我做错了什么?

1 个答案:

答案 0 :(得分:1)

事实:约束不适用于tableheader视图。它总是需要设置其框架以调整大小。

<强>问题:

(1)您正在布局没有超级视图的视图。这不起作用。

[self.vwEventDetail removeFromSuperview];

(2)当您设置tableview标头时,您使用的视图成为标题视图。和标题视图不适用于高度约束。它会忽略它。即使你在设置它之后进行布局。

提议的解决方案:

  1. 定义一个始终保存tableview的全局int变量。用零启动它。
  2. 下载完成后,将新高度设置为该变量。
  3. 更新图像或其超级视图的高度约束。
  4. 然后,布局控制器视图。 (self.view)。
  5. 布局viewDidLayoutSubviews中的
  6. 使用height var。
  7. 设置表头框架
      

    注意:始终将您的观点保留在标题视图中。添加它们   故事板并且不要在运行时将其删除。

    <强>快照: enter image description here

    代码示例(Swift):

    class ViewController: UIViewController {
    
        @IBOutlet weak var containerView: UIView!
        @IBOutlet weak var headerView: UIView!
        @IBOutlet weak var imageHeightConstraint: NSLayoutConstraint!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        func donwloadFinished() {
            imageHeightConstraint.constant 
                      = (image.size.height/ image.size.width) * CGRectGetWidth(self.frame);
            self.view.layoutIfNeeded()
            self.view.layoutSubviews()
            self.view.setNeedsLayout()
        }
    
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
    
            headerView.frame = containerView.frame
        }
    }
    

    Public github project