确定UIView何时完成布局

Evg*_*ban 10 objective-c uiview ios

我有UIView子类,并且为了布局UI元素,我没有使用自动布局.我想设置框架取决于框架的宽度或高度.但是,当我在alloc]init]方法之后立即执行此操作时,它看起来像self.frame.size.height或width为零.对于临时解决方案我做了以下:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.25 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        UIImage *img = [UIImage imageNamed:@"sound_level_arrow"];
        _arrowImgView = [[UIImageView alloc] initWithFrame:CGRectMake(self.frame.size.width/2, 0, img.size.width, img.size.height)];
        _arrowImgView.center = CGPointMake(self.mainImgView.frame.size.width/2, self.mainImgView.frame.size.height-2);
        _arrowImgView.image = [UIImage imageNamed:@"sound_level_arrow"];
        _arrowImgView.contentMode   = UIViewContentModeCenter;
        [self.mainImgView addSubview:_arrowImgView];
    });
Run Code Online (Sandbox Code Playgroud)

但是当然我需要知道,当视图完成加载并且它具有实际的self.frame.size.width和height.

rob*_*off 11

如果要在自定义视图子类中执行此操作,请layoutSubviews在该类中重写.由于iOS可能会发送layoutSubviews多次,因此请注意仅_arrowImgView在第一次创建时:

- (void)layoutSubviews {
    [super layoutSubviews];

    if (_arrowImgView == nil) {
        UIImage *image = [UIImage imageNamed:@"sound_level_arrow"];
        _arrowImgView = [[UIImageView alloc] initWithImage:image];
        _arrowImgView.contentMode = UIViewContentModeCenter;
        [self addSubview:_arrowImgView];
    }

    CGRect myBounds = self.bounds;
    CGRect mainFrame = self.mainImageView.frame;
    _arrowImgView.bounds = CGRectMake(0, 0, myBounds.size.width, myBounds.size.height);
    _arrowImgView.center = CGPointMake(mainFrame.size.width / 2, mainFrame.size.height - 2);
}
Run Code Online (Sandbox Code Playgroud)

  • 我觉得很奇怪你建议在`layoutSubviews`中创建和添加子视图.不应该在适当的`init`方法中完成吗?`layoutSubviews`应该这样做 - 布局子视图.除了设置框架之外,它不是创建,显示,隐藏或更改子视图的地方. (3认同)
  • 请允许我引用 [iOS 视图编程指南的“手动调整视图布局”部分](https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/CreatingViews .html#//apple_ref/doc/uid/TP40009503-CH5-SW48):“您对该方法的实现可以执行以下任何操作:……添加或删除子视图或核心动画层。” (3认同)
  • 谢谢。我以前没有注意到。在过去的十年中,我一直认为该方法仅应用于设置框架。 (3认同)