这是我设置一些UIView
和子视图的几个问题中的第一个。我有一个UIView
,它在运行时动态定位在屏幕上。该UIView
(主控)包含另一个UIView
(子级),该UIImageView
(子级)包装了UILabel
和UIView
。这是我对这种安排的要求:
旋转设备时,子UIView
必须在主UILabel
中居中。UIView
中的文本可以很长或很短,带有图像和文本的子willRotateToInterfaceOrientation.
必须仍然居中。
我想避免子类化UIView来处理这种情况,并且我也想避免在autoresizingMask
中使用任何框架/定位代码,我希望通过I.B中的某些autoresizingMask
设置来处理所有这些问题。如果可能的话,也许会强制调整一下代码的大小。
这是Interface Builder中控件的排列(以红色突出显示):
使用Interface Builder,对于所描述的控件,UIView
属性的设置如下UIView
(主):灵活的上边距,灵活的左边距,灵活的右边距,灵活的宽度UIImageView
(子级):柔性顶部边缘,柔性底部边缘,柔性左边缘,柔性右边缘,柔性宽度,柔性高度。 (所有模式,无除外)UILabel
:灵活的右边距UIView
:灵活的右边距
这是在纵向模式下以编程方式在运行时添加视图后的视图(带有图像和文本的红色条):
主版UIView
的背景是浅红色的图像。子UILabel
的背景比这暗一点,而showNoDataStatusView
的背景甚至更暗。我为它们着色,以便在应用程序响应旋转时可以看到它们的边界。
我很清楚:
它不居中,但...
将文字从I.B中的默认值更改为“此地图范围中没有数据”。到“ TEST1,123”。标签正确收缩。
这是添加肖像时的视图,然后将其旋转为横向模式:
从这里我可以看到:
它仍未居中,也许在旋转之前仍处于其原始帧原点
UIView(子级)已扩展为在不应该显示的时候填充更多屏幕。
UIView(母版)已正确展开以填充屏幕宽度。
这是使我现在所处位置的代码。我从viewDidLoad调用方法resizeToFitSubviews
:
// Assuming
#define kStatusViewHeight 20
- (void)showNoDataStatusView {
if (!self.noDataStatusView.superview) {
self.noDataStatusView.frame = CGRectMake(self.mapView.frame.origin.x,
self.mapView.frame.origin.y,
self.mapView.frame.size.width,
kStatusViewHeight);
self.noDataStatusView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgRedStatus.png"]];
// Position the label view in the center
self.noDataStatusLabelView.center = CGPointMake(self.noDataStatusView.frame.size.width/2,
self.noDataStatusView.frame.size.height/2);
// Test different text
self.noDataStatusLabel.text = @"Testing, 123.";
// Size to fit label
[self.noDataStatusLabel sizeToFit];
// Test the status label view resizing
[self.noDataStatusLabelView resizeToFitSubviews];
// Add view as subview
[self.view addSubview:self.noDataStatusView];
}
}
请注意以下事项:
sizeToFit
是我发现UIView不会自动调整大小以适合其子视图的一种类型,即使您调用UIView
时也将其放置在UIView上。 This question和this question解释了此问题。请参阅下面的类别代码。我曾考虑过创建一个UIView子类来为我处理所有这些逻辑,但是这似乎有点过头了。在I.B.中进行安排应该很简单对?
我尝试过设置本书中所有调整大小的蒙版设置,并调整了调整标签和视图大小的顺序以及将主视图添加为子视图的时间。每次我都得到奇怪的结果时,似乎没有任何反应。
UIView resizeToFitSubviews类的实现方法:
-(void)resizeToFitSubviews
{
float width = 0;
float height = 0;
// Loop through subviews to determine max height/width
for (UIView *v in [self subviews]) {
float fw = v.frame.origin.x + v.frame.size.width;
float fh = v.frame.origin.y + v.frame.size.height;
width = MAX(fw, width);
height = MAX(fh, height);
}
[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, width, height)];
}
我想知道的是为什么
我还想知道为什么设备旋转后它没有居中,以及我在这里采用的方法是否明智。也许这导致了我遇到的其他问题。这里的任何UIView布局帮助将不胜感激。
谢谢!
最佳答案
如果您可以使用iOS 6,则可以使用新的“自动布局”功能使此操作更易于管理-我读过Ray Wenderlich的great tutorial似乎很适合解决您遇到的问题。
关于ios - 在运行时和方向更改期间居中和sizeToFit subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223648/