使用自动布局时何时将 imageView 添加到 UIButton
Posted
技术标签:
【中文标题】使用自动布局时何时将 imageView 添加到 UIButton【英文标题】:When to add imageView to UIButton when using autolayout 【发布时间】:2015-09-29 17:30:19 【问题描述】:目前我有多个UIButton
s 在左侧有一个图像(通过 IB 添加)。我想以编程方式将 UIImageView 子视图添加到右侧的按钮。目前我正在这样做:
UIImageView *rightArrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"menu-arrow.png"]];
rightArrow.frame = CGRectMake(button.frame.size.width - 32, button.frame.size.height/2 - 9, 17, 17);
rightArrow.tag = 22;
[button addSubview:rightArrow];
这非常适合添加按钮并将其放置在右侧。但是,在 ViewDidLoad
方法中执行此操作会产生问题。在 IB 中,按钮的宽度是视图的宽度。所以在ViewDidLoad
方法中,按钮的宽度没有被自动布局改变。所以它不会出现在最右侧。
所以我把它移到了ViewDidLayoutSubviews
。但在 ios 8 上,这会被多次调用!在 iOS 7 上,它只调用一次!此外,在 iOS 8 中,ViewDidLayoutSubviews
的 LAST 调用在放置图像方面是最准确的!
我该如何解决这个特定问题?另外,如果可能的话,我想以编程方式执行此操作,而不是尝试与 IB 混淆。
编辑:原来最好的答案(IMO)来自 T 先生(在 cmets 中),它统计将代码放入 ViewDidAppear
,然后检查您是否已经将 ImageView
添加到按钮.
【问题讨论】:
尝试使用 viewDidAppear 而不是 viewdidload @Mr.T 我可以在那里添加它,但我必须检查以确保我没有为每个按钮添加图像。每次视图出现但实际上并未卸载时。 "除此之外,我必须进行检查以确保我没有为每个按钮添加图像" 这是什么反对意见?这就是编码是的。 @matt 似乎我措辞不当。我的意思是这不是一个特别优雅的解决方案。我认为子类化 UIButton 会更好,这是我相信你在答案中建议的? 【参考方案1】:但在 iOS 8 上,这会被多次调用!在 iOS 7 上,它只调用一次!此外,在 iOS 8 中,ViewDidLayoutSubviews 的 LAST 调用在放置图像方面是最准确的!
所以每次响应viewDidLayoutSubviews
被调用。如果图像视图已添加,请勿再次添加,但如有必要请重新定位。
然而,更好的方法是使用自动布局来定位图像视图本身!与其给它分配一个框架,不如给它一个约束。现在它将在其余时间自动重新定位以响应视图布局。
【讨论】:
在我的问题中,我提到我有多个按钮需要应用此功能。我必须创建多个(在本例中为 8 个)图像并将它们与按钮对齐。虽然这不一定太多,但我一直在寻找一种程序化的解决方案。您的解决方案如何寻找“每次响应和重新定位”,特别是您如何知道重新定位? 首先,使用我的第二种方式,即自动布局;现在不需要进一步的代码。此外,如果您每次需要时都从其自己的 .xib 文件生成按钮,或者如果您使用将图像视图 附加到自身 的按钮子类,则不需要不必为每个接受此处理的按钮一遍又一遍地执行此操作。对吗?以上是关于使用自动布局时何时将 imageView 添加到 UIButton的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 6 上使用自动布局在 ScrollView 中嵌入 ImageView