将 UIView 添加到现有的 UIViewController
Adding a UIView to an existing UIViewController
我正在尝试将控件合并到现有的 ViewController
中,但新视图没有绘制到我想要的位置。在下面的代码中,我想我已经隔离了我的问题所在,但我不知道如何解决它。
我有一个名为 StepperView 的 UIView
,我正在尝试将其添加到现有的 UIViewController
。过去,当我向 UIViewController
添加视图时,我是 完全以编程方式完成的 OR 完全使用 AutoLayout.
在这种情况下,我的故事板已经在 AutoLayout 中进行了配置,我希望保持这种状态。我无法让 StepperView
显示在我在 Interface Builder 中布置的 UIView
对象中。我在我的故事板中添加了一个 UIView
对象,添加了约束,并在 MyViewController.m
中创建了一个 IBOutlet
。我还添加了 StepperView
到 MyViewController.m
的导入语句,如下所示:
#import "StepperView.h"
// a bunch of properties
@property (strong, nonatomic) IBOutlet StepperView *stepperView;
在 MyViewController.m
的 viewDidLoad
中,我将 stepperView
实例化如下:
[self.view addSubview:self.stepperView];
// this is the method I'm calling to instantiate stepperView
[self.stepperView drawStepperInView:self.stepperView];
我想配置 StepperView
来填充我在故事板中设置的 UIView
对象。相反,它显示在我在 Interface Builder 中为其设置的屏幕区域之外。
这是来自 StepperView.m
的 drawStepperInView
:
- (void)drawStepperInView:(UIView *)containerView {
if (_numberCurrent <= 0) {
_numberCompleted = 0;
_numberCurrent = 1;
} else if (_numberCurrent > _numberTotalStep) {
_numberCompleted = _numberTotalStep - 1;
_numberCurrent = _numberTotalStep + 1;
} else {
_numberCompleted = _numberCurrent - 1;
}
// ** I think my problem lives here...
CGFloat _startPointX = ([UIScreen mainScreen].bounds.size.width - STEPPER_WIDTH) / 2;
if (_startX) {
_startPointX = _startX;
}
// ** and here.
CGFloat _startPointY = 100.0f;
if (_startY) {
_startPointY = _startY;
}
_stepperPipeBG = [[UIView alloc] initWithFrame:CGRectMake(_startPointX, _startPointY, STEPPER_WIDTH, STEPPER_HEIGHT)];
_stepperPipeBG.backgroundColor = [UIColor colorWithRed:(225.0f/256.0f) green:(225.0f/256.0f) blue:(225.0f/256.0f) alpha:1.0f];
[containerView addSubview:_stepperPipeBG];
CGFloat _stepperPipeFrontWidth = ((STEPPER_WIDTH / (_numberTotalStep - 1)) * _numberCompleted);
_stepperPipeFront = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 4.0f, _stepperPipeFrontWidth, (STEPPER_HEIGHT - 8.0f))];
_stepperPipeFront.backgroundColor = COMPLETED_COLOR;
_stepperPipeFront.layer.borderWidth = 1.5f;
_stepperPipeFront.layer.borderColor = COMPLETED_BORDER_COLOR.CGColor;
[_stepperPipeBG addSubview:_stepperPipeFront];
for (int i=1; i<=_numberTotalStep; i++) {
int status = MARK_UNTOUCHED;
if (i < _numberCurrent) {
status = MARK_COMPLETED;
} else if (i == _numberCurrent) {
status = MARK_CURRENT;
} else {
status = MARK_UNTOUCHED;
}
[self drawStepperMarkInView:_stepperPipeBG withNumber:i withStatus:status];
}
}
也许我在这里遗漏了一些东西,但你试过简单地说:
stepperView.frame = containerViewFrame
此外,如果您使用的是 AutoLayout,那么您需要覆盖 viewDidLayoutSubviews
方法,以便 AutoLayout 可以首先呈现视图容器。
我将从 viewDidLoad 中删除代码并添加:
-(void)viewDidLayoutSubviews {
self.stepperView.frame = self.view.frame;
[self.view addSubview:self.stepperView];
[self.stepperView drawStepperInView:self.stepperView];
在 MyViewController
上,我将为 stepperView
添加的 UIView
对象固定到屏幕的左右边缘。我还将 StepperView.m
的 drawInStepperView:containerView
方法中的 _startPointY
更改为:
CGFloat _startPointY = 0.0f;
我正在尝试将控件合并到现有的 ViewController
中,但新视图没有绘制到我想要的位置。在下面的代码中,我想我已经隔离了我的问题所在,但我不知道如何解决它。
我有一个名为 StepperView 的 UIView
,我正在尝试将其添加到现有的 UIViewController
。过去,当我向 UIViewController
添加视图时,我是 完全以编程方式完成的 OR 完全使用 AutoLayout.
在这种情况下,我的故事板已经在 AutoLayout 中进行了配置,我希望保持这种状态。我无法让 StepperView
显示在我在 Interface Builder 中布置的 UIView
对象中。我在我的故事板中添加了一个 UIView
对象,添加了约束,并在 MyViewController.m
中创建了一个 IBOutlet
。我还添加了 StepperView
到 MyViewController.m
的导入语句,如下所示:
#import "StepperView.h"
// a bunch of properties
@property (strong, nonatomic) IBOutlet StepperView *stepperView;
在 MyViewController.m
的 viewDidLoad
中,我将 stepperView
实例化如下:
[self.view addSubview:self.stepperView];
// this is the method I'm calling to instantiate stepperView
[self.stepperView drawStepperInView:self.stepperView];
我想配置 StepperView
来填充我在故事板中设置的 UIView
对象。相反,它显示在我在 Interface Builder 中为其设置的屏幕区域之外。
这是来自 StepperView.m
的 drawStepperInView
:
- (void)drawStepperInView:(UIView *)containerView {
if (_numberCurrent <= 0) {
_numberCompleted = 0;
_numberCurrent = 1;
} else if (_numberCurrent > _numberTotalStep) {
_numberCompleted = _numberTotalStep - 1;
_numberCurrent = _numberTotalStep + 1;
} else {
_numberCompleted = _numberCurrent - 1;
}
// ** I think my problem lives here...
CGFloat _startPointX = ([UIScreen mainScreen].bounds.size.width - STEPPER_WIDTH) / 2;
if (_startX) {
_startPointX = _startX;
}
// ** and here.
CGFloat _startPointY = 100.0f;
if (_startY) {
_startPointY = _startY;
}
_stepperPipeBG = [[UIView alloc] initWithFrame:CGRectMake(_startPointX, _startPointY, STEPPER_WIDTH, STEPPER_HEIGHT)];
_stepperPipeBG.backgroundColor = [UIColor colorWithRed:(225.0f/256.0f) green:(225.0f/256.0f) blue:(225.0f/256.0f) alpha:1.0f];
[containerView addSubview:_stepperPipeBG];
CGFloat _stepperPipeFrontWidth = ((STEPPER_WIDTH / (_numberTotalStep - 1)) * _numberCompleted);
_stepperPipeFront = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 4.0f, _stepperPipeFrontWidth, (STEPPER_HEIGHT - 8.0f))];
_stepperPipeFront.backgroundColor = COMPLETED_COLOR;
_stepperPipeFront.layer.borderWidth = 1.5f;
_stepperPipeFront.layer.borderColor = COMPLETED_BORDER_COLOR.CGColor;
[_stepperPipeBG addSubview:_stepperPipeFront];
for (int i=1; i<=_numberTotalStep; i++) {
int status = MARK_UNTOUCHED;
if (i < _numberCurrent) {
status = MARK_COMPLETED;
} else if (i == _numberCurrent) {
status = MARK_CURRENT;
} else {
status = MARK_UNTOUCHED;
}
[self drawStepperMarkInView:_stepperPipeBG withNumber:i withStatus:status];
}
}
也许我在这里遗漏了一些东西,但你试过简单地说:
stepperView.frame = containerViewFrame
此外,如果您使用的是 AutoLayout,那么您需要覆盖 viewDidLayoutSubviews
方法,以便 AutoLayout 可以首先呈现视图容器。
我将从 viewDidLoad 中删除代码并添加:
-(void)viewDidLayoutSubviews {
self.stepperView.frame = self.view.frame;
[self.view addSubview:self.stepperView];
[self.stepperView drawStepperInView:self.stepperView];
在 MyViewController
上,我将为 stepperView
添加的 UIView
对象固定到屏幕的左右边缘。我还将 StepperView.m
的 drawInStepperView:containerView
方法中的 _startPointY
更改为:
CGFloat _startPointY = 0.0f;