2

我有一个带有默认状态栏的 CollectionViewController,它全部嵌入在 NavigationController 中。

我正在尝试重现一种效果,其中我有一个视图锚定到屏幕顶部,因为我的导航控制器是完全透明的,我的状态栏也是透明的,但是当我将我的视图锚定topAnchor到NavigationController bottomAnchor,因为它“认为”屏幕顶部是 navController 的底部。

在将视图锚定到顶部之后,我设法绕过了这个,我给了它一个负的 topPadding,现在它就是我想要的位置。

我知道有一种方法可以将布局扩展到顶部屏幕,但我想不通。

你能给我一个提示吗?

我正在尝试这个:

想要的

我得到这个:

结果

空白为状态栏高度 + NavigationController 高度

谢谢

4

3 回答 3

1

如果您不希望 ViewControllers 内容视图在顶部/底部栏下扩展,您可以使用 Interface Builder 中的 Extend Edges Under Top Bars/Under Bottom Bars 设置。

尝试使用这个

目标C:

self.edgesForExtendedLayout = UIRectEdgeNone;

斯威夫特3:

self.edgesForExtendedLayout = []

希望这可以帮助你:)

于 2017-05-23T14:28:32.063 回答
1

好吧,这将我UIImageView固定在屏幕顶部......在导航栏和状态栏下方。与集合视图应该没有什么不同:

NSLayoutConstraint *top = [NSLayoutConstraint
                           constraintWithItem:imageView
                           attribute:NSLayoutAttributeTop
                           relatedBy:NSLayoutRelationEqual
                           toItem:self.view
                           attribute:NSLayoutAttributeTop
                           multiplier:1
                           constant:0];

编辑:对不起,在一个 Obj-C 项目中工作......它在 Swift 中:

    let img = UIImage(named: "Man")
    let imageView = UIImageView(image: img)
    imageView.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(imageView)

    imageView.widthAnchor.constraint(equalToConstant: 200.0).isActive = true
    imageView.heightAnchor.constraint(equalToConstant: 200.0).isActive = true

    imageView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true

    imageView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true

在此处输入图像描述

并且......这里也有一个集合视图(用普通的屏幕帽很难分辨):

    self.view.backgroundColor = .white

    let img = UIImage(named: "Man")
    let imageView = UIImageView(image: img)
    imageView.translatesAutoresizingMaskIntoConstraints = false

    self.view.addSubview(imageView)

    imageView.widthAnchor.constraint(equalToConstant: 200.0).isActive = true
    imageView.heightAnchor.constraint(equalToConstant: 200.0).isActive = true

    imageView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true

    imageView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true

    let layout = UICollectionViewFlowLayout()
    let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
    cv.backgroundColor = .clear

    cv.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "defaultCell")
    cv.dataSource = self

    cv.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(cv)

    cv.widthAnchor.constraint(equalTo: self.view.widthAnchor, multiplier: 0.9).isActive = true
    cv.heightAnchor.constraint(equalToConstant: 300.0).isActive = true

    cv.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true

    cv.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true

在此处输入图像描述

于 2017-05-23T15:15:12.740 回答
-1
class DetailsPage : UIViewController {

    let topView:UIView = UIView()
    let topSliderImage:UIImageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        setUI()
    }

    override func viewWillAppear(_ animated: Bool) { 
        navigationController?.navigationBar.isTranslucent = true
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage() 
    }

    func setUI(){

        self.view.addSubview(topSliderImage)
        topSliderImage.image = UIImage(named: "img-1")
        topSliderImage.contentMode = .scaleAspectFit
        topSliderImage.translatesAutoresizingMaskIntoConstraints = false
        topSliderImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 0).isActive = true
        topSliderImage.heightAnchor.constraint(equalToConstant: 300).isActive = true
        topSliderImage.widthAnchor.constraint(equalToConstant: view.frame.width).isActive = true
    }
}

在此处输入图像描述

于 2019-04-18T06:50:16.067 回答