UIScrollView Subviews неуместны при уменьшении и Subviews не отображаются при округлении - PullRequest
0 голосов
/ 01 апреля 2020

, поэтому я делаю свое первое приложение Swift iOS. У меня есть две проблемы, с которыми я хотел бы помочь.

Первая проблема : я сталкиваюсь с некоторыми проблемами с созданными программно подпредставлениями, которые неправильно выравниваются при отображении на небольшом экране.

Это первое изображение показывает, как Я намерен посмотреть прокрутку. (iPhone 11 Pro Max)

How the scrollview is supposed to look

Тем не менее, это то, как он выглядит, когда он на меньшем экране. (iPhone 8)

Subviews are cut off on this picture

Я думаю, что проблема заключается в том, что я создаю подпредставления программно, так как размер прокрутки - это то, что мне нужно.

Вот быстрый код, который я использовал внутри viewDidLoad():

var districtNewsSize = 10;
var districtNewsFrame = CGRect(x:0,y:0,width:0,height:0);
// District News -----
        districtNewsPageControl.numberOfPages = districtNewsSize;
        for aIndex in 0..<districtNewsSize{
            districtNewsFrame.origin.x = districtNewsScrollView.frame.size.width * CGFloat(aIndex);
            districtNewsFrame.size = districtNewsScrollView.frame.size;


            // create content in scrollview
            let contentView = UIButton(frame: districtNewsFrame);
            contentView.backgroundColor = makeColor(r: 147, g: 66, b: 78);
            contentView.setTitle("titletext", for: .normal);
            contentView.layer.cornerRadius = 20; // just to show how displaced the views are


            // add contentview to scrollview
            self.districtNewsScrollView.addSubview(contentView);
        }
        // change horizontal size of scrollview
        districtNewsScrollView.contentSize = CGSize(width: districtNewsScrollView.frame.size.width * CGFloat(districtNewsSize), height: districtNewsScrollView.frame.size.height);
        districtNewsScrollView.delegate = self;

Вторая проблема : при попытке округлить два верхних угла прокрутки, содержимое внутри прокрутки видимость исчезает.

Это изображение первого подпредставления.

First subview seems fine

Это изображение второго subview.

The second subview doesn't even show anymore

У меня также есть подозрение, что это вызвано моей функцией, которую я использую для округления верхних краев.

Вот функция расширения, которую я сделал для UIScrollView:

extension UIScrollView{
    func setRoundedEdge(corners:UIRectCorner, radius: CGFloat){ // label.setRoundedEdge([.TopLeft, . TopRight], radius: 10)
        let maskPath1 = UIBezierPath(roundedRect: bounds,
            byRoundingCorners: corners,
            cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer1 = CAShapeLayer()
        maskLayer1.frame = bounds
        maskLayer1.path = maskPath1.cgPath
        layer.mask = maskLayer1
    }
}

Вот как я вызываю функцию в viewDidLoad():

districtNewsScrollView.setRoundedEdge(corners: [.topRight,.topLeft], radius: 30);

Любая помощь будет высоко ценится. Я застрял на этих двух проблемах и не могу найти что-либо в Интернете (возможно, потому что я не правильно формулирую это, но я не знаю, как описать эти проблемы). Спасибо!

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Вот что я сделал, чтобы исправить обе проблемы:

// District News -----
        districtNewsFrame.size = districtNewsScrollView.frame.size;
        districtNewsFrame.size.width = UIScreen.main.bounds.size.width - 34;
        for aIndex in 0..<districtNewsSize{
            //districtNewsFrame.origin.x = (UIScreen.main.bounds.size.width-52) * CGFloat(aIndex);
            //districtNewsFrame.size = UIScreen.main.bounds.size;
            districtNewsFrame.origin.x = (districtNewsFrame.size.width * CGFloat(aIndex));

            // create content in scrollview
            let contentView = UIButton(frame: districtNewsFrame); // wrapper for article
            //testButton.setImage(UIImage(named: "ahsldpi.png"), for: .normal);
            contentView.backgroundColor = makeColor(r: 147, g: 66, b: 78);

            // content inside contentView -------
            let articleContentFrame = CGRect(x:0,y:0,width:districtNewsFrame.width,height:districtNewsFrame.height-60);
            let articleContent = UIView(frame: articleContentFrame); // may be image?
            articleContent.backgroundColor = makeColor(r: 138, g: 138, b: 138);

            let articleLabelFrame = CGRect(x:0,y:districtNewsFrame.height-60,width:districtNewsFrame.width,height:60);
            let articleLabel = UILabel(frame: articleLabelFrame);
            articleLabel.text = "    " + "Title";
            articleLabel.backgroundColor = UIColor.white;
            articleLabel.font = UIFont(name: "DINCondensed-Bold", size: 30);



            // add content inside contentView to contentview
            contentView.addSubview(articleContent);
            contentView.addSubview(articleLabel);
            // add contentview to scrollview
            contentView.setRoundedEdge(corners: [.topRight,.topLeft,.bottomLeft,.bottomRight], radius: 30);
            self.districtNewsScrollView.addSubview(contentView);
        }
        // change horizontal size of scrollview
        districtNewsScrollView.contentSize = CGSize(width: (districtNewsFrame.size.width * CGFloat(districtNewsSize)), height: districtNewsScrollView.frame.size.height);
        districtNewsScrollView.delegate = self;
    ```
0 голосов
/ 01 апреля 2020

Я предполагаю, что вы используете раскадровку для прокрутки и программно добавляете подпредставления в viewDidLoad,

districtNewsFrame.origin.x = districtNewsScrollView.frame.size.width * CGFloat(aIndex);
districtNewsFrame.size = districtNewsScrollView.frame.size;

Следует изменить на

districtNewsFrame.origin.x = UIScreen.main.bounds.size.width * CGFloat(aIndex);
districtNewsFrame.size = UIScreen.main.bounds.frame.size;

Использовать размер экрана в viewDidLoad, так как представления в раскадровке загружены, но ограничения в автоматическом макете еще не применяются.

Для второго вопроса

изменить расширение на

extension UIScrollView{
    func setRoundedEdge(corners:UIRectCorner, radius: CGFloat){ // label.setRoundedEdge([.TopLeft, . TopRight], radius: 10)
        let path = UIBezierPath(roundedRect: bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        layer.mask = mask
    }
}

и просмотреть контроллер на

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews();
    districtNewsScrollView.setRoundedEdge(corners: [.topRight,.topLeft], radius: 30);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...