Xcode 子视图高度调整

Xcode 子视图高度调整,xcode,uiview,hidden,Xcode,Uiview,Hidden,我有一个包含2个子视图的UIView。一次只能看到一个子视图,由分段控件控制。子视图具有不同的高度。如何将UIView高度设置为依赖于可见子视图 编辑- 下面的代码适用于分段控件的初始前后顺序,但随后保持在30px。调试器显示存在满足约束的问题,但我不确定如何更正它 错误: 无法同时满足约束。 可能下面列表中至少有一个约束是您不想要的。试着这样做:(1)看看每个约束,试着找出你不期望的约束;(2) 找到添加了不需要的约束的代码,然后修复它。(注意:如果您看到不理解的NSAutoresizingM

我有一个包含2个子视图的UIView。一次只能看到一个子视图,由分段控件控制。子视图具有不同的高度。如何将UIView高度设置为依赖于可见子视图

编辑- 下面的代码适用于分段控件的初始前后顺序,但随后保持在30px。调试器显示存在满足约束的问题,但我不确定如何更正它

错误:

无法同时满足约束。 可能下面列表中至少有一个约束是您不想要的。试着这样做:(1)看看每个约束,试着找出你不期望的约束;(2) 找到添加了不需要的约束的代码,然后修复它。(注意:如果您看到不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性TranslatesAutoResizingMaskToConstraints的文档)


谢谢

好的,我在故事板中设置了这个,并让它开始工作

所以你有你的三个UIView的故事板

在您的.h文件中

@property (nonatomic, retain) IBOutlet UIView *parentView;
@property (nonatomic, retain) IBOutlet UIView *HDDView;
@property (nonatomic, retain) IBOutlet UIView *SSDView;
然后在你的.m文件中

@synthesize parentView, HDDView, SSDView;

- (void)viewDidLoad {

    //so here you can set which uiview is hidden when the view loads
    //or you probably did it in your storyboard, either way works
    self.SSDView.hidden = YES;

}

- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
 switch (sender.selectedSegmentIndex) {
     case 0:
         self.HDDView.hidden = NO;
         self.SSDView.hidden = YES;


         CGRect newFrame = parentView.frame;
         newFrame.size.height = HDDView.frame.size.height;
         parentView.frame = newFrame;

         break;
     case 1:
         self.HDDView.hidden = YES;
         self.SSDView.hidden = NO;

         CGRect otherFrame = parentView.frame;
         otherFrame.size.height = SSDView.frame.size.height;
         parentView.frame = otherFrame;

         break;
     default:
     break;
     }
 }
现在,在故事板中添加SSDView和HDDView UIView,并将它们连接到各自的IBOutlet。然后添加您的parentView UIView并将其连接起来。然后将SSDView和HDDView拖动到parentView UIView内部**确保将SSDView和HDDView放在父视图的顶部,以便每个UIView的上界齐平。还要确保没有将其中一个子视图拖到另一个子视图中。最后向parentView添加一些约束,使其处于所需的位置。然后连接分段控制器,就可以开始了


总而言之,我建议不要将Interface Builder用于像这样复杂的事情。你可以用代码来实现这一点,它将更易于定制和调整。我开始使用IB,但以编程方式做这些事情要好得多,因为您可以拥有更多的控制。我希望这对您有所帮助。

这可能不是最干净的,但我能够让下面的代码正常工作。感谢@AJB的帮助

- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
switch (sender.selectedSegmentIndex) {
    case 0:
        self.1stView.hidden = NO;
        self.2ndView.hidden = YES;

        _1stconstraint = [NSLayoutConstraint
                       constraintWithItem:_ParentView
                       attribute:NSLayoutAttributeHeight
                       relatedBy:NSLayoutRelationEqual
                       toItem:nil
                       attribute:NSLayoutAttributeNotAnAttribute
                       multiplier:1.0
                       constant:30.0];

        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];

        [_ParentView removeConstraint:_2ndconstraint];
        [_ParentView addConstraint:_1stconstraint];

        break;
    case 1:
        self.1stView.hidden = YES;
        self.2ndView.hidden = NO;

        _2ndconstraint = [NSLayoutConstraint
                                  constraintWithItem:_ParentView
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:nil
                                  attribute:NSLayoutAttributeNotAnAttribute
                                  multiplier:1.0
                                  constant:60.0];

        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];

        [_ParentView removeConstraint:_1stconstraint];
        [_ParentView addConstraint:_2ndconstraint];

        break;
    default:
        break;
    }
}

谢谢你的回复。他们都是普通人。那么在您的示例中,您的图像将是子视图,而您的UIView将是父视图?或者你的视图是临时视图?Thanks@JasonBestor我现在改变了我的答案。yourUIView是父视图,yourUISubView将是您要添加到父视图的视图。我无法使其正常工作,我认为这是因为我的视图和子视图已在情节提要中创建。每个子视图都包含一个文本框和按钮,但第一个子视图高30像素,第二个子视图高60像素。在切换分段控件并交换隐藏的子视图时,它们所在的父视图具有自动调整依赖项,我正试图向下移动该依赖项。我希望这能澄清。。。谢谢again@JasonBestor你能发布你的代码吗?这样我可以看到你是如何做的,并帮助你更多。我希望我可以,但它主要是在故事板上的方式,我解释上述。代码只是分段视图操作。有问题的代码
@synthesize parentView, HDDView, SSDView;

- (void)viewDidLoad {

    //so here you can set which uiview is hidden when the view loads
    //or you probably did it in your storyboard, either way works
    self.SSDView.hidden = YES;

}

- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
 switch (sender.selectedSegmentIndex) {
     case 0:
         self.HDDView.hidden = NO;
         self.SSDView.hidden = YES;


         CGRect newFrame = parentView.frame;
         newFrame.size.height = HDDView.frame.size.height;
         parentView.frame = newFrame;

         break;
     case 1:
         self.HDDView.hidden = YES;
         self.SSDView.hidden = NO;

         CGRect otherFrame = parentView.frame;
         otherFrame.size.height = SSDView.frame.size.height;
         parentView.frame = otherFrame;

         break;
     default:
     break;
     }
 }
- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
switch (sender.selectedSegmentIndex) {
    case 0:
        self.1stView.hidden = NO;
        self.2ndView.hidden = YES;

        _1stconstraint = [NSLayoutConstraint
                       constraintWithItem:_ParentView
                       attribute:NSLayoutAttributeHeight
                       relatedBy:NSLayoutRelationEqual
                       toItem:nil
                       attribute:NSLayoutAttributeNotAnAttribute
                       multiplier:1.0
                       constant:30.0];

        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];

        [_ParentView removeConstraint:_2ndconstraint];
        [_ParentView addConstraint:_1stconstraint];

        break;
    case 1:
        self.1stView.hidden = YES;
        self.2ndView.hidden = NO;

        _2ndconstraint = [NSLayoutConstraint
                                  constraintWithItem:_ParentView
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:nil
                                  attribute:NSLayoutAttributeNotAnAttribute
                                  multiplier:1.0
                                  constant:60.0];

        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];

        [_ParentView removeConstraint:_1stconstraint];
        [_ParentView addConstraint:_2ndconstraint];

        break;
    default:
        break;
    }
}