ios - 使用 AutoLayout 以编程方式将 View 添加到 View Controller 的 View

标签 ios objective-c autolayout masonry

我有一个使用代码创建的 View Controller (没有界面生成器或 Storyboard)。我正在尝试以编程方式添加一些 View (按钮和 ImageView ),并且我正在使用 Masonry 进行自动布局。

我有以下代码

- (instancetype)init {
    self = [super init];

    if (self) {
        self.view.backgroundColor = UIColor.whiteColor;
        self.progress = 0.f;
        self.shouldRecord = YES;
        [self createMainUI];
        [self addActions];
    }
    return self;
}

- (void)createMainUI {
    self.backButton = [self.view createAndAddSubView:UIButton.class];
    [self.backButton setImage:[TeamieUIGlobals defaultPicForPurpose:@"close" withSize:25.f] forState:UIControlStateNormal];
    [self.backButton addTarget:self action:@selector(dismissViewController) forControlEvents:UIControlEventTouchUpInside];

    self.micNormalImageView = [self.view createAndAddSubView:UIImageView.class];

    self.dynamicProgress = [self.view createAndAddSubView:TMEProgressImageView.class];
    self.dynamicProgress.image = IMAGE_MIC_WAVE;
    self.dynamicProgress.progress = 0;
    self.dynamicProgress.hasGrayscaleBackground = NO;
    self.dynamicProgress.verticalProgress = YES;

    self.recordButton = [self.view createAndAddSubView:UIButton.class];
    self.recordButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    self.recordButton.backgroundColor = UIColor.redColor;
    self.recordButton.layer.cornerRadius = 50.f;
    self.recordButton.titleLabel.font = [TeamieGlobals appFontFor:@"regularFontWithSize13"];
    [self.recordButton setTitle:@"Record" forState:UIControlStateNormal];
    [self.recordButton setTitleColor:UIColor.whiteColor forState:UIControlStateNormal];

    [self.backButton mas_makeConstraints:^(MASConstraintMaker *make){
        make.width.height.equalTo(@25);
        make.left.top.equalTo(@10);
    }];
    [self.micNormalImageView mas_makeConstraints:^(MASConstraintMaker *make){
        make.width.equalTo(@204);
        make.height.equalTo(@295);
        make.center.equalTo(self.view);
    }];
    [self.dynamicProgress mas_makeConstraints:^(MASConstraintMaker *make){
        make.width.equalTo(@204);
        make.height.equalTo(@295);
        make.center.equalTo(self.view);
    }];
    [self.recordButton mas_makeConstraints:^(MASConstraintMaker *make){
        make.width.height.equalTo(@100);
        make.centerX.equalTo(self.view);
        make.bottom.equalTo(self.view.mas_bottom).with.offset(15.f);
    }];
}

这就是createAndAddSubView确实

- (id)createAndAddSubView:(Class)modelClass {
    id temporaryView = [modelClass new];
    [self insertSubview:(UIView *)temporaryView atIndex:0];
    return temporaryView;
}

模拟器 View 中出现的唯一 View 是 backButton并且不会出现其他 View 。

此外,最后 2 个约束添加到 recordButton应用程序崩溃,错误为“couldn't find a common superview for <UIButton: 0x7ff2eb15f110; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7ff2eb118c60>> and <UIView: 0x7ff2e8f4bf20; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x7ff2e8fdf220>>” 但是当我固定按钮时,没有错误,但它在 View 上仍然不可见。知道为什么 View 没有出现,代码有问题吗?

最佳答案

- (id)createAndAddSubView:(Class)modelClass {
    id temporaryView = [modelClass new];
    [self insertSubview:(UIView *)temporaryView atIndex:self.subviews.count];
    return temporaryView;
}

问题出在 atIndex:0 上,它应该是 self.subviews.count

关于ios - 使用 AutoLayout 以编程方式将 View 添加到 View Controller 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427032/

相关文章:

ios - 使用按钮取消选择 Collection View 中的单元格

ios - 根据 RLMArray 属性的大小查询所有对象的 Realm ?

ios - 禁用自动布局本地化行为(RTL - 从右到左行为)

ios - 当图像为零时,具有固定尺寸 UIImageView 的自动布局?

ios - 每秒更改图像隐藏属性

ios - LayoutSubviews 问题

ios - 从 Firebase 检索数据并将其作为注释存储在 map 上

ios - 如何在 iOS 中获取 "days ago, hours ago"时间格式?

objective-c - iBeacon 监控结果不可靠(didEnterRegion 和 didExitRegion)

objective-c - 将 Objective-C 函数转换为 Swift 版本