【问题标题】:Subview height resize子视图高度调整大小
【发布时间】:2014-11-13 04:58:40
【问题描述】:

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

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

错误:

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

("<NSLayoutConstraint:0x7f84f84b3b80 V:[UIView:0x7f84f852bc60(60)]>",
"<NSLayoutConstraint:0x7f84f8494d20 V:[UIView:0x7f84f852bc60(30)]>")

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f84f84b3b80 V:[UIView:0x7f84f852bc60(60)]>

代码:

- (IBAction)segmentValueChanged:(UISegmentedControl *)sender {
switch (sender.selectedSegmentIndex) {
    case 0:
        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [_ParentView addConstraint:[NSLayoutConstraint
                                   constraintWithItem:_ParentView
                                   attribute:NSLayoutAttributeHeight
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:nil
                                   attribute:NSLayoutAttributeNotAnAttribute
                                   multiplier:1.0
                                   constant:30.0]];

        self.1stView.hidden = NO;
        self.2ndView.hidden = YES;
        break;
    case 1:
        [_ParentView setTranslatesAutoresizingMaskIntoConstraints:NO];
        [_ParentView addConstraint:[NSLayoutConstraint
                                  constraintWithItem:_ParentView
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:nil
                                  attribute:NSLayoutAttributeNotAnAttribute
                                  multiplier:1.0
                                  constant:60.0]];

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

谢谢

【问题讨论】:

    标签: xcode uiview hidden


    【解决方案1】:

    好的,我在情节提要中设置了它并让它工作。

    所以你有故事板的三个 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 并将它们连接到它们的 IBOutlets。然后添加您的 parentView UIView 并将其连接起来。然后将 SSDView 和 HDDView 拖到 parentView UIView 里面。 **确保将 SSDView 和 HDDView 放在 parentView 的顶部,以便每个 UIView 的顶部边界是齐平的。还要确保您没有将其中一个子视图拖到另一个子视图中。最后向 parentView 添加一些约束,使其处于您想要的位置。然后连接你的分段控制器,你就可以开始了。

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

    【讨论】:

    • 感谢您的回复。它们都是普通的 UIView。所以在你的例子中 yourImage 将是他的子视图,而 yourUIView 将是父视图?还是 yourUIView 是临时视图?谢谢
    • @JasonBestor 我现在更改了对 UIViews 的回答。 yourUIView 是父视图,yourUISubView 是您要添加到父视图的视图。
    • 我无法让它工作,我认为这是因为我的视图和子视图已经在情节提要中创建。每个子视图包含一个文本框和按钮,但第一个子视图是 30px 高,第二个是 60px。他们所在的父视图具有自动调整大小的依赖关系,当切换分段控件并交换隐藏的子视图时,我试图将其向下移动。我希望澄清......再次感谢
    • @JasonBestor 你能发布你有什么代码吗?这样我就可以看到你的表现并为你提供更多帮助。
    • 我希望我可以,但它主要以我上面解释的方式在情节提要中。该代码只是分段视图操作。有问题的代码
    【解决方案2】:

    它可能不是最干净的,但我能够让下面的代码工作。感谢@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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 2015-01-16
      相关资源
      最近更新 更多