UIView背景图案

7
我能做的和下面的一样吗:
view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"imageName.png"]];

只使用IB?不需要编写这样的代码行吗? 看起来,IB只允许设置纯色,而不是图像作为背景。

1
IB在需要自定义UI时非常有限。我尽量不使用IB,以便可以为用户创建更美观和特定的布局和交互。 - Edmar Miyake
2
@Edmar 不好的建议。尽可能在IB中完成尽可能多的工作。它不能让你完全达到目标,但它可以帮助你清除很多无用的东西,以便你可以专注于更美观和具体的用户布局/交互。 - Wayne Hartman
3个回答

6
Interface Builder不允许使用背景图案。但是您可以在UIImageView中简单地覆盖适当的图像以实现背景效果。这将使应用程序具有所需的外观,而无需使用上面发布的代码。
然而,我强烈反对仅使用Interface Builder。在我看来,代码更加清晰,并且允许对构建内容进行更多的控制。

3
如果确实是一个模式,那么最好采用图案的方式。这样,帧缓冲区只需缓存一个平铺的瓷砖,因此消耗的内存更少。而且,使用UIImageView时,还需要额外的视图对象开销。 - Wayne Hartman
同意。就像我说的,我不同意他应该只使用IB。我认为通过代码实现会更加顺畅。 - Sebastien Peek
1
@theOrkus 不一定。在IB中保留尽可能多的内容可以创建更干净的MVC实现。您的视图与控制器是分离且独立的。特别是在使用IB定位元素时更是如此。为什么您的控制器要关心那些细节呢?在IB中完成这些工作,以便您的控制器可以专注于业务逻辑。 - Wayne Hartman
1
当然,没错。但是当涉及到特别处理图案图像作为视图背景时,那么代码绝对是必需的。我没有反对使用IB,但为了他所需要完成的任务,显然需要使用代码。 - Sebastien Peek

2

这个不能在IB中完成,但代码是正确的。尽可能充分利用IB,这样你就可以把精力集中在应用程序的真正业务逻辑上,只有在IB无法到达的地方进行进一步定制。祝好运!


0

正如其他人所说,你不能仅在IB/storyboard中完成这个。但是使用@IBDesignable,您可以在子类中添加几行代码,并在IB中显示出来,这非常酷。

import UIKit

@IBDesignable
class MyView: UIView {
override func awakeFromNib() {
    super.awakeFromNib()
    self.addPattern()
}

override func prepareForInterfaceBuilder() {
    self.addPattern()
}

private func addPattern() {
    let image = UIImage(named: "MyPattern", in: Bundle(for: self.dynamicType), compatibleWith: nil)
    self.backgroundColor = UIColor(patternImage: image!)
}

}

然后只需将您的Storyboard/IB视图的类更改为MyView。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接