【问题标题】:How to change frame of uiview is using autolayout in iOS?如何更改 uiview 的框架在 iOS 中使用自动布局?
【发布时间】:2014-06-27 08:06:47
【问题描述】:

我在 XIB 中添加了 1 个视图,它设置为自动布局。但是在运行时,我想更改该视图的框架。我知道如果使用自动布局,需要在我的代码中设置translatesAutoresizingMaskIntoConstraints = YES。我已经这样做了,我为该视图创建了新框架,但它在控制台中显示了警告消息:

    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSIBPrototypingLayoutConstraint:0x16e4b750 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UIView:0x16ed3c30]   (Names: '|':UIView:0x16ee06b0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x16e19e30 h=-&- v=-&- UIView:0x16ed3c30.midY == UIView:0x16ee06b0.midY + 44>",
    "<NSAutoresizingMaskLayoutConstraint:0x16e19e60 h=-&- v=-&- UIView:0x16ed3c30.height == UIView:0x16ee06b0.height>"
)

Will attempt to recover by breaking constraint 
<NSIBPrototypingLayoutConstraint:0x16e4b750 'IB auto generated at build time for view with fixed frame' V:|-(0)-[UIView:0x16ed3c30]   (Names: '|':UIView:0x16ee06b0 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

这是创建新框架的代码,我只希望 Y 的原点等于 0。

self.leftView.frame= CGRectMake(0, 0, 40, self.view.frame.size.height);

我该如何修复这个错误?请给一些建议。非常感谢。

【问题讨论】:

    标签: ios objective-c uiview constraints


    【解决方案1】:

    如果我理解正确,我认为你需要在你的类中使用一个存储的 NSLayoutConstraint 变量,然后将约束的常量值更新为 0 以使你的 UIView 滑动到顶部。

    另外,当您使用自动布局时,您通常会设置:

    myView.translateAutoResizingMaskIntoConstraint = NO;
    

    那是 NO 而不是 YES。

    所以一个例子是这样的:

    @interface MyViewController()
    {
        NSLayoutConstraint *myViewTopConstraint;
    }
    
    @end
    
    @implementation MyViewController
    
    -(void)setupMyConstraintsMethod
    {
        ...
    
        // ---------------------------------------------------------------
        // This constraint here says "myView" top edge should be pinned
        // to the top edge of the view controller's view but with an offset
        // of 50 pixels. 
        // ---------------------------------------------------------------
        NSLayoutConstraint *myViewTopConstraint = [NSLayoutConstraint constraintWithItem:self.myView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop multiplier:1.0 constant:50.0];
    
        [self.view addConstraint:myViewTopConstraint];
    }
    
    -(void)buttonPressed:(id)sender
    {
        // ------------------------------------------------------------
        // now you want myView's top edge to be at the top of your
        // view controller's view, so you set the constant to 0
        // ------------------------------------------------------------
        myViewTopConstraint.constant = 0;
    
        // animates the sliding up of "myView"
        [UIView animateWithDuration:0.5 animations:^{
            [self.view layoutIfNeeded];
        }];
    }
    
    @end
    

    【讨论】:

    • 谢谢,但它不起作用。我试过你的代码,但它仍然显示警告。
    • 您是否有额外的 XIB 文件约束冲突?
    猜你喜欢
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 2015-04-20
    • 2015-11-07
    • 2014-11-21
    • 2020-06-03
    相关资源
    最近更新 更多