无法获得UIView sizeToFit来做任何有意义的事情

时间:2010-10-15 22:43:18

标签: iphone ios uiview resize uibutton

当我向UIView添加子视图时,或者当我调整现有子视图的大小时,我希望[view sizeToFit][view sizeThatFits]能够反映这一变化。但是,我的经验是sizeToFit什么都不做,sizeThatFits在更改之前和之后返回相同的值。

我的测试项目有一个包含单个按钮的视图。单击该按钮会向视图添加另一个按钮,然后在包含视图上调用sizeToFit。在添加子视图之前和之后,视图的边界将被转储到控制台。

- (void) logSizes {
 NSLog(@"theView.bounds: %@", NSStringFromCGRect(theView.bounds));
 NSLog(@"theView.sizeThatFits: %@", NSStringFromCGSize([theView sizeThatFits:CGSizeZero])); 
}

- (void) buttonTouched { 
 [self logSizes];
 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 btn.frame = CGRectMake(10.0f, 100.0f, 400.0f, 600.0f);
 [theView addSubview:btn];
 [theView sizeToFit];
 [self performSelector:@selector(logSizes) withObject:nil afterDelay:1.0];
}

输出是:

2010-10-15 15:40:42.359 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:42.387 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}
2010-10-15 15:40:43.389 SizeToFit[14953:207] theView.bounds: {{0, 0}, {322, 240}}
2010-10-15 15:40:43.391 SizeToFit[14953:207] theView.sizeThatFits: {322, 240}

我必须在这里遗漏一些东西。

感谢。

4 个答案:

答案 0 :(得分:50)

文档非常明确。 -sizeToFit几乎调用-sizeThatFits:(可能以视图的当前大小作为参数),-sizeThatFits:的默认实现几乎不执行任何操作(它只返回其参数)。

某些UIView子类覆盖-sizeThatFits:以执行更有用的操作(例如UILabel)。如果您想要任何其他功能(例如调整视图大小以适合其子视图),您应该继承UIView并覆盖-sizeThatFits:

答案 1 :(得分:3)

如果你不会覆盖UIView,你可以使用扩展名。

夫特:

extension UIView {

    func sizeToFitCustom () {
        var size = CGSize(width: 0, height: 0)
        for view in self.subviews {
            let frame = view.frame
            let newW = frame.origin.x + frame.width
            let newH = frame.origin.y + frame.height
            if newW > size.width {
                size.width = newW
            }
            if newH > size.height {
                size.height = newH
            }
        }
        self.frame.size = size
    }

}

相同的代码,但速度提高了3倍:

extension UIView {
    final func sizeToFitCustom() {
        var w: CGFloat = 0,
            h: CGFloat = 0
        for view in subviews {
            if view.frame.origin.x + view.frame.width > w { w = view.frame.origin.x + view.frame.width }
            if view.frame.origin.y + view.frame.height > h { h = view.frame.origin.y + view.frame.height }
        }
        frame.size = CGSize(width: w, height: h)
    }
}

答案 2 :(得分:0)

你可以单独使用IB(xcode 4.5):

  1. 点击UIView
  2. 在尺寸检查器中
  3. content hugging拖动到1(水平和垂直)
  4. compression resistance拖至1000(两者都是)
  5. 根据UIView constraints点击Width并将priority更改为250
  6. 为Height做同样的事情
  7. 您可以使用UIView的{​​{1}}来控制左/右/上/下的填充

答案 3 :(得分:0)

        self.errorMessageLabel.text = someNewMessage;

    // We don't know how long the given error message might be, so let's resize the label + containing view accordingly
    CGFloat heightBeforeResize = self.errorMessageLabel.frame.size.height;

    [self.errorMessageLabel sizeToFit];

    CGFloat differenceInHeightAfterResize = self.errorMessageLabel.frame.size.height - heightBeforeResize;

    self.errorViewHeightContstraint.constant = kErrorViewHeightConstraintConstant + differenceInHeightAfterResize;

这对我有用。