Objective c 在排列UI元素之前未完全形成CGRect

Objective c 在排列UI元素之前未完全形成CGRect,objective-c,cgrect,Objective C,Cgrect,我有以下代码 - (void) setTargetGoalFrameToLeftOfWindow: (UIView*) goalView orientation: (UIInterfaceOrientation) orientation { [goalView setTransform:CGAffineTransformMakeRotation(-M_PI_2)]; CGRect goalFrame = goalView.frame; CGRect windowFram

我有以下代码

- (void) setTargetGoalFrameToLeftOfWindow: (UIView*) goalView orientation: (UIInterfaceOrientation) orientation {
    [goalView setTransform:CGAffineTransformMakeRotation(-M_PI_2)];

    CGRect goalFrame = goalView.frame;
    CGRect windowFrame = [self getWindowFrame];

    CGFloat topMargin;
    if (UIInterfaceOrientationIsLandscape(orientation)) {
        topMargin = (windowFrame.size.width - goalFrame.size.height) / 2.0;
    } else {
        topMargin = (windowFrame.size.height - goalFrame.size.height) / 2.0;
    }

    goalView.frame = CGRectMake(GOAL_MARGIN, topMargin, goalFrame.size.width,     goalFrame.size.height);
}

我用CGRect创建框架,并使用它显示我的UI元素,如标签、按钮等。我根据窗口大小计算位置,以便它们在不同方向上处于适当位置。当我的应用程序运行时,我点击主页按钮。当我再次打开应用程序时,我的UI元素被弄乱了。他们的位置不合适。每次我更改方向并打开应用程序时,都会调用上面提到的方法。因此,当我重新打开应用程序时,会调用此函数。但问题是,即使在框架完全成形之前,它也会计算特定点的宽度和高度,并计算UI元素的位置。这将导致混乱的用户界面。有没有办法,我可以限制它采取宽度和高度后,框架完全形成?谢谢

你什么时候调用那个方法?在视图框架存在之前,您可能调用它太早了。尝试在ViewDidLoad中执行此操作。我正在实现UIView,因此无法使用ViewDidLoad方法。我订阅了设备方向更改以及应用程序从非活动状态变为活动状态时的通知。我在那里调用它。更准确地说,我调用它作为UIApplicationIDBecMeactiveNotification和UIDeviceOrientationIDChangeNotification的选择器。顺便说一句,视图的框架之所以存在,是因为我能够看到我的UI元素。但我猜框架并不是完全形成的,因为它采用了错误的宽度和高度,并以不希望的方式替换了它。我参考了这个线程,解决了我的问题。谢谢