问题标签 [viewdidlayoutsubviews]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
568 浏览

swift - 在 ViewDidLayoutSubviews 中定义的帧位置不正确

我有一个受自动布局约束的imageView内部。ovalView

在里面viewDidLayoutSubviews(),我正在创建一个 UILabel

标签的框架显示与 imageView 稍微偏离中心。

但是,如果我将上面的代码移到里面viewDidAppear(),标签完全以 imageView 为中心,但用户会看到不希望出现的变化。

如何保存我的代码viewDidLayoutSubviews()并使其工作?

0 投票
2 回答
684 浏览

ios - iOS 11.0.1 在 vi​​ewDidLayoutSubviews 中崩溃

我的 ViewController 中有几个最初隐藏的 UIView。一旦我从 Firebase 获得成功响应,它们就会被隐藏。这些最初隐藏的视图具有我viewDidLayoutSubviews()根据设备大小修改的约束(来自 Storyboard)。

在 iOS 11.0 之前,这一切都很完美。完美 = 视图仍然隐藏。一旦 Firebase 返回一个值,视图就会变得不隐藏,并且根据我在viewDidLayoutSubviews().

从 iOS 11.0.1 及更高版本开始,我现在正在崩溃viewDidLayoutSubviews().

这是我的代码,它在iOS 11.0.1 及更高版本viewDidLayoutSubviews()中导致崩溃。

welcomeViewWidthConstant并且welcomeViewHeightConstant是在 Firebase 响应之前不可见的视图的高度和宽度约束。

再一次,以上在 iOS 11.0 中运行完美

如何在 iOS 11.0.1 及更高版本中设置约束(基于设备大小)?

0 投票
1 回答
97 浏览

objective-c - viewDidLayoutSubViews 中的 UI 代码在运行时无法正确呈现

我最近一直在与我的视图控制器进行斗争,以在UIView.

*编辑,这是用于静态表格视图(我将其用作表单)。我知道在 .xib 中舍入单元格并重用单元格,但是我没有重用单元格,这种方法对我没有用。

我有一个带有静态表格视图的屏幕,它嵌入在 a 中UIView并显示在 main 上View Controller。我一直遇到边框问题,就好像我在viewDidAppear添加边框的方法之前将它设置在任何地方都会使用错误的尺寸并错误地显示边框一样。这是我用来向 UIView 添加边框的方法:

注意 * 要修复单个单元格尺寸错误的错误(始终是表格中的最后一个单元格),我将根据UITableView包含的边界层设置边框层的宽度。

无论如何,我最终发现,viewDidAppear我应该使用而不是使用viewDidLayoutSubviews来设置我的 UI 几何,因为此时视图已经计算了它的尺寸。这是一种享受,我的单元格将显示为圆形边框......但是渲染本身存在问题。

首先让我们看一下从viewDidAppear.viewDidAppear 中四舍五入的单元格

一切看起来都很好,这正是我希望我的单元格看起来的样子(我已经删除了它们的内容以仅显示边框)。让我们看看我用来对单元格进行舍入的代码。

现在让我们改变我打电话configureCells的地方,看看有什么不同。

改变的只是我从哪里调用这个方法。从理论上讲,这应该是配置我的 UI 的正确位置(当然比调用 from 更优化viewDidAppear)。

在 viewDidLayoutSubViews 中四舍五入的单元格

如您所见,在单元格的角落周围有一些非常明显的“失真”。提供的图片来自模拟器,但我在设备上尝试过并得到相同的结果(可能在我的手机上看起来更糟)。

我不知道为什么会发生这种情况,这意味着虽然我的代码已经从viewDidAppear. 我认为会有一个渲染选项我可以调整,viewDidLayoutSubViews但似乎找不到任何东西。非常感谢所有建议!

0 投票
1 回答
1437 浏览

ios - viewDidLayoutSubviews 卡在空白方法的无限循环中

我有一个在 UIStoryboard 中使用 UITableView 设置的视图控制器。UITableView 在所有四个边上都被限制在控制器的 SafeArea 中。

