Skip to content

Commit

Permalink
Release V1.2.0 fix #issue25
Browse files Browse the repository at this point in the history
  • Loading branch information
fzy authored and fzy committed Aug 4, 2018
1 parent 74ebd2a commit ed46490
Show file tree
Hide file tree
Showing 16 changed files with 480 additions and 21 deletions.
12 changes: 11 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
# Change Log
**TangramKit**中的所有历史版本变化将会在这个文件中列出。

---
---

## [V1.2.0](https://github.com/youngsoft/TangramKit/releases/tag/1.2.0)(2018/08/04)

#### Added
1. 添加布局属性`tg_layoutTransform`,用来实现对布局内子视图的整体位置变换,可以通过这个属性来实现一般常见的平移,缩放,水平翻转,垂直翻转等功能。具体的DEMO在新增加的[AllTest9ViewController](https://github.com/youngsoft/TangramKit/blob/master/TangramKitDemo/IntegratedDemo/AllTest9ViewController.swift)中可以查看。
2. 为流式布局`MyFlowLayout`支持子视图固定尺寸并且间距动态拉伸调整的能力,你可以通过设置流式布局的方法:`tg_setSubviews`来实现,这个方法原先只支持内容约束流式布局,现在新版本对数量约束流式布局也同样支持了。具体的DEMO在新增加的[FLLTest8ViewController](https://github.com/youngsoft/TangramKit/blob/master/TangramKitDemo/FlowLayoutDemo/FLLTest8ViewController.swift)中可以查看。

#### Fixed
1. 修复了UILabel等控件的尺寸设置了.wrap并且同时又设置了最大最小尺寸时,在相对布局内进行尺寸计算内可能会出现的问题。[#issue25](https://github.com/youngsoft/TangramKit/issues/25)


## [V1.1.6](https://github.com/youngsoft/TangramKit/releases/tag/1.1.6)(2018/05/10)

Expand Down
2 changes: 1 addition & 1 deletion TangramKit.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ Pod::Spec.new do |s|
#

s.name = "TangramKit"
s.version = "1.1.6"
s.version = "1.2.0"
s.summary = "TangramKit is A powerful iOS UI framework. It integrated the Android layout,AutoLayout,SizeClass, HTML/CSS float and flexbox functions."

s.description = <<-DESC
Expand Down
8 changes: 8 additions & 0 deletions TangramKit.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
20B6C6E71FA40AEC001D51C7 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20B6C6E61FA40AEC001D51C7 /* DetailViewController.swift */; };
20DCF335208CD022007A879B /* FOLTest7ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20DCF334208CD022007A879B /* FOLTest7ViewController.swift */; };
20FC8FE220A4241D0029DE31 /* FLLTest7ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20FC8FE120A4241D0029DE31 /* FLLTest7ViewController.swift */; };
4680F8FD211583FF00BFB765 /* FLLTest8ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4680F8FC211583FF00BFB765 /* FLLTest8ViewController.swift */; };
4680F8FF2115891600BFB765 /* AllTest9ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4680F8FE2115891600BFB765 /* AllTest9ViewController.swift */; };
681BD8DF1E0B91A500403A1F /* TangramKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 681BD8DD1E0B91A500403A1F /* TangramKit.h */; settings = {ATTRIBUTES = (Public, ); }; };
681BD90F1E0B92E100403A1F /* TangramKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681BD9011E0B92E100403A1F /* TangramKit.swift */; };
681BD9111E0B92E100403A1F /* TGBaseLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 681BD9021E0B92E100403A1F /* TGBaseLayout.swift */; };
Expand Down Expand Up @@ -108,6 +110,8 @@
20B6C6E61FA40AEC001D51C7 /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = "<group>"; };
20DCF334208CD022007A879B /* FOLTest7ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FOLTest7ViewController.swift; sourceTree = "<group>"; };
20FC8FE120A4241D0029DE31 /* FLLTest7ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FLLTest7ViewController.swift; sourceTree = "<group>"; };
4680F8FC211583FF00BFB765 /* FLLTest8ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FLLTest8ViewController.swift; sourceTree = "<group>"; };
4680F8FE2115891600BFB765 /* AllTest9ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllTest9ViewController.swift; sourceTree = "<group>"; };
681BD8DB1E0B91A500403A1F /* TangramKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TangramKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
681BD8DD1E0B91A500403A1F /* TangramKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TangramKit.h; sourceTree = "<group>"; };
681BD8DE1E0B91A500403A1F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand Down Expand Up @@ -292,6 +296,7 @@
184243071E327F0800E2CCE1 /* FLLTest5ViewController.swift */,
18058AAE1E63B4EA00EAECDC /* FLLTest6ViewController.swift */,
20FC8FE120A4241D0029DE31 /* FLLTest7ViewController.swift */,
4680F8FC211583FF00BFB765 /* FLLTest8ViewController.swift */,
);
path = FlowLayoutDemo;
sourceTree = "<group>";
Expand All @@ -316,6 +321,7 @@
68F036041E0B7D2700CEBAEF /* AllTest6ViewController.swift */,
68F036051E0B7D2700CEBAEF /* AllTest7ViewController.swift */,
18BCBD451E1336D900AC7766 /* AllTest8ViewController.swift */,
4680F8FE2115891600BFB765 /* AllTest9ViewController.swift */,
68F036061E0B7D2700CEBAEF /* AllTestModel&View */,
);
path = IntegratedDemo;
Expand Down Expand Up @@ -544,6 +550,7 @@
18058AAF1E63B4EA00EAECDC /* FLLTest6ViewController.swift in Sources */,
68F036501E0B7D2700CEBAEF /* AllTest2ViewController.swift in Sources */,
20B6C6E71FA40AEC001D51C7 /* DetailViewController.swift in Sources */,
4680F8FD211583FF00BFB765 /* FLLTest8ViewController.swift in Sources */,
184243081E327F0800E2CCE1 /* FLLTest5ViewController.swift in Sources */,
68F0363D1E0B7D2700CEBAEF /* CFTool.swift in Sources */,
68F036581E0B7D2700CEBAEF /* AllTest2TableViewCell.swift in Sources */,
Expand Down Expand Up @@ -580,6 +587,7 @@
68F0364C1E0B7D2700CEBAEF /* FLTest2ViewController.swift in Sources */,
68F036471E0B7D2700CEBAEF /* FLLTest1ViewController.swift in Sources */,
68F036691E0B7D2700CEBAEF /* LLTest3ViewController.swift in Sources */,
4680F8FF2115891600BFB765 /* AllTest9ViewController.swift in Sources */,
68F036511E0B7D2700CEBAEF /* AllTest3ViewController.swift in Sources */,
68F0364B1E0B7D2700CEBAEF /* FLTest1ViewController.swift in Sources */,
68F0363C1E0B7D2700CEBAEF /* AppDelegate.swift in Sources */,
Expand Down
61 changes: 60 additions & 1 deletion TangramKit/TGBaseLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,24 @@ open class TGBaseLayout: UIView,TGLayoutViewSizeClass {
}


