在父视图中垂直水平居中一个UIView

5
我是一位能翻译文本的助手。
我有一个UICollectionView,它位于另一个UIView内。我试图将集合视图居中在其父视图中。目前通过调整其框架来手动完成(请参见以下代码)。肯定有更简单的方法。
当前代码:
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(COLLECTION_PADDING+10, COLLECTION_PADDING+5, self.bounds.size.width - (COLLECTION_PADDING*2), self.bounds.size.height - (COLLECTION_PADDING+22)) collectionViewLayout:flow];

请澄清您的具体问题或添加额外细节以准确突出您所需的内容。目前的表述不够清晰,很难确定您在询问什么。 - Neeku
你是如何创建和定位视图的?你使用Interface Builder吗?自动布局?Struts?这里缺少很多信息。 - David Berry
4个回答

24
您可以像这样做:
self.collectionView.center = CGPointMake(CGRectGetMidX(superview.bounds), CGRectGetMidY(superview.bounds));

Swift 3:

self.collectionView.center = CGPoint(superview.bounds.midX, superview.bounds.midY)

采用这种方法,无论superview的坐标如何,您的子视图都将始终居中于其superview中。采用类似以下的方法:

self.collectionView.center = superview.center

如果父视图的原点不是0,0,将会导致问题。


使用Swift 4.2:self.collectionView.center = CGPoint(x: superview.bounds.midX, y: superview.bounds.midY) - Dominique Lorre

3
您可以设置collectionView的宽度和高度,然后使用center属性来调整其位置。
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0,0,width,height)];
self.collectionView.center = CGPointMake(self.center.x,self.center.y);

编辑: 正如Logan在评论中提到的那样,只有当self和self.collectionView具有相同的父视图时,这种方法才有效。如果您将collectionView添加到一个视图中,并希望它在该视图中居中,则可以执行以下操作:

self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0,0,width,height)];
self.collectionView.center = CGPointMake(self.center.x - self.frame.origin.x/2,self.center.y - self.frame.origin.x/2);

但是当涉及到旋转时,这种情况就不适用了。在这种情况下,您必须使用其他方法。所以,像编码中的任何事物一样,这并不是一个明确的答案。但对于大多数情况,它都能起作用。如果您遇到它无法正常工作的罕见情况,那么您可能需要进行更多的自定义框架而不仅仅是将其居中在父元素内。


虽然这通常可以工作,但是当父视图的原点不是0,0时会出现问题。其他情况也会导致问题。另外,CGPointMake(self.center.x,self.center.y);等同于self.center - Logan

2

听说过布局吗?这可能会对你有所帮助。

这是用于水平对齐的。

NSLayoutConstraint *centerHcons =[NSLayoutConstraint constraintWithItem:self.collectionView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:collectionViewSuper attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f];

这是用于垂直对齐的

NSLayoutConstraint *centerVcons =[NSLayoutConstraint constraintWithItem:self.collectionView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:collectionViewSuper attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f];

    [collectionViewSuper addConstraints:@[centerHcons, centerVcons]];

1
我认为,你可以尝试找出你的集合视图和父视图大小之间的差异。然后将差值除以2,并在所有边缘添加填充。
parentHeight = self.bounds.size.height;
parentWidth = self.bounds.size.width;
heightDiff = parentHeight - collectionview.bounds.size.height;
widthDiff = parentWidth - collectionview.bounds.size.width;
heightPadding = heightDiff/2;
widthPadding = widthDiff/2;

self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(widthPadding, heightPadding, parentWidth-widthPadding, parentHeight-heightPadding) collectionViewLayout:flow];

算了,Putz的回答更好。请忽略我 :) - A O
不一定更好,只是更简单。人们似乎喜欢简单的东西。 - Putz1103

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