如何获得受约束拉伸的视图的高度? - iOS

时间:2018-02-07 11:13:52

标签: ios swift autolayout

我有以下视图层次结构:

  • 根视图
    • 儿童视图

根的高度和宽度已经被约束(顶部,底部,前导,尾随)拉伸,并且应该是大约500.子的高度也是由约束设置的,所以它也应该等于500。

一切看起来都不错,但是当我访问孩子的frame.bounds.height时,它会返回整个屏幕的高度,而不是估计的500.更糟糕的是,当我访问frame.bounds.height时Rootview它返回0,因为我已将帧设置为.Zero。

我现在的问题是,如何通过约束拉伸视图中的宽度和高度?在我看来,.frame.bounds不适用于autolayout。

展示:

    print("collectionView height: ", String(describing: collectionView.frame.height) )
  

高度:0.0

CollectionView是棕色视图:

enter image description here

我的主要目标是制作一个与棕色collectionView一样大的单元格。但这失败了,因为我无法获得动态大小的collectionView的宽度。

1 个答案:

答案 0 :(得分:0)

根据评论,看起来我帮助解决了这个问题。它可以归结为视图控制器"生命周期",以及#34;帧"已知"。

缩写生命周期是:

  • viewDidLoad中
  • viewWillAppear中
  • viewWillLayoutSubviews
  • viewDidLayoutSubviews
  • viewDidAppear

使用控制台和/或断点进行简单检查 - 这将显示以下几点:

  • 虽然from django.db import transaction #signup form def signup(request): if request.method =='POST': form = SignUpForm(request.POST) if form.is_valid(): #atomic makes sure that the changes are only commited if the entire block of code is succesfully completed with transaction.atomic(): new_user = form.save() transaction_signup = Transaction( user_debit = new_user, user_credit = get_user_model().objects.get(id=1), exchange_amount = 1, currency_id = Curreny.objects.get(id=3) ) transaction_signup.save() #We want to log in the user after his sign up username = form.cleaned_data.get('username') raw_password = form.cleaned_data.get('password1') user = authenticate(username=username, password=raw_password) login(request, user) return redirect('/') else: form = SignUpForm() return render(request, 'sign-up.html', {'SignUpForm': form}) 知道边界,但它对框架一无所知。
  • viewDidLoad 可能知道框架,但多次调用(通常)。 viewWillLayoutSubviews viewDidLayoutSubviews`而*可能不止一次被调用,是"保证"的最早时刻。框架大小。

我被要求发布这个作为答案,但我在这里寻找更好的来源。我发现了两个 - 两个都是同一个问题的一部分。

UIViewController lifecycle

前三个答案都很好(我更喜欢第三个答案,以便与这个问题进行最佳匹配。)

对于这个问题,它可以确定何时可以确定帧大小是已知的。 -可能有效,但如果有效,viewWillLayoutSubviews就是最佳选择。