我有一个自定义视图,layoutSubview
在动画期间没有收到消息.
我有一个填充屏幕的视图.如果我更改导航栏的高度,它在屏幕底部有一个自定义子视图,可以在Interface Builder中正确调整大小.layoutSubviews
在创建视图时调用,但从不再调用.我的子视图已正确布局.如果我关闭通话中状态栏,layoutSubviews
则根本不会调用子视图,即使主视图确实为其调整大小设置了动画.
在什么情况下layoutSubviews
实际上被称为?
我已经autoresizesSubviews
设置NO
为我的自定义视图.在Interface Builder中,我有顶部和底部支柱以及垂直箭头设置.
我有一个自定义的UIView,它有一个专用的,手动设置的纵向和横向框架,因为autoresizingMasks在我的情况下不起作用.
我将此框架设置为:
- (void)viewWillAppear:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)
它按预期工作.
我现在的问题是,我的UIView还有子视图,也有专门的肖像/风景位置.
我将这些子视图放在:
- (void)layoutSubviews
Run Code Online (Sandbox Code Playgroud)
如果我现在离开我在的viewController 如纵向,旋转到另一个的viewController横向的,然后回来这个的viewController我看到我的观点得到了正确的调整,但我的观点的子视图,其中获得定位在layoutSubviews不重新定位还没有,但在视图已经出现后以动画方式调整大小.
我在viewDidAppear中什么也没做,我已经尝试过调用了
- (void)layoutIfNeeded
Run Code Online (Sandbox Code Playgroud)
以及:
- (void)setNeedsLayout
Run Code Online (Sandbox Code Playgroud)
在viewWillAppear中,但它似乎没有任何改变.
我有什么想法我做错了吗?
谢谢.
当更改UIView的某些属性时,它会layoutSubviews
在superview中触发.我在文档中找不到任何关于此的陈述.
这些属性触发superview和self中的布局
这些属性仅在superview中触发布局
这些属性仅触发自我布局
这些属性不会触发任何布局
我发现变换触发布局并且位置和anchorPoint没有变得非常混乱.
示例代码:https://github.com/hfossli/LayoutSubviewsInconsistency
我想知道:
我在文档和头文件中找不到任何相关内容.使用UIDynamics或类似产品时问题很严重.
我正在尝试将autolayout用于我正在创建的uitableviewcell子类,我将非常感谢有关放置布局约束创建代码的方法的一些建议.我一直在搜索并找到有关在viewDidLoad方法中添加子视图后添加约束的所有信息.据我所知,viewDidLoad不是uitableviewcell子类的选项.
我正在使用界面构建器来创建自定义单元格并在我的代码中动态分配它.没有什么特别的......我将uitableviewcell子类化,以便我可以向单元格添加自定义uiview.再一次,没有什么特别令人震惊的......当我尝试根据我添加到界面构建器中的单元格的标签来定位我的自定义uiview时,我遇到了困难.
这是创建自定义uiview并将其添加到单元格内容视图的代码:
- (id)initWithCoder:(NSCoder *)decoder
{
if ((self = [super initWithCoder:decoder]))
{
[self initSelf];
}
return self;
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]))
{
[self initSelf];
}
return self;
}
- (void) initSelf
{
// Initialization code
_badgeLabel = @"";
if (!_customBadge)
{
_customBadge = [CustomBadge customBadgeWithString:self.badgeLabel];
}
// hide the badge until needed
self.customBadge.hidden = YES;
// add badge to the cell view hierarchy
[self.customBadge setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal];
[self.customBadge setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisVertical]; …
Run Code Online (Sandbox Code Playgroud) 我有UIView
一堆子视图,全部定位使用layoutSubviews
.当view
调整大小,相对位置都在改变.我想这些重新计算(使用+动画调整大小时发生[UIView beginAnimations:]
调用).这似乎没有发生.有任何想法吗?
它似乎viewDidLayoutSubviews
是layoutSubviews
在视图上调用后立即调用,之后layoutSubviews
在该视图的子视图上调用.是否有任何方法可以知道何时layoutSubviews
调用视图以及所有需要更新布局的子节点?
像许多开发人员一样,我有一个通过UIView
子类使用OpenGL的应用程序,该子类的layerClass:
方法返回[CAEAGLLayer class]
.
注意我没有使用GLKit
或GLKView
或GLKViewController
当我点击Home将应用程序放入后台时applicationDidEnterBackground
,iOS调用我的视图layoutSubviews
两次,使用纵向和横向大小,尝试生成"应用程序快照",如此处所述(请参阅"准备应用程序快照"):
这怎么可能有效呢?
这里似乎有一个直接的矛盾与此页面上非常明确的建议(请参阅"后台应用程序可能无法在图形硬件上执行命令"):
以后我们不能用OpenGL绘制任何东西 applicationDidEnterBackground
如果我们不绘制,我们就无法生成快照.我们必须违反一条规则或另一条规则.
但我们也希望在两个方向都有很好的快照,这样当用户双击主页并转到App Switcher时,他们会看到合理的快照图像.
即使我暂时改变我的代码以通过创建OpenGL表面和绘图(这与Apple dox相反,不会崩溃)完全实现layoutSubviews
after applicationDidEnterBackground
,然后我双击home并以不同方向查看快照,仅我之前所处方向的快照是正确的.另一个是另一个快照的超级丑陋的重新缩放.Apple似乎正在经历拍摄快照的动作,但实际上没有拍摄它们.
我在iPad Mini上看到iOS 9.3.2上的这种行为.大多数/所有iPhone设备都没有显示该行为,因为它们不支持横向App切换器.
更新:问题也发生了,并且更糟糕的是,当使用新的iOS 9"幻灯片"多任务处理功能并在正常的全屏应用程序与在另一个应用程序上滑动的应用程序之间切换相同的应用程序时.iOS似乎只捕获最后一个应用程序大小的快照,所以在使用640px宽的应用程序然后尝试使用App Switcher进入应用程序全屏后,我们在应用程序中看到一个奇怪的像素超出比例的快照切换器也在发射的第一秒.必须有一些方法来解决这个问题!
更新2:我见过几个iOS应用程序,我知道这些应用程序是OpenGL专用的应用程序,如果你以纵向方式使用它们,那么回到Home并旋转到横向,然后双击Home,你会看到纵向启动图像而不是像我所看到的那种可怕的,扭曲的,不对称的图像.虽然我更喜欢渲染快照图像,但我甚至很乐意看到启动图像.但选择大家提到了,ignoreSnapshotOnNextApplicationLaunch
,不工作,因为它不仅影响你在实际的应用程序启动时间看,没有什么是在应用程序切换时看到您双击主页,并为许多在计算器上,它实际上甚至没有工作完全(甚至在发射时).
我们如何绕过这个Catch-22?
这个StackOverflow线程(与我不同,OP在这里使用GLKit,但症状是相同的):
确认iOS 上的一些OpenGL应用程序能够在Home双按应用切换器中为两个方向都拥有正确的预览图像.他们是如何做到的呢?
如何在App Switcher中以两个方向显示正确的快照?
这是一个来自iOS 的AppDelegate
(appdel),ViewController
(eaglc)和View
(eaglv)调用的日志,当我单击Home按钮一次退出应用程序时.您可以在以下情况下看到快照的尝试didEnterBackground
:
+ 189.57ms appdel appWillResignActive + 0.74ms appdel appWillResignActive between_view_os_callbacks 0 + …
我里面有一个原型单元,里面UITableView
有一个UILabel
.我想根据标签中文本的大小动态更改标签(和单元格)的大小.
我cellForRowAtIndexPath
像这样创建原型单元格:
static NSString *CellIdentifier = @"ProgramDetailCell";
ProgramDetailCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.descriptionLabel.text = self.program.subtitle;
return cell;
Run Code Online (Sandbox Code Playgroud)
然后我ProgramDetailCell
有以下实现:
@implementation ProgramDetailCell
- (void)layoutSubviews {
[super layoutSubviews];
[self.descriptionLabel sizeToFit];
}
@end
Run Code Online (Sandbox Code Playgroud)
第一次显示单元格时,layoutSubviews
会调用,但descriptionLabel
不会调整大小.但是,如果我向下滚动表并再次备份,则会显示"重复使用"单元格,并正确调整标签大小!
为什么第一次显示单元格时它不起作用 - 我需要做些什么来修复它.
提前致谢!
我有自定义的UILabel,可以在iOS6和iOS7上正常使用.但是在iOS8上,这个标签的(void)layoutSubviews方法永远不会被调用.我用initWithFrame创建了这个标签,所以应该调用这个方法 - 并在另一个iOS版本上调用它.iOS8中的autoLayout系统会发生什么?
我在实时应用程序中发生了这种随机崩溃。我知道如何修复它。我想知道如何找出有问题的代码,因为 crashlytics 日志没有在我的应用程序中显示任何代码。这是 crashlytics 崩溃吗?
由于它是随机崩溃,我无法调试它。
任何找出违规代码的指针将不胜感激。
Fatal Exception: NSInternalInconsistencyException
Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.
Fatal Exception: NSInternalInconsistencyException
0 CoreFoundation 0x196676a48 __exceptionPreprocess
1 libobjc.A.dylib 0x19639dfa4 objc_exception_throw
2 Foundation 0x196b4cf08 -[NSISEngine tryToOptimizeReturningMutuallyExclusiveConstraints]
3 Foundation 0x196957d34 -[NSISEngine _optimizeWithoutRebuilding]
4 Foundation 0x196957c4c -[NSISEngine optimize]
5 Foundation 0x1969578c0 -[NSISEngine performPendingChangeNotifications]
6 UIKitCore 0x19ab6c9e0 -[UIView(Hierarchy) layoutSubviews]
7 UIKitCore 0x19ab7f3d0 -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
8 QuartzCore 0x19d0e27dc -[CALayer layoutSublayers]
9 QuartzCore …
Run Code Online (Sandbox Code Playgroud) layoutsubviews ×10
ios ×8
autolayout ×4
objective-c ×3
uiview ×3
iphone ×2
uitableview ×2
animation ×1
bounds ×1
cocoa-touch ×1
constraints ×1
crashlytics ×1
ios13 ×1
ios8 ×1
ipad ×1
opengl-es ×1
uilabel ×1
xcode6 ×1