在 iOS 中为 UIPageControl 添加约束时 UIScrollView 不滚动

Posted

技术标签:

【中文标题】在 iOS 中为 UIPageControl 添加约束时 UIScrollView 不滚动【英文标题】:UIScrollView not scrolling when add constrains for UIPageControl in iOS 【发布时间】:2014-10-09 17:53:27 【问题描述】:

我有 1 个UIPageControl 和 1 个UIScrollView。当我为UIPageControl 设置约束时,我的UIScrollView 无法滚动。这是我的代码:

//set contentsize for uiscrollview
[self.scrollView setContentSize:CGSizeMake(320,  1440)];

UIPageControl *imagePVControl = self.imagePVControl;
[imagePVControl setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[imagePVControl]-0-|"
                                                                  options:0  
                                                                  metrics:nil 
                                                                    views:NSDictionaryOfVariableBindings(imagePVControl)]];

当我使用[imagePVControl setTranslatesAutoresizingMaskIntoConstraints:NO]; 滚动视图无法滚动,但如果我使用[imagePVControl setTranslatesAutoresizingMaskIntoConstraints:YES];,我的滚动视图可以滚动。你能帮我解决这个问题吗?谢谢。

另外,我的 XIB 取消选中“使用自动布局”” .

更新

我更改为我的代码如下。 UIScrollview 可以滚动,但UIPageControl 居中而不是左对齐。我想 algin 左边的UIPageControl 但它不成功。请帮我纠正它。谢谢

NSDictionary *views = @@"ScrollImageView":self.scrollViewImage,@"TableView":self.productDetailTable,@"InfoView":self.infoView;

            NSDictionary *metrics = @ @"ScrollImageheight" : ScrollImage_height,@"Tablewidth" : width, @"Tableheight" : Table_height,@"infoViewheight" : InfoView_height,@"infoViewWidth" : InfoView_width;

            [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[TableView(Tablewidth)]-0-|" options:0 metrics:metrics views:views]];

            [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[InfoView(infoViewWidth)]-0-|" options:0 metrics:metrics views:views]];

            [self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[ScrollImageView(ScrollImageheight)]-0-[InfoView(infoViewheight)]-0-[TableView(Tableheight)]-|" options:0 metrics:metrics views:views]];


            [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[imagePVControl]-0-|" options:0  metrics:nil views:NSDictionaryOfVariableBindings(imagePVControl)]];

【问题讨论】:

分享IB截图 其他约束呢? 【参考方案1】:

我也在为 UIScrollView 中的约束而苦苦挣扎。我最近学到的是,一旦你将TranslatesAutoresizingMaskIntoConstraints设置为NO,你会丢失很多设置。就像contentSizeUIScrollView 中的视图框架一样,这很奇怪。 我学到的是,如果你想在 UIScrollView 内的视图中添加约束,你必须设置 whosViews 的所有内容。 就您而言,我认为您应该尝试这种方式: [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[imagePVControl(320)]-0-|", options:0, metrics:nil, views:NSDictionaryOfVariableBindings(imagePVControl)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[imagePVControl(1440)]-0-|", options:0, metrics:nil, views:NSDictionaryOfVariableBindings(imagePVControl)]]; 在这两个约束中,我指定了上、下、左、右,除此之外,我还设置了imagePVControl的宽度和高度 这里的原因是,一旦你将TranslatesAutoresizingMaskIntoConstraints设置为NO,你告诉计算机你将告诉它contentSize有多大,而不是设置contentSize,你告诉它所有的信息内容中的视图。这里的主要区别是UIScrollView周围没有固定的边缘,所以你不能像其他类型的UIView一样设置约束。

你可以从中学习:https://developer.apple.com/library/ios/technotes/tn2154/_index.html 希望对您有所帮助:)

查看这个问题后,我发现了问题。您对待UIPageControl 的方式是对的,您应该在此处添加更多代码。 我假设您在滚动视图的顶部有一个名为 myView 的 UIView,然后在 myView 下方有一个名为 myTable 的 UITableView。并且您想设置 myView 240 高度和 myTable 1200 高度。然后是代码:

NSDictionary *viewsDic = NSDictionaryOfVariableBindings(myView, myTable);
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[myView(320)]-|", options:0, metrics:nil, views:viewDic]];
[self.scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[myTable(320)]-|", options:0, metrics:nil, views:viewDic]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[myView(240)]-[myTable(1200)]-|", options:0, metrics:nil, views:viewDic]];

主要原因是你将scrollViewTranslatesAutoresizingMaskIntoConstraints的子视图设置为NO,这样会导致无法手动设置contentSize。所以我给出了scrollView的内容有多大,它会自动计算contentSize。

【讨论】:

谢谢,我试过你的代码,滚动视图可以滚动但内容大小不正确,UIPageControl 没有显示。 那么该滚动视图中的所有视图是什么?你不只有一个 UIPageControl,对吧? 是的,我在滚动视图中有 uitableview、uipagecontroler 和 uiview。 那么我认为你应该用这三个视图来实现你的滚动视图。 contentSize 由这些视图决定,一旦将 TranslateAutoresizengMaskIntoConstraints 设置为 NO,就无法将 contentSize 设置为所需的大小。 你能举例代码吗?我是iOS的新手。谢谢【参考方案2】:

为什么要使用约束?为什么你不能在 UIScrollViewsetPagingEnabled:YES 然后在层次结构中将 UIPageControl 放在 UIScrollView 的顶部?

【讨论】:

因为我想为 UIPageControl 左对齐。但是当我为其设置约束时,我的滚动视图无法滚动。

以上是关于在 iOS 中为 UIPageControl 添加约束时 UIScrollView 不滚动的主要内容,如果未能解决你的问题,请参考以下文章

修复 UIPageControl(不是滑动)

为啥需要在 pageControl 中为 iOS 13 和 iOS 14 设置不同的常量

Swift iOS:UINavigationcontroller 中的 UIPageControl

iOS学习六之UIPageControl

如何在 uiscrollview 中添加六个控制器?

在 iOS 中增加 UIPageControl 大小