public var tg_layoutTransform: CGAffineTransform
{
get
{
return (self.tgCurrentSizeClass as! TGLayoutViewSizeClass).tg_layoutTransform
}
set
{
let lsc = self.tgCurrentSizeClass as! TGLayoutViewSizeClass
if lsc.tg_layoutTransform != newValue
{
lsc.tg_layoutTransform = newValue
setNeedsLayout()
}

}
}


/**
把一个布局视图放入到UIScrollView(UITableView和UICollectionView除外)内时是否自动调整UIScrollView的contentSize值。默认是.auto表示布局视图会自动接管UIScrollView的contentSize的值。 你可以将这个属性设置.no而不调整和控制contentSize的值,设置为.yes则一定会调整contentSize.
Expand Down Expand Up @@ -3285,7 +3303,19 @@ extension TGBaseLayout
//最终的结果是非布局视图的宽度是wrap的情况下适用。
if (sbv as? TGBaseLayout) == nil && sbvsc.width.isWrap
{
let fitSize = sbv.sizeThatFits(CGSize.zero)
var fits = CGSize.zero

if let t = sbvsc.width.maxVal?.numberVal
{
fits.width = t
}

if let t = sbvsc.height.maxVal?.numberVal
{
fits.height = t
}

let fitSize = sbv.sizeThatFits(fits)
sbvtgFrame.width = sbvsc.width.measure(fitSize.width)
if sbvsc.height.isWrap
{
Expand Down Expand Up @@ -3344,6 +3374,35 @@ extension TGBaseLayout
}
}
}

internal func tgAdjustSubviewsLayoutTransform(sbs:[UIView], lsc:TGLayoutViewSizeClassImpl, selfSize:CGSize)
{
let layoutTransform = lsc.tg_layoutTransform
if !layoutTransform.isIdentity
{
for sbv in sbs
{
let sbvtgFrame = sbv.tgFrame

//取子视图中心点坐标。因为这个坐标系的原点是布局视图的左上角,所以要转化为数学坐标系的原点坐标, 才能应用坐标变换。
var centerPoint = CGPoint(x:sbvtgFrame.leading + sbvtgFrame.width / 2.0 - selfSize.width / 2.0,
y:sbvtgFrame.top + sbvtgFrame.height / 2.0 - selfSize.height / 2.0)

//应用坐标变换
centerPoint = centerPoint.applying(layoutTransform)

//还原为左上角坐标系。
centerPoint.x += selfSize.width / 2.0
centerPoint.y += selfSize.height / 2.0

//根据中心点的变化调整开始和结束位置。
sbvtgFrame.leading = centerPoint.x - sbvtgFrame.width / 2.0
sbvtgFrame.trailing = sbvtgFrame.leading + sbvtgFrame.width
sbvtgFrame.top = centerPoint.y - sbvtgFrame.height / 2.0
sbvtgFrame.bottom = sbvtgFrame.top + sbvtgFrame.height
}
}
}

internal func tgGetSubviewFrameAndSizeClass(_ subview:UIView) -> (TGFrame, TGViewSizeClassImpl)
{
Expand Down
2 changes: 1 addition & 1 deletion TangramKit/TGFloatLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ open class TGFloatLayout: TGBaseLayout,TGFloatLayoutViewSizeClass {


tgAdjustLayoutSelfSize(selfSize: &selfSize, lsc: lsc)

tgAdjustSubviewsLayoutTransform(sbs: sbs, lsc: lsc, selfSize: selfSize)
tgAdjustSubviewsRTLPos(sbs: sbs, selfWidth: selfSize.width)


Expand Down
95 changes: 81 additions & 14 deletions TangramKit/TGFlowLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -241,11 +241,11 @@ open class TGFlowLayout:TGBaseLayout,TGFlowLayoutViewSizeClass {


/**
*在内容约束流式布局的一些应用场景中我们有时候希望某些子视图的宽度是固定的情况下,子视图的间距是浮动的而不是固定的,这样就可以尽可能的容纳更多的子视图。比如每个子视图的宽度是固定80,那么在小屏幕下每行只能放3个,而我们希望大屏幕每行能放4个或者5个子视图。 因此您可以通过如下方法来设置浮动间距,这个方法会根据您当前布局的orientation方向不同而意义不同:
*在流式布局的一些应用场景中我们有时候希望某些子视图的宽度或者高度是固定的情况下,子视图的间距是浮动的而不是固定的。比如每个子视图的宽度是固定80,那么在小屏幕下每行只能放3个,而我们希望大屏幕每行能放4个或者5个子视图。 因此您可以通过如下方法来设置浮动间距,这个方法会根据您当前布局的orientation方向不同而意义不同:
1.如果您的布局方向是.vert表示设置的是子视图的水平间距,其中的size指定的是子视图的宽度,minSpace指定的是最小的水平间距,maxSpace指定的是最大的水平间距,如果指定的subviewSize计算出的间距大于这个值则会调整subviewSize的宽度。
2.如果您的布局方向是.horz表示设置的是子视图的垂直间距,其中的size指定的是子视图的高度,minSpace指定的是最小的垂直间距,maxSpace指定的是最大的垂直间距,如果指定的subviewSize计算出的间距大于这个值则会调整subviewSize的高度。
3.如果您不想使用浮动间距则请将subviewSize设置为0就可以了。
4.这个方法只在内容约束流式布局里面设置才有意义
4.对于数量约束流式布局来说,因为每行和每列的数量的固定的,因此不存在根据屏幕的大小自动换行的能力以及进行最佳数量的排列,但是可以使用这个方法来实现所有子视图尺寸固定但是间距是浮动的功能需求
*/
public func tg_setSubviews(size:CGFloat, minSpace:CGFloat, maxSpace:CGFloat = CGFloat.greatestFiniteMagnitude, inSizeClass type:TGSizeClassType = TGSizeClassType.default)
{
Expand Down Expand Up @@ -424,7 +424,7 @@ open class TGFlowLayout:TGBaseLayout,TGFlowLayoutViewSizeClass {
}

tgAdjustLayoutSelfSize(selfSize: &selfSize, lsc: lsc)

tgAdjustSubviewsLayoutTransform(sbs: sbs, lsc: lsc, selfSize: selfSize)
tgAdjustSubviewsRTLPos(sbs: sbs, selfWidth: selfSize.width)

return self.tgAdjustSizeWhenNoSubviews(size: selfSize, sbs: sbs, lsc:lsc)
Expand Down Expand Up @@ -888,9 +888,36 @@ extension TGFlowLayout
let horzGravity:TGGravity = self.tgConvertLeftRightGravityToLeadingTrailing(lsc.tg_gravity & TGGravity.vert.mask)
let vertAlignment:TGGravity = lsc.tg_arrangedGravity & TGGravity.horz.mask

let horzSpace = lsc.tg_hspace
var horzSpace = lsc.tg_hspace
let vertSpace = lsc.tg_vspace

var subviewSize = lsc.subviewSize
if (subviewSize != 0)
{

let minSpace = lsc.minSpace
let maxSpace = lsc.maxSpace

if arrangedCount > 1
{
horzSpace = (selfSize.width - lsc.tgLeadingPadding - lsc.tgTrailingPadding - subviewSize * CGFloat(arrangedCount))/CGFloat(arrangedCount - 1)

if _tgCGFloatGreat(horzSpace , maxSpace) || _tgCGFloatLess(horzSpace, minSpace)
{
if _tgCGFloatGreat(horzSpace , maxSpace)
{
horzSpace = maxSpace
}

if _tgCGFloatLess(horzSpace, minSpace)
{
horzSpace = minSpace
}

subviewSize = (selfSize.width - lsc.tgLeadingPadding - lsc.tgTrailingPadding - horzSpace * CGFloat(arrangedCount - 1)) / CGFloat(arrangedCount)

}
}
}

//判断父滚动视图是否分页滚动
var isPagingScroll = false
Expand Down Expand Up @@ -984,12 +1011,17 @@ extension TGFlowLayout
}
else
{
if (pagingItemWidth != 0)
if subviewSize != 0
{
rect.size.width = subviewSize
}

if pagingItemWidth != 0
{
rect.size.width = pagingItemWidth
}

if (sbvsc.width.numberVal != nil && !averageArrange)
if sbvsc.width.numberVal != nil && !averageArrange
{
rect.size.width = sbvsc.width.measure;
}
Expand Down Expand Up @@ -1553,9 +1585,38 @@ extension TGFlowLayout
let horzGravity:TGGravity = self.tgConvertLeftRightGravityToLeadingTrailing(lsc.tg_gravity & TGGravity.vert.mask)
let horzAlignment:TGGravity = self.tgConvertLeftRightGravityToLeadingTrailing(lsc.tg_arrangedGravity & TGGravity.vert.mask)

let vertSpace = lsc.tg_vspace
let horzSpace = lsc.tg_hspace

var vertSpace = lsc.tg_vspace
var subviewSize = lsc.subviewSize;
if (subviewSize != 0)
{

let minSpace = lsc.minSpace
let maxSpace = lsc.maxSpace

if (arrangedCount > 1)
{
vertSpace = (selfSize.height - lsc.tgTopPadding - lsc.tgBottomPadding - subviewSize * CGFloat(arrangedCount))/CGFloat(arrangedCount - 1)

if _tgCGFloatGreat(vertSpace , maxSpace) || _tgCGFloatLess(vertSpace, minSpace)
{
if _tgCGFloatGreat(vertSpace , maxSpace)
{
vertSpace = maxSpace
}

if _tgCGFloatLess(vertSpace , minSpace)
{
vertSpace = minSpace
}


subviewSize = (selfSize.height - lsc.tgTopPadding - lsc.tgBottomPadding - vertSpace * CGFloat(arrangedCount - 1)) / CGFloat(arrangedCount)

}

}
}

//判断父滚动视图是否分页滚动
var isPagingScroll = false
Expand Down Expand Up @@ -1659,6 +1720,12 @@ extension TGFlowLayout
}
else
{

if subviewSize != 0
{
rect.size.height = subviewSize
}

if (pagingItemHeight != 0)
{
rect.size.height = pagingItemHeight
Expand Down Expand Up @@ -2039,16 +2106,16 @@ extension TGFlowLayout

rect.size.width = sbvsc.width.numberSize(rect.size.width)

rect.size.height = sbvsc.height.numberSize(rect.size.height)


rect = tgSetSubviewRelativeSize(sbvsc.height, selfSize: selfSize, sbvsc:sbvsc, lsc:lsc, rect: rect)

if subviewSize != 0
{
rect.size.height = subviewSize
}

rect.size.height = sbvsc.height.numberSize(rect.size.height)


rect = tgSetSubviewRelativeSize(sbvsc.height, selfSize: selfSize, sbvsc:sbvsc, lsc:lsc, rect: rect)

rect = tgSetSubviewRelativeSize(sbvsc.width, selfSize: selfSize, sbvsc:sbvsc, lsc:lsc, rect: rect)

if sbvsc.height.weightVal != nil || sbvsc.height.isFill
Expand Down
1 change: 1 addition & 0 deletions TangramKit/TGFrameLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ open class TGFrameLayout: TGBaseLayout,TGFrameLayoutViewSizeClass {
}
}

tgAdjustSubviewsLayoutTransform(sbs: sbs, lsc: lsc, selfSize: selfSize)
tgAdjustSubviewsRTLPos(sbs: sbs, selfWidth: selfSize.width)

return self.tgAdjustSizeWhenNoSubviews(size: selfSize, sbs: sbs, lsc:lsc)
Expand Down
4 changes: 4 additions & 0 deletions TangramKit/TGLayoutSizeClass.swift
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ public protocol TGLayoutViewSizeClass:TGViewSizeClass
var tg_reverseLayout: Bool{get set}

var tg_gravity:TGGravity{get set}

var tg_layoutTransform:CGAffineTransform{get set}

}

