2
我试图做一个UIScrollView
包含UIStackView
嵌套在里面的几层堆栈视图。我想用自动版式,但有什么不对的我在做什么,我的大脑是越来越炒试图弄明白:iOS 9 StackView里面的ScrollView没有填充屏幕的宽度
import UIKit
class HomeView: UIView {
let looks = sampleLooks
let user = sampleUser
let streamView: UIStackView = UIStackView(arrangedSubviews: [])
let scrollView: UIScrollView = UIScrollView()
func makeButtonWithTitle(title: String, image: UIImage?, selector: String, tag: Int) -> UIButton {
let button = UIButton(type: .System)
button.setImage(image, forState: .Normal)
button.tintColor = UIColor.blackColor()
switch tag {
case 0...10:
button.backgroundColor = UIColor(white: 0.98, alpha: 0.8)
button.titleLabel?.font = UIFont(name: "HelveticaNeue-Thin", size: 30)
default:
button.backgroundColor = UIColor(white: 0.90, alpha: 1.0)
button.titleLabel?.font = UIFont(name: "HelveticaNeue-Thin", size: 40)
}
button.setTitle(title, forState: .Normal)
button.tag = tag
return button
}
func makeMessageView(senderImage: UIImage, senderHandle: String, text: String) -> UIView {
let textView = UILabel()
textView.text = text
textView.font = UIFont(name: "HelveticaNeue-Thin", size: 20)
let senderLabel = UILabel()
senderLabel.text = senderHandle
textView.font = UIFont(name: "HelveticaNeue-Thin", size: 20)
let textStackView = UIStackView(arrangedSubviews:[senderLabel, textView])
textStackView.axis = .Horizontal
textStackView.alignment = .Fill
textStackView.distribution = .Fill
let postView = UIView()
postView.addSubview(textStackView)
postView.backgroundColor = UIColor(white: 0.98, alpha: 0.8)
return postView
}
required init?(coder:NSCoder) {
super.init(coder:coder)
self.contentMode = .ScaleToFill
self.backgroundColor = UIColor(patternImage: UIImage(named: "background")!)
self.streamView.spacing = 20.0
self.streamView.translatesAutoresizingMaskIntoConstraints = false
self.streamView.axis = .Vertical
self.streamView.alignment = .Fill
self.streamView.distribution = .FillEqually
for look in self.looks {
let lookImageView = UIImageView(image: look.photo.photo)
lookImageView.contentMode = .ScaleAspectFit
lookImageView.clipsToBounds = true
let postView = self.makeMessageView(
look.user.photo.photo, senderHandle: look.user.handle, text: look.post)
let likeButton = self.makeButtonWithTitle(
" Like", image: UIImage(named: "like"), selector: "", tag: 0)
let commentButton = self.makeButtonWithTitle(
" Comment", image: UIImage(named: "SMS"), selector: "", tag: 1)
let shareButton = self.makeButtonWithTitle(
" Share", image: UIImage(named: "upload"), selector: "", tag: 2)
let buttonsView = UIStackView(arrangedSubviews: [likeButton, commentButton, shareButton])
buttonsView.distribution = .FillEqually
let lookView = UIStackView(arrangedSubviews:[lookImageView, postView, buttonsView])
lookView.axis = .Vertical
lookView.distribution = .Fill
lookView.alignment = .Fill
self.streamView.addArrangedSubview(lookView)
}
self.scrollView.addSubview(self.streamView)
self.scrollView.frame = UIScreen.mainScreen().bounds
self.scrollView.showsVerticalScrollIndicator = false
self.scrollView.showsHorizontalScrollIndicator = false
self.addSubview(self.scrollView)
}
}
所以,我想这个代码做的是给我一个可滚动的嵌套堆栈,覆盖屏幕的宽度(可以,如果图像被剪切,但我希望它们覆盖屏幕而不失真)。它实际上给了我一个可滚动的图像集,其中第一个图像的宽度(看似)决定了堆栈的宽度。我实际上不确定这是怎么回事,但顶层UIStackView
没有覆盖屏幕的宽度。
我认为它与UIScrollView
有什么关系没有固有的宽度,所以它内部的堆栈视图决定了它自己的大小。我这样说是因为如果我直接在父视图中放置堆栈视图,它会覆盖显示器,但正如你所期望的那样,没有滚动...
Thx @uraimo,我会试试。 – gred
它应该工作,我有一个应用程序,基本上你发布相同的结构。 –
由于该代码: scrollView.addConstraint( NSLayoutConstraint(项目:streamView, 属性:.WIDTH, relatedBy:.Equal, toItem:滚动视图, 属性:.WIDTH, 乘数:1.0, 常数: 0)) 我基本上在那里。这不是你发布的内容('toItem:scrollView'而不是'toItem:streamView',但我认为这就是你的意思),但是谢谢你的推动! – gred