【问题标题】:How to specify square (actually round) avatar in Xcode 5 storyboard with Auto Layout on?如何在启用自动布局的 Xcode 5 故事板中指定方形(实际上是圆形)头像?
【发布时间】:2014-04-27 23:31:04
【问题描述】:

Xcode 5 中有没有一种方法可以指定图像视图应该是方形的——无论是纵向还是横向?

是否可以在情节提要中(启用“自动布局”)或者我必须在视图控制器源代码中这样做?

我已经准备好了a simple test app for iPhone。在顶部它应该显示一个圆形的用户头像,所以我通过 CocoaPods 使用 SDWebImage 和 NZCircularImageView

所以头像边界应该是方形的。当我通过约束(此处为fullscreen)将其宽度和高度设置为 280 时,

这可行 - 但仅限纵向模式:

虽然在横向上,这当然会失败:

所以我想知道是否有一个技巧可以使它在横向上也能工作(头像是完美的圆形)?

更新:

当旋转到横向时,有这个警告:

2014-04-26 17:57:00.967 MyPhone[1220:60b] Unable to simultaneously satisfy constraints.
    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) 
(
    "<NSLayoutConstraint:0x8c82e10 H:[NZCircularImageView:0x8c82a70(280)]>",
    "<NSLayoutConstraint:0x8c87640 H:[NZCircularImageView:0x8c82a70]-(20)-|   (Names: '|':UIView:0x8c86870 )>",
    "<NSLayoutConstraint:0x8c876a0 H:|-(20)-[NZCircularImageView:0x8c82a70]   (Names: '|':UIView:0x8c86870 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x8d48410 h=--& v=--& V:[UIView:0x8c86870(480)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x8c82e10 H:[NZCircularImageView:0x8c82a70(280)]>

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.

所以按照 Jesse 的建议,我已经移除了多余的约束(图像视图的左侧和右侧)并添加了水平对齐以将图像视图保持在中间。

但是我仍然不知道如何在横向模式下缩小图像视图 - 这样它就不会与视图底部的 2 个标签和按钮重叠:

我想要达到的目标:

  • 在顶部有一个圆形(即它的边界应该是方形)头像
  • 2 个标签和按钮应始终在底部可见
  • 头像应该增长以占用任何可用空间

更新 2:

我添加了比例 1:1 约束以及从图像视图底部到名字标签的 20 像素(此处为 fullscreen):

现在的风景还可以,和我想要的完全一样:

但是纵向模式不行:宽度不适合:

如果我只是添加左/右约束,它看起来并不好:

【问题讨论】:

  • 是的。与其从 ImageView 拖动到 SuperView,不如从 ImageView 拖动到自身。然后你可以限制宽度等于高度。这需要最新的 Xcode(我认为是 5.1 或更高版本),否则您必须在代码中完成。

标签: ios xcode sdwebimage autolayout


【解决方案1】:

您可以将图像的宽度固定为 280 像素,然后 ctrl 从图像视图拖动到自身并使用乘数 1 选择纵横比约束。这将使您的图像视图的高度与其宽度匹配

【讨论】:

    【解决方案2】:

    这是我的做法:

    1. 将比率设置为1:1
    2. 将水平左右间距设置为&gt;= 约束。
    3. 将顶部空间设置为固定值
    4. 将图像到第一个标签的垂直间距设置为&gt;=约束
    5. 使标签固定在底部
    6. 水平居中图像。

    这是我的约束的屏幕截图,请注意固定宽度在构建时被删除。这只是为了让 IB 把正方形做成 0px 以外的东西。

    【讨论】:

    • +1 谢谢,但是如果我按照您的建议 4(与 6 相同?),那么头像的尺寸会变为零?我不明白如何防止头像缩小到 0x0 - 当我将其左、右、底部约束设置为“大于或等于”时。
    • 是的,#4 和#6 是一样的。我没有注意到我已经写了两次。
    【解决方案3】:

    您的观点受到了过度限制;您已将宽度和约束设置为超级视图的左右边缘。这在横向上无法满足,因此您必须消除一些约束。 (您可能在日志中收到关于此的错误?)

    我不确定您到底想要什么效果,但您可以尝试移除左右边缘约束,而是添加水平居中约束。这将使您在两个方向上查看相同的大小。如果您想要不同的东西,请尝试添加更多细节或您想要的横向布局模型。

    【讨论】:

    • +1 谢谢 - 我已经删除了多余的约束并将图像视图水平居中,但我仍然不知道如何在横向模式下缩小图像视图......请看一下我更新的问题
    • 你应该听从 Azat 的建议,将图像视图的宽度固定到它的高度,纵横比为 1。这样可以保持正方形。要将其保持在按钮上方,只需在图像视图底部到按钮顶部之间进行约束。 (并从图像视图中删除您的高度限制,否则它将再次受到过度限制。)
    • 杰西,你能看看“更新2”吗?我添加了比例 1:1 约束和底部约束 - 但是如何修复图像视图宽度?
    • 你的视图是不是又被过度约束了?您可能需要更改某些约束的优先级,或者将其中一些约束设为不等式。
    猜你喜欢
    • 2015-03-26
    • 2015-11-30
    • 2015-11-28
    • 2018-04-15
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多