Expand Down Expand Up @@ -611,6 +613,7 @@ internal class TGLayoutViewSizeClassImpl:TGViewSizeClassImpl,TGLayoutViewSizeCla
var tg_reverseLayout: Bool = false
var tg_gravity: TGGravity = TGGravity.none

var tg_layoutTransform: CGAffineTransform = CGAffineTransform.identity

internal var tgTopPadding:CGFloat
{
Expand Down Expand Up @@ -827,6 +830,7 @@ internal class TGLayoutViewSizeClassImpl:TGViewSizeClassImpl,TGLayoutViewSizeCla
tsc.tg_hspace = self.tg_hspace
tsc.tg_reverseLayout = self.tg_reverseLayout
tsc.tg_gravity = self.tg_gravity
tsc.tg_layoutTransform = self.tg_layoutTransform

return tsc
}
Expand Down
2 changes: 1 addition & 1 deletion TangramKit/TGLinearLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ open class TGLinearLayout: TGBaseLayout,TGLinearLayoutViewSizeClass {


tgAdjustLayoutSelfSize(selfSize: &selfSize, lsc: lsc)

tgAdjustSubviewsLayoutTransform(sbs: sbs, lsc: lsc, selfSize: selfSize)
tgAdjustSubviewsRTLPos(sbs: sbs, selfWidth: selfSize.width)

return self.tgAdjustSizeWhenNoSubviews(size: selfSize, sbs: sbs, lsc:lsc)
Expand Down
1 change: 1 addition & 0 deletions TangramKit/TGPathLayout.swift
Original file line number Diff line number Diff line change
Expand Up @@ -642,6 +642,7 @@ open class TGPathLayout : TGBaseLayout,TGPathLayoutViewSizeClass {

tgAdjustLayoutSelfSize(selfSize: &selfSize, lsc: lsc)

tgAdjustSubviewsLayoutTransform(sbs: sbs, lsc: lsc, selfSize: selfSize)

return self.tgAdjustSizeWhenNoSubviews(size: selfSize, sbs: sbs2, lsc:lsc)
}
Expand Down
Loading

0 comments on commit ed46490

Please sign in to comment.