jjzjj

ios - 在哪里更改自动布局约束的 "installed"?

coder 2023-07-28 原文

在 Storyboard 中使用自动布局时,可以通过“已安装”复选框选择是否安装约束。禁用它会导致它的行为就像您没有添加该约束一样——它不会有任何效果。您可以在 Interface Builder 中为不同大小的类配置安装状态,并且可以通过将其 active 属性设置为 truefalse 以编程方式更改此值>.

在我的应用程序中,我只想在设备处于纵向时安装约束 - 当旋转到横向时应该“卸载”它。对于 iPhone,这可以通过取消选中 Any Width Compact Height 的 installed 来完成。 (虽然这似乎不太正确,因为它打破了这个约束,因为它在旋转到横向时甚至不应该安装它时由于冲突约束而打破了这个约束,但不管 UI 总是按预期出现。)但是没有办法卸载Interface Builder 中横向 iPad 的约束(在两个方向上都是常规宽度常规高度)。

在旋转设备时为 NSLayoutConstraint 启用/禁用 active 的正确位置在哪里?在什么旋转方法中会改变该状态导致预期的行为 - 只为纵向安装?如果应用程序启动时不调用该方法,除了旋转方法之外,还应将其放置在什么其他方法中?

我尝试将以下代码放在 viewDidLoadviewWillTransitionToSize 中,但这会导致在 iPad 上运行时出现一些意外行为:

  • 尽管 active 设置为 false,但横向启动应用会导致约束处于事件状态,这会破坏约束,并且 UI 不会按预期显示
  • 以纵向模式启动应用程序会将 active 设置为 true(它已安装在 IB 中),因此它可以按预期工作
  • 以纵向方式启动应用并将设备旋转为横向方式按预期工作 - 约束设置为非事件状态,它不会打破约束,用户界面按预期显示
  • 以纵向启动应用、旋转到横向并返回纵向会使 UI 显示正确,但它打破了设置为事件的限制

如果我在 Interface Builder 中卸载约束,然后运行上述场景,我会得到基本上相反的行为。

if size.width > size.height {
    self.myConstraint.active = false
} else {
    self.myConstraint.active = true
}

最佳答案

我回答有点晚了,但是当我遇到类似的问题来解决 Autolayout 无法检测 iOS 7 的 iPhone 的紧凑宽度/紧凑高度的问题时,这是我的 2 美分。 iOS 7 中没有 activated 属性,所以我不得不添加/删除它们。

我创建了两个方法来添加和删除约束,这些约束已经在 IB 上设置,我使用 IBOutlet 属性引用它们。因此,由于我删除了它们,与其他 IB 对象不同,我应该将它们设置为 strong,而不是 weak。否则,一旦我删除它们,它们就会被销毁,我将无法再次引用它们来重新添加它们。

这是我的约束移除方法:

-(void)removeiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

    if( !UIInterfaceOrientationIsLandscape(toInterfaceOrientation )&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )){
         // if iPhone with iOS 7 on portrait remove Constraints here

    }
}

这是约束添加器方法:

-(void)addiOS7andiPhone4inLandscapeToOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

    if( UIInterfaceOrientationIsLandscape(toInterfaceOrientation )&&(NSFoundationVersionNumber<=NSFoundationVersionNumber_iOS_7_1)&&( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )){
       // if iPhone with iOS 7 on landscape add Constraints here

    }

}

至于在哪里调用这些方法,正如你所尝试的,在viewWillAppear中调用它们(不需要在viewWillDisappear中调用)和viewWillTransitionToSize(在我的例子中,这是 willRotateToInterfaceOrientation,因为 viewWillTransitionToSize 仅在 iOS 8 之后可用)。随后调用它们是有意义的,毕竟在进行必要的更改之前,由于使用 if 检查它们的纵向/横向方向,因此只会运行其中一个。

这是我的willRotateToInterfaceOrientation 方法定义:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];

    // this will be run only if orientation is on Portrait
    [self addiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation];

    // this will be run only if orientation is on Landscape
    [self removeiOS7andiPhone4inLandscapeToOrientation:toInterfaceOrientation];
}

并在 viewWillAppear 中进行类似的调用。

注意:确保您在这些方法中做的是完全相反的事情,您不一定只在 addConstraintMethod 中添加约束,只在 removeConstraintMethod 中删除约束。在我的例子中,我在每个方法中都添加和删除了约束,所以方法的命名并不能准确反射(reflect)它们的真正作用,但只要你做的是完全相反的事情,你就可以继续了。

关于ios - 在哪里更改自动布局约束的 "installed"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28260033/

有关ios - 在哪里更改自动布局约束的 "installed"?的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  3. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  4. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  5. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  6. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  7. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  10. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

随机推荐