这个问题好像以前也有人问过,但是每次我发现这个问题,都是因为viewDidLayoutSubviews发生了变化,导致了循环的发生。我有 viewDidLayoutSubviews 和基本 UITableViewCells 的空白实现(无笔尖)。然而在 iOS 11、Xcode 9.2 中,向上轻弹 tableview 会导致 viewDidLayoutSubviews 在无限循环中被调用。这是我的实现:

我一生都无法弄清楚这是怎么发生的。

编辑:控制器有一个 NavigationController 并且是 UISplitViewController 的主控制器,它嵌入在 BannerViewController 中(来自 iAdSuite 示例)。

编辑:这发生在模拟器上所有设备的 iOS 11(直到 11.2)上。不会发生 iOS 10.3。viewDidLayoutSubviews在 iOS 10.3 中甚至没有调用。当我简单地使用导航控制器和 UIViewController/TableView 代替 UISplitViewController/BannerViewController 时,我得到了相同的结果。所以似乎这个问题不是在那里介绍的,而是来自 iOS 11 中正在发生的事情。

编辑:所以这很奇怪 - 似乎只有在为导航控制器选择大标题时才会发生!

编辑:这个问题很容易重现。我下载了 Apple 的 iAd Suite 示例代码,并使用了 SplitNavigationController 项目。我更新了 iOS 11 的项目,包括更新故事板以使用安全区域布局指南。我将 MasterViewController 从 UITableViewController 更改为带有 UITableView 的 UIViewController,我将其限制为情节提要中的安全区域布局指南。我在 MasterViewController 中添加了 prefersLargeTitles 和 largeTitleDisplayMode。我在 viewDidLayoutSubviews 方法中添加了一个 NSLog 语句,因此可以很容易地观察到这种行为。我认为这是 iOS 11 的一个真正问题,我将尝试深入了解它,如果其他人可以提供任何想法或建议,我也将不胜感激。

编辑:matt 能够重现此问题并将其发布在 GitHub 项目中,可在以下链接中找到(感谢 matt!):InfiniteLayoutSubviewsBug

0 投票
1 回答
45 浏览

objective-c - 如何使用故事板、initWithCoder、viewDidLoad 和 viewDidLayoutSubviews 有效地管理屏幕尺寸更改和重绘?

我正在使用情节提要布局来设置视图布局。

我同时支持 iPhone 和 iPad 布局。

当使用 视图创建视图时initWithCoder:,它最初是使用我上次在 Interface Builder 中查看的设备的帧大小创建的。

如果我在界面生成器中使用 iPhone X 布局进行设计,然后在 iPad 上构建和运行,则视图最初是使用 iPhone X 屏幕尺寸创建的。然后viewDidLayoutSubviews:被调用,它将屏幕尺寸更新为正确的 iPad 尺寸。

  1. 子视图drawRect在 UIViews 内部使用来绘制视图图形。我这样做是为了可以通过代码更改图形颜色。我更改颜色变量,然后调用setNeedsDispay视图以使用CGGraphicsContext命令用新颜色重绘视图。

  2. 它还允许我以任何大小绘制任何图形图像。并且有很多图形,这意味着我不必在我的捆绑包中包含所有 1x、2x 和 3x 尺寸的不同图像。这一切都是动态绘制的。

  3. 其中一些图像是在视图加载时而不是在 Interface Builder 中布置的。所以我检查屏幕大小并相应地绘制按钮大小和位置。

发生的事情是,viewDidLoad被调用,它根据初始屏幕大小绘制图形。

然后viewDidLayoutSubviews被调用,我必须更新我放置的子视图的绘图,根据新的屏幕尺寸手动重新定位它们,然后调用drawRect它们。我觉得这对设备来说只是不必要的额外工作。

除此之外,viewDidLayoutSubviews由于其他原因而被调用,然后只是在 viewController 的初始加载时调整视图的大小。所以每次调用它都会重新绘制子视图,即使它们不需要它。

而且,如果我正在运行的设备与我在 Interface Builder 中使用的设备相同,它不会调用viewDidLayoutSubviews. 我不能让视图布局那里的子视图,因为不能保证它会被调用。

