0

我目前正在尝试使用放置在 .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 时,调整大小起作用了;虽然它会产生许多其他问题......

4

4 回答 4

3

启用自动布局后,在 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

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

于 2013-06-06T02:22:51.463 回答
0

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 函数内的子视图。

于 2013-06-06T02:43:03.603 回答
0

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

于 2013-06-06T02:04:08.500 回答
0

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

于 2013-06-05T18:10:36.430 回答