【问题标题】:Can't programmatically move label in viewDidLoad无法以编程方式在 viewDidLoad 中移动标签
【发布时间】:2012-11-29 01:45:25
【问题描述】:

如果是 iPhone 5(4" 显示器),我正在尝试将 uiLabel 向下移动。但是当代码在 viewDidLoad 中时它不起作用。如果我通过单击 uiButton 调用代码,它可以工作。这里是代码:

-(void) viewDidLoad {
    if(CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size,CGSizeMake(640, 1136))) {
        CGRect frame = [self.timeOnCurrentQuestion frame];
        frame.origin.y += 40;  // change the location
        [self.timeOnCurrentQuestion setFrame:frame];
        nslog(@"This DOES get logged");
    }
}

【问题讨论】:

  • 我认为调用 viewDidLoad 时还没有设置框架,请在 viewDidAppearAnimated 中尝试:
  • 是否有可能实际设置了框架,但您没有注意到?将您的更新包装在一个动画块中,并稍微延迟它的执行,这应该会向您展示正在发生的事情。只需使用 performSelector:withObject:afterDelay: 以不同的方法调用框架设置代码来修复它。
  • @CodaFi 有趣。如果我将延迟设为 0.1,它会向下移动,但随后会向上移动。如果它变成 0.6-.7,它就会出现并迅速向下移动。所以这一定意味着它是在设置框架之前被调用的
  • @JonahKatz,是的。 viewDidLoad 和 awakeFromNib 并不是为了让视图的可见更改生效,它们是为了在渲染缓冲区绘制到屏幕之前进行设置。
  • @CodaFi 那么你建议我做什么?

标签: objective-c ios viewdidload


【解决方案1】:

Jonah,您是否在 viewWillAppear 方法中尝试过您的代码?也许,它会解决你的问题。

【讨论】:

  • 好的,让我通过示例代码尝试一下,并会相应地更新您。
  • 我在 viewDidLoad 中尝试了下面的代码,它工作正常。请看一下这段代码。 NSString str1 = [NSString stringWithFormat:@"%f",[[[UIDevice currentDevice] systemVersion] floatValue]]; NSArray testArr = [str1 componentsSeparatedByString:@"."]; if([[testArr objectAtIndex:0] isEqual:@"5"]) { CGRect frame = [testLbl frame]; frame.origin.y += 40;//78 [testLbl setFrame:frame]; } NSLog(@"我的测试标签的y是:->%d",(int)testLbl.frame.origin.y);希望,它会是你要找的。 :)
  • 如有任何疑问,请告诉我... :)
【解决方案2】:

也许这是你需要提防的事情。

- (void)viewDidLoad 

这是控制器juz创建视图时的方法。

例如: 也许在你的 init 方法中,你调用了类似的东西:

[self.view setBackground:[UIColor redColor]];
self.timeOnCurrentQuestion = [[UIView alloc] initWithFrame:kFrame];

在这种情况下,工作流程是这样的:

[self.view setBackground:[UIColor redColor]];
[self viewDidload];
self.timeOnCurrentQuestion = [[UIView alloc] initWithFrame:kFrame];

这个工作流程的原因是因为调用了self.view,然后在正常的视图循环之前需要它的视图,所以,在这种情况下,viewDidload方法中的self.timeOnCurrentQuestion仍然是nil。

我不知道我的做法是不是最好的。

我总是在控制器的 init 方法中初始化 subView。 并在 [self viewDidload] 中执行 [self.view addSubview:_subview](//或所有需要 self.view 的方法调用);

【讨论】:

    【解决方案3】:

    viewDidAppear 为我工作。生命周期似乎是

    1. 加载视图()
    2. viewDidLoad()
    3. viewWillAppear()
    4. viewDidAppear()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多