【问题标题】:Programatically adding views to the view controller's view using AutoLayout使用 AutoLayout 以编程方式将视图添加到视图控制器的视图
【发布时间】:2015-04-03 06:04:27
【问题描述】:

我有一个使用代码创建的视图控制器(没有界面构建器或情节提要)。我正在尝试以编程方式添加一些视图(按钮和图像视图),并且我正在使用 Masonry 进行 AutoLayout。

我有以下代码

- (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;
}

模拟器中视图上出现的唯一视图是backButton,没有其他视图出现。

此外,添加到 recordButton 的最后 2 个约束使应用程序崩溃,错误为“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>>” 但是当我固定按钮时,没有错误,但它仍然在视图中不可见。知道为什么视图没有出现,代码有问题吗?

【问题讨论】:

    标签: ios objective-c autolayout masonry


    【解决方案1】:
    - (id)createAndAddSubView:(Class)modelClass {
        id temporaryView = [modelClass new];
        [self insertSubview:(UIView *)temporaryView atIndex:self.subviews.count];
        return temporaryView;
    }
    

    问题在于atIndex:0 它应该是self.subviews.count

    【讨论】:

    • 嗨 Nitish, UIButton 或任何 UIControl 子类的问题在于它有一个类方法来初始化自身。 [UIButton buttonWithType:] 在 UIButton 的情况下。使用 createAndAddSubView 创建视图将创建一个 UIView,而使用 [UIButton buttonWithType:] 创建将创建一个 UIControl,它是一个按钮。 self.recordButton = [self.view createAndAddSubView:UIButton.class]; self.recordButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];这两个将创建两个单独的视图,因此第二个语句将覆盖第一个
    【解决方案2】:

    我认为问题可能是您在父视图上插入子视图的索引。用[[self subviews] count] 代替索引“0”作为-

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

    【讨论】:

      【解决方案3】:

      上面的代码有几个问题: 1.如果错过了这个道歉,但是我没有看到设置每个子视图的框架的代码。 2. 这是不正确的。

      self.recordButton = [self.view createAndAddSubView:UIButton.class];
      self.recordButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
      

      3。您正在将每个子视图添加到先前添加的子视图之上。

      请检查所有这些方面,我认为您的代码应该可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        相关资源
        最近更新 更多