iOS:以编程方式更改从 Interface Builder 设置的约束

     2023-03-15     270

关键词:

【中文标题】iOS:以编程方式更改从 Interface Builder 设置的约束【英文标题】:iOS: programmatically changing constraints set from Interface Builder 【发布时间】:2015-01-16 01:59:57 【问题描述】:

朋友们,美好的一天!

我未能尝试通过代码为在 IB 中设置的视图设置动画。应用程序崩溃,原因如下:

视图层次结构没有为约束做好准备...

我在这里看到了一些类似的问题,原因总是以编程方式创建的视图尚未添加到超级视图中。但我在 IB 中创建了所有视图!

控制台还说:

在容器层次结构中找不到视图:(这里是超级视图)

这对我来说没有任何意义,因为实际上它是适当超级视图的子视图,xcode 知道 - 它会立即打印视图层次结构并且它适合。

可能是什么原因? 谢谢!

编辑:我使用的代码:

    - (void)setEditingConstraintsForView:(UIView *)view

    // Pin given view to top, fix it height
    NSDictionary *givenView = @@"view":view;
    view.translatesAutoresizingMaskIntoConstraints = NO;

    NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:givenView];
    NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view(height)]" options:0 metrics:@@"height":@(viewHeight) views:givenView];

    [self.animatedVIew addSubview:view];

    for (NSArray *constraints in @[horizontalConstraints, verticalConstraints]) 
        [view addConstraints:constraints];
    

我还删除了我在安装新的之前在 IB 中设置的所有约束:

    - (NSDictionary *)constraintsFromIB

    if (!_constraintsFromIB) 
        _constraintsFromIB = @@"view1":self.view1.referencingConstraintsInSuperviews,
                               @"view2":self.view2.referencingConstraintsInSuperviews,
                               @"view3":self.view3.referencingConstraintsInSuperviews ;
    

    return _constraintsFromIB;

然后:

- (void)updateViewConstraints

    [super updateViewConstraints];

    // clear all constraints
    for (NSString *viewName in self.constraintsFromIB.allKeys) 
        for (NSLayoutConstraint *constraint in self.constraintsFromIB[viewName]) 
            [constraint remove];
           

更新 2:我使用调用更改的方法:当用户触摸视图时,调用此方法:

- (void)animateConstraintsForState:(LDYEditingLabel)state

    self.editingLabel = state;        
    [UIView animateWithDuration:0.3 animations:^
        [self updateViewConstraints];
        [self.view layoutIfNeeded];
    ];

后来在updateViewConstraints:有一段代码触发了我的方法setEditingConstraintsForView:(UIView *)view

【问题讨论】:

你能显示一些代码吗? 您从哪个方法调用此代码? viewDidAppear? viewDidAppear?还是其他方法? 刚刚添加了另一个编辑。它使用动画块从屏幕上的点击触发。 我看不出您在此处显示的问题。您可能需要设置断点,但我打算建议 Charlie Wu 刚刚在他的答案中添加的内容 - 如果可以的话,修改现有的约束 - 更容易 感谢您的建议。似乎将 IB 和硬编码方法混为一谈并不好。 【参考方案1】:

如果您使用 IB 创建约束,您可以添加约束作为出口。

然后更新约束并调用 [self updateViewConstraints];在动画块中

【讨论】:

感谢您的回答,这肯定会奏效。但是,如果我有很多限制要调整怎么办?我需要视图出现和消失,改变它们在屏幕上的位置等等。我认为如果我为每个约束创建出口 - 视图控制器实现将是一个可怕的混乱 如果您正在使用代码,您不会有代码循环通过视图约束并寻找正确的语气吗?当视图布局发生变化时,维护起来要困难得多。这可能不是最干净的代码,但应该很容易维护和理解【参考方案2】:

如果是我,我会将约束连接到 IBOutlets 并修改现有约束。它可能最终会比以编程方式添加和删除它们更容易。

您可能还需要在修改约束后调用setNeedsLayout

【讨论】:

感谢您的建议!它工作得很好。但是我之所以尝试以编程方式进行,是因为我有很多改变约束的观点。在某些时候,我需要所有视图从屏幕上消失并显示新视图 - 特别是 datePicker 和几个自定义控件。而且它应该返回到以前的状态。在那种情况下你会怎么做?再次感谢! 我在设置视图时保留了一系列不断变化的约束,因为无论如何您只能更改常量。我继承了 UIVIew 并且对我来说很好。

以编程方式快速更改设备方向 4 IOS 11 [重复]

】以编程方式快速更改设备方向4IOS11[重复]【英文标题】:Changethedeviceorientationprogrammaticallyswift4IOS11[duplicate]【发布时间】:2018-07-1012:55:42【问题描述】:我想将我的应用程序的某些视图限制为横向。如何实现此功能。根据Apple指... 查看详情

在运行中以编程方式更改 iOS7 状态栏颜色?

】在运行中以编程方式更改iOS7状态栏颜色?【英文标题】:ChangeiOS7StatusBarColourprogrammatically,mid-run?【发布时间】:2014-03-1615:31:28【问题描述】:我正在尝试在运行中更改状态栏颜色,即不是在加载控制器时。我更改了视图的背景... 查看详情

如何以编程方式更改轮廓按钮图标?

】如何以编程方式更改轮廓按钮图标?【英文标题】:HowcanIchangeOutlinedButtoniconprogrammatically?【发布时间】:2021-03-2405:31:39【问题描述】:https://material.io/develop/android/components/buttons#text-button从这个参考有一个setIcon方法,但我怎样... 查看详情