到目前为止,我的解决方案是创建一个变量来跟踪屏幕宽度。我将变量设置在viewDidLoad. 如果它以 iPhone X 大小创建视图,我的screenWidthTracker = 1125. 当viewDidLayoutSubviews被调用时,我将当前屏幕尺寸与 screenWidthTracker 进行比较。

如果视图改变了大小,它会发送一条消息来重绘视图。我作为子视图手动放置的任何视图都注册为侦听@“updateView”。

有没有更好的方法来管理这个?有没有一种方法只在屏幕尺寸发生变化而不是在更新其他子视图的位置时才被调用?我应该使用 viewDidAppear 吗?我觉得这在链条中为时已晚,我不希望用户看到按钮大小的更新。

0 投票
2 回答
39 浏览

ios - 当我开始输入蓝色时,我想更改文本字段的底层颜色

何时使用此功能在视图中显示:

输出 :何时点击 textFieldDidBeginEditing

当点击“名称”文本字段时,底层背景颜色将变为蓝色。但是当我在文本字段中输入一些字符时,文本字段的底部颜色将变为浅灰色(但当我输入时,底层将与蓝色相同。)

输出 :当我开始打字

有人可以帮忙吗???

0 投票
1 回答
63 浏览

ios - 为什么文本字段中的水平线在 Swift 中 ipad 的横向模式下会发生冲突?

我在 Xcode 9、iOS 11 中使用此代码。

在 iPad 中使用该代码和测试时。问题是当我在横向模式下旋转 iPad 时,文本字段的水平线(底部)发生冲突。

纵向模式下的 iPad

横向模式下的 iPad

有人可以帮忙吗?

0 投票
2 回答
1471 浏览

ios - 使用 viewDidLayoutSubviews() 自动调整圆角半径而不是在显示之前更新视图

我是 swift 和 Xcode 的新手,所以可能有一个简单的答案或更好的方法来做到这一点。我正在尝试为所有尺寸的 iOS 设备中的按钮制作圆角边缘,到目前为止我发现的最佳方法是使用此方法:

我在我的 viewDidLoad 方法中调用 loadUI() 方法来说明它的价值:

问题不是在我第一次启动应用程序时出现(这是第一个场景/视图控制器),而是当我从第二个视图控制器回到这个场景时出现问题。

发生的情况是按钮被格式化了大约半秒钟,然后它们被完美地重新格式化:

格式正确的截图

格式不正确的截图

您会注意到第二张图像(仅出现约 0.5 秒)具有更强烈的角半径。

我怎样才能防止这种情况发生,以便用户只看到每个按钮的完美圆角半径而不是可怜的 janky 按钮?

谢谢!

0 投票
0 回答
466 浏览

ios - Swift 4:didSet @IBOutlet 调用 viewDidLayoutSubviews,但不使用 addSubview()

什么时候selectCard被调用,通过注释掉我发现的代码的各个部分,只有在函数中更新viewDidLayoutSubviews时才被调用。只有当我们有 时才会更新分数。为什么会这样?scorecheckIfCardsMatchmatchedCards

我想viewDidLayoutSubviews每次selectCard都叫。我注意到如果我添加CardTable.addSubview(grid)到我的resetTable函数中,而不是viewDidLayoutSubviews每次selectCard在分数更改时调用 EXECPT。

这里发生了什么,我如何确保viewDidLayoutSubviews在每次选择卡时都被调用?

}

整个文件:

0 投票
1 回答
156 浏览

ios - 为什么 (isMovingToParentViewController) 中的代码不在 viewDidLayoutSubviews() 中运行

我有一个 viewController,我正在使用锚点,我想获得一个按钮的框架。我只想要在视图被推送时的框架,所以我使用isMovingToParentViewController. 像这样:

当我在viewWillAppear代码中添加它以使按钮的框架运行但当我向它添加相同的代码时viewDidLayoutSubviews它不会运行。

这是为什么?

只是为了清楚,viewDidLayoutSubviews当我添加一个断点时它确实命中if isMovingToParentViewController但其中的代码永远不会被命中。

当视图被推送到 isMovingToParentViewController时,它会被击中,当它弹出时,isMovingToParentViewController不会被击中。