使用UIStackViews

时间:2017-10-04 15:31:16

标签: ios objective-c storyboard xib uistackview

我正在使用多个XIB / Storyboard来构建我的应用程序。

我有在XIB中提出的意见。有些人UIStackView来帮助整理布局。

我的主要故事板在UIStackView中嵌入了两个视图,用于提取使用XIBs创建的视图。

无法正确显示任何内容。尽管在界面构建器中正确显示,但视图大小不合适或根本不显示。

我怀疑是正在显示视图, BEFORE 它们被完全加载到视图中,导致帧的大小不同。

我被告知最佳做法是提供他们自己的故事板/ XIB视图,以便更好地合并,维护等......这就是我想要学习的东西。

有谁知道完成我正在做的事情的正确方法?

这是我正在做的事情:

的ViewController

#import "OrangeView.h"
#import "GreenView.h"

@interface ViewController () {
    OrangeView *ov;
    GreenView *gv;
}

@property (weak, nonatomic) IBOutlet UIView *viewOrange;
@property (weak, nonatomic) IBOutlet UIView *viewGreen;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //Load Orange View
    ov = [[OrangeView alloc] initWithFrame:_viewOrange.frame];
    [_viewOrange addSubview:ov];

    //Load GreenView
    gv = [[GreenView alloc] initWithFrame:_viewGreen.frame];
    [_viewGreen addSubview:gv];

}

主要演示文稿

enter image description here

OrangeView

enter image description here

GreenView(具有多个堆栈视图)

enter image description here

概述

enter image description here

1 个答案:

答案 0 :(得分:0)

.xib文件的内容未被"链接"上课。也就是说,当您实例化该类时,它本身也不会加载您在xib中布局的视图和子视图。

有几种方法可以解决这个问题。一种方法是包括"加载元素"视图类中的代码。这允许更多的传统"加载/创建视图实例,添加为子视图,设置参数(框架或约束)等的方法

以下是使用" xib-load"对UIView进行子类化的示例。函数,然后使你的实际类成为这个" base":

的子类
//
//  XIBViewBase.h
//

#import <UIKit/UIKit.h>

@interface XIBViewBase : UIView

@end
//
//  XIBViewBase.m
//

#import "XIBViewBase.h"

@implementation XIBViewBase

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];

    if (self) {
        [self xibSetup];
    }

    return self;
}

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];

    if (self) {
        [self xibSetup];
    }

    return self;
}

- (void)awakeFromNib {
    [super awakeFromNib];
    [self xibSetup];
}

- (void)xibSetup {

    // make sure we don't add the subviews more than once
    if (!self.subviews.count) {

        UIView *view = [self loadFromXIB];

        view.frame = self.bounds;
        view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        [self addSubview:view];
        [self sendSubviewToBack:view];

    }

}

- (UIView *)loadFromXIB {

    // Note: the .xib file MUST be named the same as the class for this to work

    NSString *className = NSStringFromClass([self class]);
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];
    UINib *nib = [UINib nibWithNibName:className bundle:bundle];
    UIView *v = [nib instantiateWithOwner:self options:nil].firstObject;

    return v;

}

@end

我把你可以看一下的这个例子(使用你的目标)放在一起。可能会帮助你掌握它:

https://github.com/DonMag/SimpleXIB