【问题标题】:UIImageView not correctly updating boundsUIImageView 没有正确更新边界
【发布时间】:2013-06-05 18:03:05
【问题描述】:

我目前正在尝试使用由放置在 .xib 文件上的 UIImageView 表示的 HP 仪表来编写游戏。我声明我的 IBOutlet 如下:

@property (weak, nonatomic) IBOutlet UIImageView *hpGaugeView;

并据此合成。它还链接到 xib 中的 UIImageView 实例。

在 xib 中,我将 hpGaugeView 的长度设置为 188,高度设置为 9。

现在这就是我在 viewDidLoad 中所做的:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [hpGaugeView setFrame:CGRectMake(49, 18, 123, 9)];
    NSLog(@"%f, %f", [hpGaugeView frame].size.width, [hpGaugeView frame].size.height);
}

虽然 NSLog 告诉我 hpGaugeView 的宽度是 123,但当我运行它时,与 xib 中的长度相比,长度似乎没有变化。所有其他 setFrame: 或 setBound: 在其他 viewControllers 中工作正常,所以我只是想知道这里发生了什么。

这是一个小而关键的问题,连续困扰了我几个小时......

编辑: 当我关闭 AutoLayout 时,调整大小起作用了;但它会产生许多其他问题......

【问题讨论】:

  • 你在使用AutoLayout吗?如果是这样,UIImageView 可能会被限制为 nib 中的固定大小,并且正在重新调整为原始大小。
  • 这行得通!但我必须放弃所有的限制......
  • 尝试在 viewDidLayoutSubviews 中设置框架并开启自动布局

标签: ios objective-c


【解决方案1】:

启用自动布局后,在 viewDidLoad 期间子视图尚未放置。稍后会计算约束,您可以覆盖 viewDidLayoutSubviews 方法来设置框架:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    // Do any additional setup after subviews are laid.
    [hpGaugeView setFrame:CGRectMake(49, 18, 123, 9)];
    NSLog(@"%f, %f", [hpGaugeView frame].size.width, [hpGaugeView frame].size.height);
}

来自类参考:

viewDidLayoutSubviews

通知视图控制器它的视图刚刚布置了它的子视图。

【讨论】:

    【解决方案2】:

    我认为问题在于您没有更改UIImageView 的框架。边界是指视图在它自己的坐标系中的位置和大小,而框架是指它的超级视图坐标系中的位置和大小。 如果 clipsToBounds 属性设置为 YES,则视图框架之外的任何内容都将不可见。

    【讨论】:

    • 我也尝试过使用 setFrame: 但它仍然不起作用。更新后的代码将是 [hpGaugeView setFrame:CGRectMake(49, 18, 123, 9)];但仍然没有显示变化。当我关闭自动布局时,我可以通过 setFrame 解决它。
    【解决方案3】:

    事实证明,笔尖和代码之间存在一些奇怪的奇怪交互......当我以编程方式创建 UIImageView 时,它运行良好。

    【讨论】:

      【解决方案4】:

      AutoLayout 属性仅适用于 IOS 6.0 以上。将控件拖动到XIB而不是您可以通过代码创建UIImageView并添加到当前视图。我已经给出了以编程方式添加 UIImageView 的代码。

      源码:

      // .h file
      @property (weak, nonatomic) UIImageView *hpGaugeView;
      
      //.m file
      - (void)viewDidLoad
      {
          [super viewDidLoad];
      
          hpGaugeView = [[UIImageView alloc] init];
      
          [hpGaugeView setFrame:CGRectMake(49, 18, 123, 9)];
      
          [self.view addSubview:hpGaugeView];
      
      }
      

      通过编程方式初始化并将hpGaugeView添加到viewDidLoad函数内的子视图中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 2014-01-24
        • 1970-01-01
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多