iOS:以编程方式更改选项卡 - 故事板

】iOS:以编程方式更改选项卡-故事板【英文标题】:iOS:Tabchangeprogrammatically-storyboard【发布时间】:2016-04-0711:13:35【问题描述】:我正在尝试在情节提要中以编程方式更改选项卡,但出现错误UIStoryboard*storyboard=[UIStoryboardstoryboardWi... 查看详情

从 NSURLRequest 以编程方式按下 html 按钮

】从NSURLRequest以编程方式按下html按钮【英文标题】:ProgrammaticallypresshtmlbuttonfromNSURLRequest【发布时间】:2012-10-3009:40:26【问题描述】:我有一个html表单,它在加载时已经填充了数据。它有保存和应用按钮。我想更改表单上的1项... 查看详情

以编程方式更改图像视图高度 ios

】以编程方式更改图像视图高度ios【英文标题】:Changeimageviewheightprogrammaticallyios【发布时间】:2016-08-0109:57:09【问题描述】:我在故事板中有这种结构:UIViewController>View>Scrollview>Scrollview>UIImageview默认图像视图大小为:3... 查看详情

如何以编程方式更改 iOS 设备音量?

】如何以编程方式更改iOS设备音量?【英文标题】:HowtochangeaniOSdevicevolumeprogrammatically?【发布时间】:2015-03-1413:53:07【问题描述】:有没有办法以编程方式更改设备音量?也许使用音频会话?【问题讨论】:【参考方案1】:我... 查看详情

以编程方式从另一个 viewController 更改 tabBarController 索引

】以编程方式从另一个viewController更改tabBarController索引【英文标题】:changingtabBarControllerIndexfromanotherviewControllerprogramatically【发布时间】:2015-04-0411:35:25【问题描述】:简短的解释。我有一个ContainerViewController,我将其推送到navi... 查看详情

从 UIView 以编程方式加载视图控制器

】从UIView以编程方式加载视图控制器【英文标题】:LoadAViewControllerprogrammaticallyfromaUIView【发布时间】:2018-01-1901:30:54【问题描述】:我在一个类中使用以下内容来调用UIViewController。UIViewController加载,但加载后变得无响应。letsto... 查看详情

以编程方式从自定义 android 键盘更改键盘

】以编程方式从自定义android键盘更改键盘【英文标题】:Programaticallychangekeyboardfromcustomandroidkeyboard【发布时间】:2012-06-2715:09:30【问题描述】:我创建了一个android自定义键盘。按下按钮后,我希望它可以将键盘改回以前的键盘... 查看详情

以编程方式更改 UIButton 大小 - iOS

】以编程方式更改UIButton大小-iOS【英文标题】:ProgrammaticallychangeUIButtonsize-iOS【发布时间】:2014-07-0116:27:21【问题描述】:我有一个使用GooglePlusiOSSDK的简单iOS应用程序。我想自定义登录按钮。我已经设法让它看起来像我想要的那... 查看详情

以编程方式更改 iOS 锁屏

】以编程方式更改iOS锁屏【英文标题】:ProgrammaticallychangingtheiOSlock-screen【发布时间】:2011-09-0818:32:02【问题描述】:我正在构建一个应用程序,它必须能够在iPhone锁定屏幕上显示我自己的视图。我见过很多可以让你自定义锁屏... 查看详情

故事板中的子类 viewController 并以编程方式从子类更改 UI

】故事板中的子类viewController并以编程方式从子类更改UI【英文标题】:SubclassviewControllerinstoryboardandprogrammaticallychangeUIfromsubclass【发布时间】:2014-04-1111:11:30【问题描述】:我基本上想要做的是有一个带有navController和几个以编程... 查看详情

从 Eclipse 插件以编程方式更改菜单项

】从Eclipse插件以编程方式更改菜单项【英文标题】:ChangeMenuItemsProgrammaticallyFromEclipsePlugin【发布时间】:2010-11-1504:33:33【问题描述】:我希望能够在我的eclipse插件应用程序启动时完全删除菜单项。我想要做的是能够稍后根据基... 查看详情

iOS 以编程方式更改 uiview 布局

】iOS以编程方式更改uiview布局【英文标题】:iOSprogrammaticallyalteruiviewlayout【发布时间】:2013-03-2622:15:35【问题描述】:我的iOS应用上有一个页面,其布局基于下图,如下所示。深灰色框=导航栏浅灰色框=UIView(用于演示,带有一... 查看详情

iOS 以编程方式更改 AppDelegate 中的视图

】iOS以编程方式更改AppDelegate中的视图【英文标题】:iOSProgrammaticallychangingviewswithinAppDelegate【发布时间】:2013-05-2406:56:12【问题描述】:当特定的推送通知通过时,我正在尝试更改视图,但我取得了小小的成功。(使用parse和推... 查看详情

从 Android 以编程方式更改 Google Talk 在线状态

】从Android以编程方式更改GoogleTalk在线状态【英文标题】:ChangeGoogleTalkonlinestatusprogrammaticallyfromAndroid【发布时间】:2011-02-0717:43:39【问题描述】:有谁知道如何通过从另一个应用程序调用用户来更改用户的在线状态?理想情况下... 查看详情

以编程方式从 Appcompat 22.2.0 更改浮动操作按钮的颜色

】以编程方式从Appcompat22.2.0更改浮动操作按钮的颜色【英文标题】:ChangecolorofFloatingActionButtonfromAppcompat22.2.0programmatically【发布时间】:2015-09-0702:15:40【问题描述】:我想知道如何更改支持库22.2.0中的浮动操作按钮颜色?我试过... 查看详情