Relativelayout 或者 LinearLayout 开发中 ios iphone?

我想在我的顶部添加一个亚种,我必须重新计算初始值。 y 对于所有其他物种并改变他们的立场,以留下一个新的添加类型的地方。

因为我知道,这是非常无聊的 android have relativelayout 或者 linearlayout 可以帮助自动做到。

在开发中解决这个问题有多容易 ios?
已邀请:

三叔

赞同来自:

我创建了一个图书馆来解决这个特殊问题:
https://github.com/scalessec/CSLinearLayoutView
你这样用它:


// create the linear layout view
CSLinearLayoutView *linearLayoutView = [[[CSLinearLayoutView alloc] initWithFrame:self.view.bounds] autorelease];
linearLayoutView.orientation = CSLinearLayoutViewOrientationVertical;
[self.view addSubview:linearLayoutView];

// create a layout item for the view you want to display and add it to the layout view
CSLinearLayoutItem *item = [CSLinearLayoutItem layoutItemForView:someView];
item.padding = CSLinearLayoutMakePadding/5.0, 10.0, 5.0, 10.0/;
item.horizontalAlignment = CSLinearLayoutItemHorizontalAlignmentCenter;
item.fillMode = CSLinearLayoutItemFillModeNormal;
[linearLayoutView addItem:item];

// add more items

龙天

赞同来自:

我试图让一段时间相对 /线性/ 布局并最终解决了一个子类 UIScrollView, 去做这个。

我始于我刚刚更换的东西 layoutSubviews 通过在维护工作的同时使用源数据的亚种来简单的循环 Y. 但是K. scrollview 添加了一些意想不到的事情,包括 UIInlineAutoCorrect 从 textfields/views,, 这意味着这些东西被布局扭曲了。 因此,我添加了一些使用标记属性的逻辑 UIView, 确定我是否应该铺设它:


-/void/ layoutSubviews{
CGFloat runningY = 0.0f;
CGFloat widestWidth = 0.0f;
for /UIView *view in self.subviews/ {
if /view.tag != 1999/ {
continue;
}

view.origin = CGPointMake/view.origin.x, runningY/;
runningY += view.height;

if /[view autoresizingMask] == UIViewAutoresizingFlexibleWidth/ {
view.width = self.width;
}



if /view.width > widestWidth/ {
widestWidth = view.width;
}
}
[self setContentSize:CGSizeMake/widestWidth, runningY/];

}


如果您仍然希望为您的视图使用唯一标签,则应简单地指定将包含在布局中的标记范围,而不是一个值。

詹大官人

赞同来自:

亚类并不是那么多工作
UIView

在这样的方法中具有含义
-/void/addView:toRightOfView:

等等您可以沿途,仅传输您需要的方法。 然后你可以把它们称为覆盖
layoutSubviews

, 本杰明表示。

演示文稿可以使用 IB 或书面软件; Android 通过制作布局可读,可以很好地运行,您可以带来这种好处 iOS 以编程方式创建的表示。 有几个设备 iOS, 意味着除了可读性之外,这种模式不是 /直到?/ 许多实际优势。

NB. 文件 "XIB"- 这个文件 XML. 在您喜欢的文本编辑器中打开它,看看。

** EDIT.

这是我融合的简要示例。 他没有测试,但这样的东西将在你的子类工作
UIView

/也许是名字
UIRelativeView

/.


- /void/ addSubview:/UIView */ viewOne
toRightOfSubview:/UIView */ viewTwo
{
if /viewTwo == nil ||
[self.subviews contains:viewTwo] == NO/
{
[self addSubview:viewOne];
}
else
{
CGRect frameTwo = viewTwo.frame;
CGPoint originOne = CGPointMake/frameTwo.origin.x + frameTwo.size.width,
frameTwo.origin.y/;

CGRect frameOne = CGRectZero;
frameOne.origin = originOne;
frameOne.size = viewOne.frame.size;

[viewOne setFrame:frameOne];
[self addSubview:viewOne];
}
}

- /void/ moveSubview:/UIView */ viewOne
toRightOfSubview:/UIView */ viewTwo
{
if /viewTwo == nil ||
[self.subviews contains:viewTwo] == NO/
{
[self addSubview:viewOne];
}
else if /[self.subviews contains:viewOne] == NO/
{
[self addSubview:viewOne toRightOfSubview:viewTwo];
}
else
{
CGRect frameTwo = viewTwo.frame;
CGPoint originOne = CGPointMake/frameTwo.origin.x + frameTwo.size.width,
frameTwo.origin.y/;

CGRect frameOne = CGRectZero;
frameOne.origin = originOne;
frameOne.size = viewOne.frame.size;

[viewOne setFrame:frameOne];
}
}

风见雨下

赞同来自:

在这里,你不是幸运的。

iOS

在各种布局中没有用于定位物种的规定,例如

Android

. 您需要将所有其他亚种寄出以释放新类型的地方。

有一些方法可以改变演示文稿的大小,例如
sizeToFit


autoResizingMask

, 但他们在这里他们不会帮助你。

二哥

赞同来自:

iOS 更多地专注于像素的准确性而不是 Android, 它使用相对布局,因为它必须处理多种屏幕尺寸。 然而B. iOS 接口构建器是包含在内的令人难以置信的良好工具 XCode, 您可以使用的。

此外,如果您只需添加亚种反复方式,则可以覆盖方法
layoutSubviews

并用它来处理你的手工劳动力。 你提到了需要 "重新计算初始值 y 对于所有其他想法,并改变他们的立场留下一个新的附加视图的地方。" ... 你可以在你的中编码它
layoutSubviews

, 所以你每次都不要这样做。

不幸的是, SDK 默认情况下没有任何这一点。
autoresizingMask

很棒,但你不能为初始布局使用它; 这仅用于旋转时自动使用。

君笑尘

赞同来自:

以。。。开始 iOS 9 您可以使用
UIStackView

, 哪些工作非常相似
LinearLayout

: 您添加视图,并且堆栈表示根据您的大小偏好设置,根据需要将它们流式传输:

填充将使其中三个自然大小,第四个将采取最大的空间。 他使用上下文的优先级 Auto Layout, 决定哪一个伸展。

Fill Equally 它将使每个群体的大小相同,以便他们过滤堆栈可用的所有空间。

Fill 按比例使用每个亚种的内部内容大小将其大小更改为等值。 因此,观点 1 旨在具有比类型高的高度 2, 3 和 4, 在改变尺寸时,这种比率将保持在 – 所有亚种都逐渐成比例。

平等间隔不会更改亚种的大小,而是将亚种间隔的大小更改为填充空间。

相同的中心 - 最困难的,但对于许多人和最美学的人来说。 他正试图确保每个亚种的中心之间的相同距离。

您还可以通过添加一些缩进来设置堆栈视图中的表示之间的间隔。

WARNING

: 在将堆栈演示文稿添加到代码中时,应始终使用
addArrangedSubview//

通过以下方式:


stackView.addArrangedSubview/someView/


如果你试图使用通常的旧
addSubview//

, 他将无法正常工作,因为堆栈的提交将不知道如何定位它。

至于删除,您需要小心使用
stackView.removeArrangedSubview/someView/




someView.removeFromSuperview//

, 否则,视图不会被正确删除。

也许你会派上用场
https://www.hackingwithswift.com/read/31/overview
UIStackView.

要回复问题请先登录注册