ios - 在运行时和方向更改期间居中和sizeToFit subview

标签 ios uiview subviews sizetofit

这是我设置一些UIView和子视图的几个问题中的第一个。我有一个UIView,它在运行时动态定位在屏幕上。该UIView(主控)包含另一个UIView(子级),该UIImageView(子级)包装了UILabelUIView。这是我对这种安排的要求:


旋转设备时,子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 questionthis 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)];
}


我想知道的是为什么(子级)在将其超级视图添加到视图层次结构后不能正确居中的原因。看起来好像宽度合适,但是某种程度上仍保留了I.B.中的框架。当标签显示“此地图范围内没有数据”时。

我还想知道为什么设备旋转后它没有居中,以及我在这里采用的方法是否明智。也许这导致了我遇到的其他问题。这里的任何UIView布局帮助将不胜感激。

谢谢!

最佳答案

如果您可以使用iOS 6,则可以使用新的“自动布局”功能使此操作更易于管理-我读过Ray Wenderlich的great tutorial似乎很适合解决您遇到的问题。

关于ios - 在运行时和方向更改期间居中和sizeToFit subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14223648/

相关文章:

ios - 在Facebook SDK上共享未找到FacebookSDK已消失

ios - Swift:如何重用 View Controller

ios - 当您滚动时会改变的单个静态标题

swift - Xcode,删除 subview

constraints - Autolayout如何支持 subview 的替换?

ios - JSQMessageData 追加 Json 数据

ios - 如何以编程方式模拟 "pinch out"手势?

iphone - 在自定义 UIView 的背景上查看 tableViewLines

ios - 带有切出段和阴影的 UIView

ios - 作为 UIStackView 的 subview 的 View 不能旋转