Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
ios1x
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
cemarose
ios1x
Commits
18b81387
Commit
18b81387
authored
Dec 05, 2017
by
houweibin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1,软键盘挡住优惠码输入框问题
2,去掉多余的线 3,其他调整
parent
70bc6c29
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
876 additions
and
57 deletions
+876
-57
project.pbxproj
iCemarose.xcodeproj/project.pbxproj
+32
-0
KWMAPIManager.m
iCemarose/Class/Api/KWMAPIManager.m
+3
-3
KWMOrderVC.m
iCemarose/Class/UI/Mine/KWMOrderVC.m
+2
-2
KWMBeforePayVC.h
iCemarose/Class/UI/ShopCart/KWMBeforePayVC.h
+1
-5
KWMBeforePayVC.m
iCemarose/Class/UI/ShopCart/KWMBeforePayVC.m
+0
-18
ShopCart.storyboard
iCemarose/Class/UI/ShopCart/ShopCart.storyboard
+3
-29
TPKeyboardAvoidingCollectionView.h
...iew/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.h
+15
-0
TPKeyboardAvoidingCollectionView.m
...iew/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m
+113
-0
TPKeyboardAvoidingScrollView.h
...ss/View/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.h
+16
-0
TPKeyboardAvoidingScrollView.m
...ss/View/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m
+92
-0
TPKeyboardAvoidingTableView.h
...ass/View/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.h
+15
-0
TPKeyboardAvoidingTableView.m
...ass/View/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m
+117
-0
UIScrollView+TPKeyboardAvoidingAdditions.h
...yboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h
+22
-0
UIScrollView+TPKeyboardAvoidingAdditions.m
...yboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m
+443
-0
Header-Prefix.h
iCemarose/Header-Prefix.h
+2
-0
No files found.
iCemarose.xcodeproj/project.pbxproj
View file @
18b81387
...
...
@@ -101,6 +101,10 @@
C02986901F0F2663002EB25F
/* KWMWishCell.xib in Resources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C029868E1F0F2663002EB25F
/* KWMWishCell.xib */
;
};
C02C5A931FD54C7D00E32290
/* KWMRecommendView.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A901FD54C7C00E32290
/* KWMRecommendView.m */
;
};
C02C5A941FD54C7D00E32290
/* KWMRecommendView.xib in Resources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A911FD54C7C00E32290
/* KWMRecommendView.xib */
;
};
C02C5A9E1FD6944500E32290
/* TPKeyboardAvoidingCollectionView.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A971FD6944500E32290
/* TPKeyboardAvoidingCollectionView.m */
;
};
C02C5A9F1FD6944500E32290
/* TPKeyboardAvoidingScrollView.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A991FD6944500E32290
/* TPKeyboardAvoidingScrollView.m */
;
};
C02C5AA01FD6944500E32290
/* TPKeyboardAvoidingTableView.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A9B1FD6944500E32290
/* TPKeyboardAvoidingTableView.m */
;
};
C02C5AA11FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C5A9D1FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.m */
;
};
C02C7D801E640D82008DC29C
/* libWeChatSDK.a in Frameworks */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C7D7B1E640D82008DC29C
/* libWeChatSDK.a */
;
};
C02C7D811E640D82008DC29C
/* README.txt in Resources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C7D7C1E640D82008DC29C
/* README.txt */
;
};
C02C7D831E640FBF008DC29C
/* SystemConfiguration.framework in Frameworks */
=
{
isa
=
PBXBuildFile
;
fileRef
=
C02C7D821E640FBF008DC29C
/* SystemConfiguration.framework */
;
};
...
...
@@ -547,6 +551,14 @@
C02C5A901FD54C7C00E32290
/* KWMRecommendView.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
KWMRecommendView.m
;
sourceTree
=
"<group>"
;
};
C02C5A911FD54C7C00E32290
/* KWMRecommendView.xib */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
file.xib
;
path
=
KWMRecommendView.xib
;
sourceTree
=
"<group>"
;
};
C02C5A921FD54C7D00E32290
/* KWMRecommendView.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
KWMRecommendView.h
;
sourceTree
=
"<group>"
;
};
C02C5A961FD6944500E32290
/* TPKeyboardAvoidingCollectionView.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
TPKeyboardAvoidingCollectionView.h
;
sourceTree
=
"<group>"
;
};
C02C5A971FD6944500E32290
/* TPKeyboardAvoidingCollectionView.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
TPKeyboardAvoidingCollectionView.m
;
sourceTree
=
"<group>"
;
};
C02C5A981FD6944500E32290
/* TPKeyboardAvoidingScrollView.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
TPKeyboardAvoidingScrollView.h
;
sourceTree
=
"<group>"
;
};
C02C5A991FD6944500E32290
/* TPKeyboardAvoidingScrollView.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
TPKeyboardAvoidingScrollView.m
;
sourceTree
=
"<group>"
;
};
C02C5A9A1FD6944500E32290
/* TPKeyboardAvoidingTableView.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
TPKeyboardAvoidingTableView.h
;
sourceTree
=
"<group>"
;
};
C02C5A9B1FD6944500E32290
/* TPKeyboardAvoidingTableView.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
TPKeyboardAvoidingTableView.m
;
sourceTree
=
"<group>"
;
};
C02C5A9C1FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
"UIScrollView+TPKeyboardAvoidingAdditions.h"
;
sourceTree
=
"<group>"
;
};
C02C5A9D1FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
"UIScrollView+TPKeyboardAvoidingAdditions.m"
;
sourceTree
=
"<group>"
;
};
C02C7D7B1E640D82008DC29C
/* libWeChatSDK.a */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
archive.ar
;
path
=
libWeChatSDK.a
;
sourceTree
=
"<group>"
;
};
C02C7D7C1E640D82008DC29C
/* README.txt */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
text
;
path
=
README.txt
;
sourceTree
=
"<group>"
;
};
C02C7D7D1E640D82008DC29C
/* WechatAuthSDK.h */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
WechatAuthSDK.h
;
sourceTree
=
"<group>"
;
};
...
...
@@ -1241,6 +1253,21 @@
path
=
Cell
;
sourceTree
=
"<group>"
;
};
C02C5A951FD6944500E32290
/* TPKeyboardAvoiding */
=
{
isa
=
PBXGroup
;
children
=
(
C02C5A961FD6944500E32290
/* TPKeyboardAvoidingCollectionView.h */
,
C02C5A971FD6944500E32290
/* TPKeyboardAvoidingCollectionView.m */
,
C02C5A981FD6944500E32290
/* TPKeyboardAvoidingScrollView.h */
,
C02C5A991FD6944500E32290
/* TPKeyboardAvoidingScrollView.m */
,
C02C5A9A1FD6944500E32290
/* TPKeyboardAvoidingTableView.h */
,
C02C5A9B1FD6944500E32290
/* TPKeyboardAvoidingTableView.m */
,
C02C5A9C1FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.h */
,
C02C5A9D1FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.m */
,
);
path
=
TPKeyboardAvoiding
;
sourceTree
=
"<group>"
;
};
C02C7D7A1E640D82008DC29C
/* WeChat */
=
{
isa
=
PBXGroup
;
children
=
(
...
...
@@ -1509,6 +1536,7 @@
C034E6C51D6AECF9006EE129
/* View */
=
{
isa
=
PBXGroup
;
children
=
(
C02C5A951FD6944500E32290
/* TPKeyboardAvoiding */
,
C0CCB3B51EEA520C00BC2FB8
/* FilterView */
,
C0DD53251EE55190002D1E0C
/* Cell */
,
C0DD53261EE55190002D1E0C
/* Loading */
,
...
...
@@ -2684,6 +2712,7 @@
C034E8621D6B10A0006EE129
/* PBPGView.m in Sources */
,
C0243BC01EFBD5A10013CFA7
/* KWMRightProductCell.m in Sources */
,
C02C7DB41E67B56D008DC29C
/* KWMFilterHeaderView.m in Sources */
,
C02C5A9E1FD6944500E32290
/* TPKeyboardAvoidingCollectionView.m in Sources */
,
80ED0A371D93840A00B28DF2
/* DB_shopCart.xcdatamodeld in Sources */
,
C0DD53391EE55190002D1E0C
/* KWMSplashView.m in Sources */
,
80E844271D7FB0FF0042AED2
/* KWMRuleView.m in Sources */
,
...
...
@@ -2704,6 +2733,7 @@
807AF4A51DC984950000A326
/* KWMCustomerResult.m in Sources */
,
DA8B97801F58F816002FC38A
/* SDImageCache+Resize.m in Sources */
,
C066650F1D7675FC00F02EF4
/* KWMAboutUsVC.m in Sources */
,
C02C5AA11FD6944500E32290
/* UIScrollView+TPKeyboardAvoidingAdditions.m in Sources */
,
807AF4A31DC984950000A326
/* KWMBlogResult.m in Sources */
,
C0CC14081D7823B0007B5986
/* KWMSizeCell.m in Sources */
,
C057C77D1F172D4C00B95034
/* KWMMidDetailView.m in Sources */
,
...
...
@@ -2724,6 +2754,7 @@
C091EE331DDB1FC500A382B9
/* KWMAppVersion.m in Sources */
,
C0CC14041D7823B0007B5986
/* KWMDeleteView.m in Sources */
,
C0028ECB1F0E2B3500744C14
/* KWMAdditionalListResult.m in Sources */
,
C02C5A9F1FD6944500E32290
/* TPKeyboardAvoidingScrollView.m in Sources */
,
8091DFA11D6E878C0020519C
/* KWMGuideVC.m in Sources */
,
C034E84A1D6B10A0006EE129
/* UIImage+Color.m in Sources */
,
801230F21DD30704008C7904
/* KWMSearchBrandsCell.m in Sources */
,
...
...
@@ -2777,6 +2808,7 @@
DA4E36951F1726B80007E4D0
/* UIViewController+HTTP.m in Sources */
,
807AF4A71DC984950000A326
/* KWMProducts.m in Sources */
,
C0F5868A1E24F820001248E2
/* KWMSelectedGoodsVC.m in Sources */
,
C02C5AA01FD6944500E32290
/* TPKeyboardAvoidingTableView.m in Sources */
,
C034E8661D6B10A0006EE129
/* PhotoItemView.m in Sources */
,
9B166F511ED6DBCF003E9F03
/* KWMHttpUtil.m in Sources */
,
C034E6D91D6AEF1B006EE129
/* KWMStringUtil.m in Sources */
,
...
...
iCemarose/Class/Api/KWMAPIManager.m
View file @
18b81387
...
...
@@ -277,7 +277,7 @@ static NSString *const passwordTest = @"9e84aae218c57cdf0762763c4cf5a651";
}
}
if
(
isUseClientAuth
){
[
sessionManager
.
requestSerializer
setValue
:
@"Basic YzJmNmZhZTk3NzQxZWE2ZGI0Y2FkN2FlOGY3MGZlZjM=="
forHTTPHeaderField
:
@"Authorization"
];
[
sessionManager
.
requestSerializer
setValue
:
Order_API_Auth
forHTTPHeaderField
:
@"Authorization"
];
}
return
sessionManager
;
}
...
...
@@ -1149,7 +1149,7 @@ static NSString *const passwordTest = @"9e84aae218c57cdf0762763c4cf5a651";
}
/**
*
清空愿望
单 API
*
获取所以订
单 API
* @param customer_id 用户ID
* @param customer_email 用户邮箱
* @param shop 店铺名(cemarose-test.myshopify.com)
...
...
@@ -1158,7 +1158,7 @@ static NSString *const passwordTest = @"9e84aae218c57cdf0762763c4cf5a651";
success
:
(
void
(
^
)(
NSURLSessionDataTask
*
task
,
KWMOrderListResult
*
result
))
success
failure
:
(
void
(
^
)(
NSURLSessionDataTask
*
task
,
NSError
*
error
))
failure
{
NSString
*
apiPath
=
[
NSString
stringWithFormat
:
@"https://%@/customer/orders/custom-orders"
,
WishList_API_DOMAIN
];
// apiPath = @"https://
peter.tofnews
.com/customer/orders/custom-orders";
// apiPath = @"https://
test.cemarose
.com/customer/orders/custom-orders";
return
[
self
startSessionTask
:
KWMHTTPMethodGET
apiPath
:
apiPath
parameters
:
parameters
...
...
iCemarose/Class/UI/Mine/KWMOrderVC.m
View file @
18b81387
...
...
@@ -225,8 +225,8 @@
};
[
self
.
api
getOrderList
:
parameters
success
:
^
(
NSURLSessionDataTask
*
task
,
KWMOrderListResult
*
result
)
{
[
weakSelf
hideLoading
];
if
(
!
result
.
code
||
result
.
code
.
integerValue
!=
1000
){
if
(
result
.
message
){
if
(
!
result
||
!
result
.
code
||
result
.
code
.
integerValue
!=
1000
){
if
(
result
&&
result
.
message
){
[
weakSelf
showToast
:
result
.
message
];
}
return
;
...
...
iCemarose/Class/UI/ShopCart/KWMBeforePayVC.h
View file @
18b81387
...
...
@@ -16,7 +16,7 @@
#import "KWMPayTypeVC.h"
#import "KWMBeforePayData.h"
@interface
KWMBeforePayVC
:
KWMBaseVC
<
KWMGiftCardDelegate
,
KWMSelectAddressDelegate
,
KWMSelectShippingRateDelegate
,
UITextFieldDelegate
>
@interface
KWMBeforePayVC
:
KWMBaseVC
<
KWMGiftCardDelegate
,
KWMSelectAddressDelegate
,
KWMSelectShippingRateDelegate
>
//沒有默認地址時,高度為37,有地址時,高度為90
@property
(
nonatomic
,
weak
)
IBOutlet
NSLayoutConstraint
*
vAddressHeight
;
...
...
@@ -50,10 +50,6 @@
@property
(
weak
,
nonatomic
)
IBOutlet
UIButton
*
btnDiscountEdit
;
@property
(
weak
,
nonatomic
)
IBOutlet
UITextField
*
tfDiscount
;
@property
(
weak
,
nonatomic
)
IBOutlet
UIButton
*
btnBg
;
@property
(
weak
,
nonatomic
)
IBOutlet
NSLayoutConstraint
*
marginTopContent
;
//价格
@property
(
weak
,
nonatomic
)
IBOutlet
UILabel
*
lbTotalPrice
;
...
...
iCemarose/Class/UI/ShopCart/KWMBeforePayVC.m
View file @
18b81387
...
...
@@ -482,24 +482,6 @@
[
self
startCheckout
];
}
#pragma mark - UITextFieldDelegate
-
(
BOOL
)
textFieldShouldBeginEditing
:
(
UITextField
*
)
textField
{
self
.
marginTopContent
.
constant
=
22
-
200
;
[
UIView
animateWithDuration
:
0
.
5
animations
:
^
{
[
self
.
view
layoutIfNeeded
];
}];
return
YES
;
}
//键盘弹出
-
(
void
)
keyboardWillHide
:
(
NSNotification
*
)
notification
{
self
.
marginTopContent
.
constant
=
22
;
[
UIView
animateWithDuration
:
0
.
5
animations
:
^
{
[
self
.
view
layoutIfNeeded
];
}];
}
-
(
void
)
startCheckout
{
if
(
self
.
checkout
==
nil
){
[
self
showToast
:
@"未成功初始化订单"
];
...
...
iCemarose/Class/UI/ShopCart/ShopCart.storyboard
View file @
18b81387
...
...
@@ -645,11 +645,11 @@
<rect
key=
"frame"
x=
"0.0"
y=
"0.0"
width=
"375"
height=
"667"
/>
<autoresizingMask
key=
"autoresizingMask"
widthSizable=
"YES"
heightSizable=
"YES"
/>
<subviews>
<scrollView
clipsSubviews=
"YES"
multipleTouchEnabled=
"YES"
contentMode=
"scaleToFill"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"lUQ-J5-kOq"
>
<scrollView
clipsSubviews=
"YES"
multipleTouchEnabled=
"YES"
contentMode=
"scaleToFill"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"lUQ-J5-kOq"
customClass=
"TPKeyboardAvoidingScrollView"
>
<rect
key=
"frame"
x=
"0.0"
y=
"0.0"
width=
"375"
height=
"549"
/>
<subviews>
<view
contentMode=
"scaleToFill"
misplaced=
"YES"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"BlA-Cz-DcE"
>
<rect
key=
"frame"
x=
"0.0"
y=
"
-222
"
width=
"374"
height=
"562"
/>
<view
contentMode=
"scaleToFill"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"BlA-Cz-DcE"
>
<rect
key=
"frame"
x=
"0.0"
y=
"
0.0
"
width=
"374"
height=
"562"
/>
<subviews>
<label
opaque=
"NO"
userInteractionEnabled=
"NO"
contentMode=
"left"
horizontalHuggingPriority=
"251"
verticalHuggingPriority=
"251"
text=
"寄送地址"
textAlignment=
"natural"
lineBreakMode=
"tailTruncation"
baselineAdjustment=
"alignBaselines"
adjustsFontSizeToFit=
"NO"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"MY5-C7-Kcb"
>
<rect
key=
"frame"
x=
"30"
y=
"22"
width=
"60"
height=
"21"
/>
...
...
@@ -763,13 +763,6 @@
<color
key=
"textColor"
red=
"0.30588235289999999"
green=
"0.30588235289999999"
blue=
"0.30588235289999999"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<nil
key=
"highlightedColor"
/>
</label>
<view
contentMode=
"scaleToFill"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"Jh2-0e-Ceb"
userLabel=
"line"
>
<rect
key=
"frame"
x=
"0.0"
y=
"39"
width=
"374"
height=
"1"
/>
<color
key=
"backgroundColor"
red=
"0.84705882349999995"
green=
"0.85882352939999995"
blue=
"0.87058823529999996"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<constraints>
<constraint
firstAttribute=
"height"
constant=
"1"
id=
"HTJ-Ty-IZI"
/>
</constraints>
</view>
<imageView
userInteractionEnabled=
"NO"
contentMode=
"scaleToFill"
horizontalHuggingPriority=
"251"
verticalHuggingPriority=
"251"
image=
"ic_choose_sel"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"qA8-Up-cG8"
>
<rect
key=
"frame"
x=
"329"
y=
"12.5"
width=
"15"
height=
"15"
/>
<constraints>
...
...
@@ -781,11 +774,8 @@
<color
key=
"backgroundColor"
red=
"0.95686274510000002"
green=
"0.96078431369999995"
blue=
"0.96862745100000003"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<constraints>
<constraint
firstAttribute=
"height"
constant=
"40"
id=
"32w-IK-79o"
/>
<constraint
firstItem=
"Jh2-0e-Ceb"
firstAttribute=
"leading"
secondItem=
"0t9-CT-iWp"
secondAttribute=
"leading"
id=
"QDx-29-HUV"
/>
<constraint
firstAttribute=
"bottom"
secondItem=
"ZTw-Ec-fab"
secondAttribute=
"bottom"
id=
"V7G-gU-cS8"
/>
<constraint
firstAttribute=
"bottom"
secondItem=
"Jh2-0e-Ceb"
secondAttribute=
"bottom"
id=
"Wdy-jS-ub1"
/>
<constraint
firstItem=
"ZTw-Ec-fab"
firstAttribute=
"top"
secondItem=
"0t9-CT-iWp"
secondAttribute=
"top"
id=
"gyr-wF-w2J"
/>
<constraint
firstAttribute=
"trailing"
secondItem=
"Jh2-0e-Ceb"
secondAttribute=
"trailing"
id=
"hUA-Rx-NPH"
/>
<constraint
firstItem=
"qA8-Up-cG8"
firstAttribute=
"centerY"
secondItem=
"0t9-CT-iWp"
secondAttribute=
"centerY"
id=
"j47-nG-wrd"
/>
<constraint
firstAttribute=
"trailing"
secondItem=
"qA8-Up-cG8"
secondAttribute=
"trailing"
constant=
"30"
id=
"kYM-dI-919"
/>
<constraint
firstItem=
"ZTw-Ec-fab"
firstAttribute=
"leading"
secondItem=
"0t9-CT-iWp"
secondAttribute=
"leading"
constant=
"30"
id=
"sXw-lU-ohe"
/>
...
...
@@ -810,13 +800,6 @@
<color
key=
"textColor"
red=
"0.30588235289999999"
green=
"0.30588235289999999"
blue=
"0.30588235289999999"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<nil
key=
"highlightedColor"
/>
</label>
<view
contentMode=
"scaleToFill"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"B9t-Fw-Xfq"
userLabel=
"line"
>
<rect
key=
"frame"
x=
"0.0"
y=
"39"
width=
"374"
height=
"1"
/>
<color
key=
"backgroundColor"
red=
"0.84705882349999995"
green=
"0.85882352939999995"
blue=
"0.87058823529999996"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<constraints>
<constraint
firstAttribute=
"height"
constant=
"1"
id=
"E5z-EV-AmJ"
/>
</constraints>
</view>
<imageView
userInteractionEnabled=
"NO"
contentMode=
"scaleToFill"
horizontalHuggingPriority=
"251"
verticalHuggingPriority=
"251"
image=
"ic_choose_nor"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"RK9-ZZ-KNx"
>
<rect
key=
"frame"
x=
"329"
y=
"12.5"
width=
"15"
height=
"15"
/>
<constraints>
...
...
@@ -828,22 +811,17 @@
<color
key=
"backgroundColor"
red=
"0.95686274510000002"
green=
"0.96078431369999995"
blue=
"0.96862745100000003"
alpha=
"1"
colorSpace=
"custom"
customColorSpace=
"sRGB"
/>
<constraints>
<constraint
firstItem=
"I1W-Yg-7VA"
firstAttribute=
"top"
secondItem=
"SQP-ML-8dW"
secondAttribute=
"top"
id=
"6Kz-Cu-2H6"
/>
<constraint
firstAttribute=
"bottom"
secondItem=
"B9t-Fw-Xfq"
secondAttribute=
"bottom"
id=
"8Pe-Nl-bDS"
/>
<constraint
firstItem=
"B9t-Fw-Xfq"
firstAttribute=
"leading"
secondItem=
"I1W-Yg-7VA"
secondAttribute=
"trailing"
id=
"FFb-eI-WhB"
/>
<constraint
firstItem=
"RK9-ZZ-KNx"
firstAttribute=
"centerY"
secondItem=
"SQP-ML-8dW"
secondAttribute=
"centerY"
id=
"Glr-Qk-jDv"
/>
<constraint
firstItem=
"I1W-Yg-7VA"
firstAttribute=
"leading"
secondItem=
"SQP-ML-8dW"
secondAttribute=
"leading"
constant=
"30"
id=
"JdO-uB-Pg6"
/>
<constraint
firstItem=
"B9t-Fw-Xfq"
firstAttribute=
"leading"
secondItem=
"SQP-ML-8dW"
secondAttribute=
"leading"
id=
"JoY-h9-aCp"
/>
<constraint
firstAttribute=
"bottom"
secondItem=
"I1W-Yg-7VA"
secondAttribute=
"bottom"
id=
"LwS-F0-IaT"
/>
<constraint
firstAttribute=
"height"
constant=
"40"
id=
"e48-qe-S93"
/>
<constraint
firstAttribute=
"trailing"
secondItem=
"RK9-ZZ-KNx"
secondAttribute=
"trailing"
constant=
"30"
id=
"oa7-YE-qYE"
/>
<constraint
firstItem=
"I1W-Yg-7VA"
firstAttribute=
"centerY"
secondItem=
"SQP-ML-8dW"
secondAttribute=
"centerY"
id=
"tOY-l3-6t4"
/>
<constraint
firstAttribute=
"trailing"
secondItem=
"B9t-Fw-Xfq"
secondAttribute=
"trailing"
id=
"xeI-uE-TZl"
/>
</constraints>
<variation
key=
"default"
>
<mask
key=
"constraints"
>
<exclude
reference=
"6Kz-Cu-2H6"
/>
<exclude
reference=
"LwS-F0-IaT"
/>
<exclude
reference=
"FFb-eI-WhB"
/>
</mask>
</variation>
<connections>
...
...
@@ -1017,9 +995,6 @@
<nil
key=
"textColor"
/>
<fontDescription
key=
"fontDescription"
name=
"PingFangSC-Regular"
family=
"PingFang SC"
pointSize=
"12"
/>
<textInputTraits
key=
"textInputTraits"
/>
<connections>
<outlet
property=
"delegate"
destination=
"96G-49-ueh"
id=
"YL6-b9-2HH"
/>
</connections>
</textField>
<button
hidden=
"YES"
opaque=
"NO"
contentMode=
"scaleToFill"
contentHorizontalAlignment=
"center"
contentVerticalAlignment=
"center"
buttonType=
"roundedRect"
lineBreakMode=
"middleTruncation"
translatesAutoresizingMaskIntoConstraints=
"NO"
id=
"Njp-Tr-7rt"
>
<rect
key=
"frame"
x=
"314"
y=
"-0.5"
width=
"40"
height=
"40"
/>
...
...
@@ -1199,7 +1174,6 @@
<outlet
property=
"lbPhone"
destination=
"XAZ-es-XbK"
id=
"3xN-ic-WmI"
/>
<outlet
property=
"lbShippingRate"
destination=
"pVN-aG-lfu"
id=
"YuB-rr-DOP"
/>
<outlet
property=
"lbTotalPrice"
destination=
"fdr-W0-QCc"
id=
"Cfi-P2-B3O"
/>
<outlet
property=
"marginTopContent"
destination=
"58G-Ar-blr"
id=
"0hg-Y4-Ske"
/>
<outlet
property=
"submit"
destination=
"vT5-Az-K57"
id=
"fwS-UU-AZ4"
/>
<outlet
property=
"tfDiscount"
destination=
"O0I-6i-BPd"
id=
"d3J-D9-wvt"
/>
<outlet
property=
"vAddressHeight"
destination=
"zO1-RN-x44"
id=
"VIC-wQ-AuJ"
/>
...
...
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.h
0 → 100644
View file @
18b81387
//
// TPKeyboardAvoidingCollectionView.h
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel & The CocoaBots. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UIScrollView+TPKeyboardAvoidingAdditions.h"
@interface
TPKeyboardAvoidingCollectionView
:
UICollectionView
<
UITextFieldDelegate
,
UITextViewDelegate
>
-
(
BOOL
)
focusNextTextField
;
-
(
void
)
scrollToActiveTextField
;
@end
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m
0 → 100644
View file @
18b81387
//
// TPKeyboardAvoidingCollectionView.m
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel & The CocoaBots. All rights reserved.
//
#import "TPKeyboardAvoidingCollectionView.h"
@interface
TPKeyboardAvoidingCollectionView
()
<
UITextFieldDelegate
,
UITextViewDelegate
>
@end
@implementation
TPKeyboardAvoidingCollectionView
#pragma mark - Setup/Teardown
-
(
void
)
setup
{
if
(
[
self
hasAutomaticKeyboardAvoidingBehaviour
]
)
return
;
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillShow
:
)
name
:
UIKeyboardWillChangeFrameNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillHide
:
)
name
:
UIKeyboardWillHideNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextViewTextDidBeginEditingNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextFieldTextDidBeginEditingNotification
object
:
nil
];
}
-
(
id
)
initWithFrame
:
(
CGRect
)
frame
{
if
(
!
(
self
=
[
super
initWithFrame
:
frame
])
)
return
nil
;
[
self
setup
];
return
self
;
}
-
(
id
)
initWithFrame
:
(
CGRect
)
frame
collectionViewLayout
:
(
UICollectionViewLayout
*
)
layout
{
if
(
!
(
self
=
[
super
initWithFrame
:
frame
collectionViewLayout
:
layout
])
)
return
nil
;
[
self
setup
];
return
self
;
}
-
(
void
)
awakeFromNib
{
[
super
awakeFromNib
];
[
self
setup
];
}
-
(
void
)
dealloc
{
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
];
#if !__has_feature(objc_arc)
[
super
dealloc
];
#endif
}
-
(
BOOL
)
hasAutomaticKeyboardAvoidingBehaviour
{
if
(
[[[
UIDevice
currentDevice
]
systemVersion
]
integerValue
]
>=
9
&&
[
self
.
delegate
isKindOfClass
:[
UICollectionViewController
class
]]
)
{
// Theory: It looks like iOS 9's collection views automatically avoid the keyboard. As usual
// Apple have totally failed to document this anywhere, so this is just a guess.
return
YES
;
}
return
NO
;
}
-
(
void
)
setFrame
:
(
CGRect
)
frame
{
[
super
setFrame
:
frame
];
[
self
TPKeyboardAvoiding_updateContentInset
];
}
-
(
void
)
setContentSize
:
(
CGSize
)
contentSize
{
if
(
CGSizeEqualToSize
(
contentSize
,
self
.
contentSize
))
{
// Prevent triggering contentSize when it's already the same that
// cause weird infinte scrolling and locking bug
return
;
}
[
super
setContentSize
:
contentSize
];
[
self
TPKeyboardAvoiding_updateContentInset
];
}
-
(
BOOL
)
focusNextTextField
{
return
[
self
TPKeyboardAvoiding_focusNextTextField
];
}
-
(
void
)
scrollToActiveTextField
{
return
[
self
TPKeyboardAvoiding_scrollToActiveTextField
];
}
#pragma mark - Responders, events
-
(
void
)
willMoveToSuperview
:
(
UIView
*
)
newSuperview
{
[
super
willMoveToSuperview
:
newSuperview
];
if
(
!
newSuperview
)
{
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
}
}
-
(
void
)
touchesEnded
:
(
NSSet
*
)
touches
withEvent
:
(
UIEvent
*
)
event
{
[[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
]
resignFirstResponder
];
[
super
touchesEnded
:
touches
withEvent
:
event
];
}
-
(
BOOL
)
textFieldShouldReturn
:
(
UITextField
*
)
textField
{
if
(
!
[
self
focusNextTextField
]
)
{
[
textField
resignFirstResponder
];
}
return
YES
;
}
-
(
void
)
layoutSubviews
{
[
super
layoutSubviews
];
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
[
self
performSelector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:)
withObject
:
self
afterDelay
:
0
.
1
];
}
@end
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.h
0 → 100755
View file @
18b81387
//
// TPKeyboardAvoidingScrollView.h
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UIScrollView+TPKeyboardAvoidingAdditions.h"
@interface
TPKeyboardAvoidingScrollView
:
UIScrollView
<
UITextFieldDelegate
,
UITextViewDelegate
>
-
(
void
)
contentSizeToFit
;
-
(
BOOL
)
focusNextTextField
;
-
(
void
)
scrollToActiveTextField
;
@end
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m
0 → 100644
View file @
18b81387
//
// TPKeyboardAvoidingScrollView.m
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import "TPKeyboardAvoidingScrollView.h"
@interface
TPKeyboardAvoidingScrollView
()
<
UITextFieldDelegate
,
UITextViewDelegate
>
@end
@implementation
TPKeyboardAvoidingScrollView
#pragma mark - Setup/Teardown
-
(
void
)
setup
{
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillShow
:
)
name
:
UIKeyboardWillChangeFrameNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillHide
:
)
name
:
UIKeyboardWillHideNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextViewTextDidBeginEditingNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextFieldTextDidBeginEditingNotification
object
:
nil
];
}
-
(
id
)
initWithFrame
:
(
CGRect
)
frame
{
if
(
!
(
self
=
[
super
initWithFrame
:
frame
])
)
return
nil
;
[
self
setup
];
return
self
;
}
-
(
void
)
awakeFromNib
{
[
super
awakeFromNib
];
[
self
setup
];
}
-
(
void
)
dealloc
{
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
];
#if !__has_feature(objc_arc)
[
super
dealloc
];
#endif
}
-
(
void
)
setFrame
:
(
CGRect
)
frame
{
[
super
setFrame
:
frame
];
[
self
TPKeyboardAvoiding_updateContentInset
];
}
-
(
void
)
setContentSize
:
(
CGSize
)
contentSize
{
[
super
setContentSize
:
contentSize
];
[
self
TPKeyboardAvoiding_updateFromContentSizeChange
];
}
-
(
void
)
contentSizeToFit
{
self
.
contentSize
=
[
self
TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames
];
}
-
(
BOOL
)
focusNextTextField
{
return
[
self
TPKeyboardAvoiding_focusNextTextField
];
}
-
(
void
)
scrollToActiveTextField
{
return
[
self
TPKeyboardAvoiding_scrollToActiveTextField
];
}
#pragma mark - Responders, events
-
(
void
)
willMoveToSuperview
:
(
UIView
*
)
newSuperview
{
[
super
willMoveToSuperview
:
newSuperview
];
if
(
!
newSuperview
)
{
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
}
}
-
(
void
)
touchesEnded
:
(
NSSet
*
)
touches
withEvent
:
(
UIEvent
*
)
event
{
[[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
]
resignFirstResponder
];
[
super
touchesEnded
:
touches
withEvent
:
event
];
}
-
(
BOOL
)
textFieldShouldReturn
:
(
UITextField
*
)
textField
{
if
(
!
[
self
focusNextTextField
]
)
{
[
textField
resignFirstResponder
];
}
return
YES
;
}
-
(
void
)
layoutSubviews
{
[
super
layoutSubviews
];
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
[
self
performSelector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:)
withObject
:
self
afterDelay
:
0
.
1
];
}
@end
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.h
0 → 100644
View file @
18b81387
//
// TPKeyboardAvoidingTableView.h
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "UIScrollView+TPKeyboardAvoidingAdditions.h"
@interface
TPKeyboardAvoidingTableView
:
UITableView
<
UITextFieldDelegate
,
UITextViewDelegate
>
-
(
BOOL
)
focusNextTextField
;
-
(
void
)
scrollToActiveTextField
;
@end
iCemarose/Class/View/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m
0 → 100644
View file @
18b81387
//
// TPKeyboardAvoidingTableView.m
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import "TPKeyboardAvoidingTableView.h"
@interface
TPKeyboardAvoidingTableView
()
<
UITextFieldDelegate
,
UITextViewDelegate
>
@end
@implementation
TPKeyboardAvoidingTableView
#pragma mark - Setup/Teardown
-
(
void
)
setup
{
if
(
[
self
hasAutomaticKeyboardAvoidingBehaviour
]
)
return
;
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillShow
:
)
name
:
UIKeyboardWillChangeFrameNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
TPKeyboardAvoiding_keyboardWillHide
:
)
name
:
UIKeyboardWillHideNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextViewTextDidBeginEditingNotification
object
:
nil
];
[[
NSNotificationCenter
defaultCenter
]
addObserver
:
self
selector
:
@selector
(
scrollToActiveTextField
)
name
:
UITextFieldTextDidBeginEditingNotification
object
:
nil
];
}
-
(
id
)
initWithFrame
:
(
CGRect
)
frame
{
if
(
!
(
self
=
[
super
initWithFrame
:
frame
])
)
return
nil
;
[
self
setup
];
return
self
;
}
-
(
id
)
initWithFrame
:
(
CGRect
)
frame
style
:
(
UITableViewStyle
)
withStyle
{
if
(
!
(
self
=
[
super
initWithFrame
:
frame
style
:
withStyle
])
)
return
nil
;
[
self
setup
];
return
self
;
}
-
(
void
)
awakeFromNib
{
[
super
awakeFromNib
];
[
self
setup
];
}
-
(
void
)
dealloc
{
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
self
];
#if !__has_feature(objc_arc)
[
super
dealloc
];
#endif
}
-
(
BOOL
)
hasAutomaticKeyboardAvoidingBehaviour
{
if
(
[
self
.
delegate
isKindOfClass
:[
UITableViewController
class
]]
)
{
// Theory: Apps built using the iOS 8.3 SDK (probably: older SDKs not tested) seem to handle keyboard
// avoiding automatically with UITableViewController. This doesn't seem to be documented anywhere
// by Apple, so results obtained only empirically.
return
YES
;
}
return
NO
;
}
-
(
void
)
setFrame
:
(
CGRect
)
frame
{
[
super
setFrame
:
frame
];
if
(
[
self
hasAutomaticKeyboardAvoidingBehaviour
]
)
return
;
[
self
TPKeyboardAvoiding_updateContentInset
];
}
-
(
void
)
setContentSize
:
(
CGSize
)
contentSize
{
if
(
[
self
hasAutomaticKeyboardAvoidingBehaviour
]
)
{
[
super
setContentSize
:
contentSize
];
return
;
}
if
(
CGSizeEqualToSize
(
contentSize
,
self
.
contentSize
))
{
// Prevent triggering contentSize when it's already the same
// this cause table view to scroll to top on contentInset changes
return
;
}
[
super
setContentSize
:
contentSize
];
[
self
TPKeyboardAvoiding_updateContentInset
];
}
-
(
BOOL
)
focusNextTextField
{
return
[
self
TPKeyboardAvoiding_focusNextTextField
];
}
-
(
void
)
scrollToActiveTextField
{
return
[
self
TPKeyboardAvoiding_scrollToActiveTextField
];
}
#pragma mark - Responders, events
-
(
void
)
willMoveToSuperview
:
(
UIView
*
)
newSuperview
{
[
super
willMoveToSuperview
:
newSuperview
];
if
(
!
newSuperview
)
{
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
}
}
-
(
void
)
touchesEnded
:
(
NSSet
*
)
touches
withEvent
:
(
UIEvent
*
)
event
{
[[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
]
resignFirstResponder
];
[
super
touchesEnded
:
touches
withEvent
:
event
];
}
-
(
BOOL
)
textFieldShouldReturn
:
(
UITextField
*
)
textField
{
if
(
!
[
self
focusNextTextField
]
)
{
[
textField
resignFirstResponder
];
}
return
YES
;
}
-
(
void
)
layoutSubviews
{
[
super
layoutSubviews
];
[
NSObject
cancelPreviousPerformRequestsWithTarget
:
self
selector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
)
object
:
self
];
[
self
performSelector
:
@selector
(
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:)
withObject
:
self
afterDelay
:
0
.
1
];
}
@end
iCemarose/Class/View/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h
0 → 100644
View file @
18b81387
//
// UIScrollView+TPKeyboardAvoidingAdditions.h
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface
UIScrollView
(
TPKeyboardAvoidingAdditions
)
-
(
BOOL
)
TPKeyboardAvoiding_focusNextTextField
;
-
(
void
)
TPKeyboardAvoiding_scrollToActiveTextField
;
-
(
void
)
TPKeyboardAvoiding_keyboardWillShow
:(
NSNotification
*
)
notification
;
-
(
void
)
TPKeyboardAvoiding_keyboardWillHide
:(
NSNotification
*
)
notification
;
-
(
void
)
TPKeyboardAvoiding_updateContentInset
;
-
(
void
)
TPKeyboardAvoiding_updateFromContentSizeChange
;
-
(
void
)
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:(
UIView
*
)
view
;
-
(
UIView
*
)
TPKeyboardAvoiding_findFirstResponderBeneathView
:(
UIView
*
)
view
;
-
(
CGSize
)
TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames
;
@end
iCemarose/Class/View/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m
0 → 100644
View file @
18b81387
//
// UIScrollView+TPKeyboardAvoidingAdditions.m
// TPKeyboardAvoiding
//
// Created by Michael Tyson on 30/09/2013.
// Copyright 2015 A Tasty Pixel. All rights reserved.
//
#import "UIScrollView+TPKeyboardAvoidingAdditions.h"
#import "TPKeyboardAvoidingScrollView.h"
#import <objc/runtime.h>
static
const
CGFloat
kCalculatedContentPadding
=
10
;
static
const
CGFloat
kMinimumScrollOffsetPadding
=
20
;
static
NSString
*
const
kUIKeyboardAnimationDurationUserInfoKey
=
@"UIKeyboardAnimationDurationUserInfoKey"
;
static
const
int
kStateKey
;
#define _UIKeyboardFrameEndUserInfoKey (&UIKeyboardFrameEndUserInfoKey != NULL ? UIKeyboardFrameEndUserInfoKey : @"UIKeyboardBoundsUserInfoKey")
@interface
TPKeyboardAvoidingState
:
NSObject
@property
(
nonatomic
,
assign
)
UIEdgeInsets
priorInset
;
@property
(
nonatomic
,
assign
)
UIEdgeInsets
priorScrollIndicatorInsets
;
@property
(
nonatomic
,
assign
)
BOOL
keyboardVisible
;
@property
(
nonatomic
,
assign
)
CGRect
keyboardRect
;
@property
(
nonatomic
,
assign
)
CGSize
priorContentSize
;
@property
(
nonatomic
,
assign
)
BOOL
priorPagingEnabled
;
@property
(
nonatomic
,
assign
)
BOOL
ignoringNotifications
;
@property
(
nonatomic
,
assign
)
BOOL
keyboardAnimationInProgress
;
@property
(
nonatomic
,
assign
)
CGFloat
animationDuration
;
@end
@implementation
UIScrollView
(
TPKeyboardAvoidingAdditions
)
-
(
TPKeyboardAvoidingState
*
)
keyboardAvoidingState
{
TPKeyboardAvoidingState
*
state
=
objc_getAssociatedObject
(
self
,
&
kStateKey
);
if
(
!
state
)
{
state
=
[[
TPKeyboardAvoidingState
alloc
]
init
];
objc_setAssociatedObject
(
self
,
&
kStateKey
,
state
,
OBJC_ASSOCIATION_RETAIN_NONATOMIC
);
#if !__has_feature(objc_arc)
[
state
release
];
#endif
}
return
state
;
}
-
(
void
)
TPKeyboardAvoiding_keyboardWillShow
:
(
NSNotification
*
)
notification
{
NSDictionary
*
info
=
[
notification
userInfo
];
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
state
.
animationDuration
=
[[
info
objectForKey
:
kUIKeyboardAnimationDurationUserInfoKey
]
doubleValue
];
CGRect
keyboardRect
=
[
self
convertRect
:[[
info
objectForKey
:
_UIKeyboardFrameEndUserInfoKey
]
CGRectValue
]
fromView
:
nil
];
if
(
CGRectIsEmpty
(
keyboardRect
))
{
return
;
}
if
(
state
.
ignoringNotifications
)
{
return
;
}
state
.
keyboardRect
=
keyboardRect
;
if
(
!
state
.
keyboardVisible
)
{
state
.
priorInset
=
self
.
contentInset
;
state
.
priorScrollIndicatorInsets
=
self
.
scrollIndicatorInsets
;
state
.
priorPagingEnabled
=
self
.
pagingEnabled
;
}
state
.
keyboardVisible
=
YES
;
self
.
pagingEnabled
=
NO
;
if
(
[
self
isKindOfClass
:[
TPKeyboardAvoidingScrollView
class
]]
)
{
state
.
priorContentSize
=
self
.
contentSize
;
if
(
CGSizeEqualToSize
(
self
.
contentSize
,
CGSizeZero
)
)
{
// Set the content size, if it's not set. Do not set content size explicitly if auto-layout
// is being used to manage subviews
self
.
contentSize
=
[
self
TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames
];
}
}
// Delay until a future run loop such that the cursor position is available in a text view
// In other words, it's not available (specifically, the prior cursor position is returned) when the first keyboard position change notification fires
// NOTE: Unfortunately, using dispatch_async(main_queue) did not result in a sufficient-enough delay
// for the text view's current cursor position to be available
dispatch_time_t
delay
=
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
0
.
01
*
NSEC_PER_SEC
));
dispatch_after
(
delay
,
dispatch_get_main_queue
(),
^
{
// Shrink view's inset by the keyboard's height, and scroll to show the text field/view being edited
[
UIView
beginAnimations
:
nil
context
:
NULL
];
[
UIView
setAnimationDelegate
:
self
];
[
UIView
setAnimationWillStartSelector
:
@selector
(
keyboardViewAppear
:
context
:
)];
[
UIView
setAnimationDidStopSelector
:
@selector
(
keyboardViewDisappear
:
finished
:
context
:
)];
[
UIView
setAnimationCurve
:[[[
notification
userInfo
]
objectForKey
:
UIKeyboardAnimationCurveUserInfoKey
]
intValue
]];
[
UIView
setAnimationDuration
:[[[
notification
userInfo
]
objectForKey
:
UIKeyboardAnimationDurationUserInfoKey
]
floatValue
]];
UIView
*
firstResponder
=
[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
];
if
(
firstResponder
)
{
self
.
contentInset
=
[
self
TPKeyboardAvoiding_contentInsetForKeyboard
];
CGFloat
viewableHeight
=
self
.
bounds
.
size
.
height
-
self
.
contentInset
.
top
-
self
.
contentInset
.
bottom
;
[
self
setContentOffset
:
CGPointMake
(
self
.
contentOffset
.
x
,
[
self
TPKeyboardAvoiding_idealOffsetForView
:
firstResponder
withViewingAreaHeight
:
viewableHeight
])
animated
:
NO
];
}
self
.
scrollIndicatorInsets
=
self
.
contentInset
;
[
self
layoutIfNeeded
];
[
UIView
commitAnimations
];
});
}
-
(
void
)
keyboardViewAppear
:
(
NSString
*
)
animationID
context
:
(
void
*
)
context
{
self
.
keyboardAvoidingState
.
keyboardAnimationInProgress
=
true
;
}
-
(
void
)
keyboardViewDisappear
:
(
NSString
*
)
animationID
finished
:
(
NSNumber
*
)
finished
context
:
(
void
*
)
context
{
if
(
finished
.
boolValue
)
{
self
.
keyboardAvoidingState
.
keyboardAnimationInProgress
=
false
;
}
}
-
(
void
)
TPKeyboardAvoiding_keyboardWillHide
:
(
NSNotification
*
)
notification
{
CGRect
keyboardRect
=
[
self
convertRect
:[[[
notification
userInfo
]
objectForKey
:
_UIKeyboardFrameEndUserInfoKey
]
CGRectValue
]
fromView
:
nil
];
if
(
CGRectIsEmpty
(
keyboardRect
)
&&
!
self
.
keyboardAvoidingState
.
keyboardAnimationInProgress
)
{
return
;
}
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
if
(
state
.
ignoringNotifications
)
{
return
;
}
if
(
!
state
.
keyboardVisible
)
{
return
;
}
state
.
keyboardRect
=
CGRectZero
;
state
.
keyboardVisible
=
NO
;
// Restore dimensions to prior size
[
UIView
beginAnimations
:
nil
context
:
NULL
];
[
UIView
setAnimationCurve
:[[[
notification
userInfo
]
objectForKey
:
UIKeyboardAnimationCurveUserInfoKey
]
intValue
]];
[
UIView
setAnimationDuration
:[[[
notification
userInfo
]
objectForKey
:
UIKeyboardAnimationDurationUserInfoKey
]
floatValue
]];
if
(
[
self
isKindOfClass
:[
TPKeyboardAvoidingScrollView
class
]]
)
{
self
.
contentSize
=
state
.
priorContentSize
;
}
self
.
contentInset
=
state
.
priorInset
;
self
.
scrollIndicatorInsets
=
state
.
priorScrollIndicatorInsets
;
self
.
pagingEnabled
=
state
.
priorPagingEnabled
;
[
self
layoutIfNeeded
];
[
UIView
commitAnimations
];
}
-
(
void
)
TPKeyboardAvoiding_updateContentInset
{
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
if
(
state
.
keyboardVisible
)
{
self
.
contentInset
=
[
self
TPKeyboardAvoiding_contentInsetForKeyboard
];
}
}
-
(
void
)
TPKeyboardAvoiding_updateFromContentSizeChange
{
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
if
(
state
.
keyboardVisible
)
{
state
.
priorContentSize
=
self
.
contentSize
;
self
.
contentInset
=
[
self
TPKeyboardAvoiding_contentInsetForKeyboard
];
}
}
#pragma mark - Utilities
-
(
BOOL
)
TPKeyboardAvoiding_focusNextTextField
{
UIView
*
firstResponder
=
[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
];
if
(
!
firstResponder
)
{
return
NO
;
}
UIView
*
view
=
[
self
TPKeyboardAvoiding_findNextInputViewAfterView
:
firstResponder
beneathView
:
self
];
if
(
view
)
{
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
0
),
dispatch_get_main_queue
(),
^
{
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
state
.
ignoringNotifications
=
YES
;
[
view
becomeFirstResponder
];
state
.
ignoringNotifications
=
NO
;
});
return
YES
;
}
return
NO
;
}
-
(
void
)
TPKeyboardAvoiding_scrollToActiveTextField
{
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
if
(
!
state
.
keyboardVisible
)
return
;
UIView
*
firstResponder
=
[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
self
];
if
(
!
firstResponder
)
{
return
;
}
// Ignore any keyboard notification that occur while we scroll
// (seems to be an iOS 9 bug that causes jumping text in UITextField)
state
.
ignoringNotifications
=
YES
;
CGFloat
visibleSpace
=
self
.
bounds
.
size
.
height
-
self
.
contentInset
.
top
-
self
.
contentInset
.
bottom
;
CGPoint
idealOffset
=
CGPointMake
(
self
.
contentOffset
.
x
,
[
self
TPKeyboardAvoiding_idealOffsetForView
:
firstResponder
withViewingAreaHeight
:
visibleSpace
]);
// Ordinarily we'd use -setContentOffset:animated:YES here, but it interferes with UIScrollView
// behavior which automatically ensures that the first responder is within its bounds
[
UIView
animateWithDuration
:
state
.
animationDuration
animations
:
^
{
self
.
contentOffset
=
idealOffset
;
}
completion
:^
(
BOOL
finished
)
{
state
.
ignoringNotifications
=
NO
;
}];
}
#pragma mark - Helpers
-
(
UIView
*
)
TPKeyboardAvoiding_findFirstResponderBeneathView
:
(
UIView
*
)
view
{
// Search recursively for first responder
for
(
UIView
*
childView
in
view
.
subviews
)
{
if
(
[
childView
respondsToSelector
:
@selector
(
isFirstResponder
)]
&&
[
childView
isFirstResponder
]
)
return
childView
;
UIView
*
result
=
[
self
TPKeyboardAvoiding_findFirstResponderBeneathView
:
childView
];
if
(
result
)
return
result
;
}
return
nil
;
}
-
(
UIView
*
)
TPKeyboardAvoiding_findNextInputViewAfterView
:
(
UIView
*
)
priorView
beneathView
:
(
UIView
*
)
view
{
UIView
*
candidate
=
nil
;
[
self
TPKeyboardAvoiding_findNextInputViewAfterView
:
priorView
beneathView
:
view
bestCandidate
:&
candidate
];
return
candidate
;
}
-
(
void
)
TPKeyboardAvoiding_findNextInputViewAfterView
:
(
UIView
*
)
priorView
beneathView
:
(
UIView
*
)
view
bestCandidate
:
(
UIView
**
)
bestCandidate
{
// Search recursively for input view below/to right of priorTextField
CGRect
priorFrame
=
[
self
convertRect
:
priorView
.
frame
fromView
:
priorView
.
superview
];
CGRect
candidateFrame
=
*
bestCandidate
?
[
self
convertRect
:(
*
bestCandidate
).
frame
fromView
:(
*
bestCandidate
).
superview
]
:
CGRectZero
;
CGFloat
bestCandidateHeuristic
=
[
self
TPKeyboardAvoiding_nextInputViewHeuristicForViewFrame
:
candidateFrame
];
for
(
UIView
*
childView
in
view
.
subviews
)
{
if
(
[
self
TPKeyboardAvoiding_viewIsValidKeyViewCandidate
:
childView
]
)
{
CGRect
frame
=
[
self
convertRect
:
childView
.
frame
fromView
:
view
];
// Use a heuristic to evaluate candidates
CGFloat
heuristic
=
[
self
TPKeyboardAvoiding_nextInputViewHeuristicForViewFrame
:
frame
];
// Find views beneath, or to the right. For those views that match, choose the view closest to the top left
if
(
childView
!=
priorView
&&
((
fabs
(
CGRectGetMinY
(
frame
)
-
CGRectGetMinY
(
priorFrame
))
<
FLT_EPSILON
&&
CGRectGetMinX
(
frame
)
>
CGRectGetMinX
(
priorFrame
))
||
CGRectGetMinY
(
frame
)
>
CGRectGetMinY
(
priorFrame
))
&&
(
!*
bestCandidate
||
heuristic
>
bestCandidateHeuristic
)
)
{
*
bestCandidate
=
childView
;
bestCandidateHeuristic
=
heuristic
;
}
}
else
{
[
self
TPKeyboardAvoiding_findNextInputViewAfterView
:
priorView
beneathView
:
childView
bestCandidate
:
bestCandidate
];
}
}
}
-
(
CGFloat
)
TPKeyboardAvoiding_nextInputViewHeuristicForViewFrame
:
(
CGRect
)
frame
{
return
(
-
frame
.
origin
.
y
*
1000
.
0
)
// Prefer elements closest to top (most important)
+
(
-
frame
.
origin
.
x
);
// Prefer elements closest to left
}
-
(
BOOL
)
TPKeyboardAvoiding_viewHiddenOrUserInteractionNotEnabled
:
(
UIView
*
)
view
{
while
(
view
)
{
if
(
view
.
hidden
||
!
view
.
userInteractionEnabled
)
{
return
YES
;
}
view
=
view
.
superview
;
}
return
NO
;
}
-
(
BOOL
)
TPKeyboardAvoiding_viewIsValidKeyViewCandidate
:
(
UIView
*
)
view
{
if
(
[
self
TPKeyboardAvoiding_viewHiddenOrUserInteractionNotEnabled
:
view
]
)
return
NO
;
if
(
[
view
isKindOfClass
:[
UITextField
class
]]
&&
((
UITextField
*
)
view
).
enabled
)
{
return
YES
;
}
if
(
[
view
isKindOfClass
:[
UITextView
class
]]
&&
((
UITextView
*
)
view
).
isEditable
)
{
return
YES
;
}
return
NO
;
}
-
(
void
)
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
(
UIView
*
)
view
{
for
(
UIView
*
childView
in
view
.
subviews
)
{
if
(
([
childView
isKindOfClass
:[
UITextField
class
]]
||
[
childView
isKindOfClass
:[
UITextView
class
]])
)
{
[
self
TPKeyboardAvoiding_initializeView
:
childView
];
}
else
{
[
self
TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView
:
childView
];
}
}
}
-
(
CGSize
)
TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames
{
BOOL
wasShowingVerticalScrollIndicator
=
self
.
showsVerticalScrollIndicator
;
BOOL
wasShowingHorizontalScrollIndicator
=
self
.
showsHorizontalScrollIndicator
;
self
.
showsVerticalScrollIndicator
=
NO
;
self
.
showsHorizontalScrollIndicator
=
NO
;
CGRect
rect
=
CGRectZero
;
for
(
UIView
*
view
in
self
.
subviews
)
{
rect
=
CGRectUnion
(
rect
,
view
.
frame
);
}
rect
.
size
.
height
+=
kCalculatedContentPadding
;
self
.
showsVerticalScrollIndicator
=
wasShowingVerticalScrollIndicator
;
self
.
showsHorizontalScrollIndicator
=
wasShowingHorizontalScrollIndicator
;
return
rect
.
size
;
}
-
(
UIEdgeInsets
)
TPKeyboardAvoiding_contentInsetForKeyboard
{
TPKeyboardAvoidingState
*
state
=
self
.
keyboardAvoidingState
;
UIEdgeInsets
newInset
=
self
.
contentInset
;
CGRect
keyboardRect
=
state
.
keyboardRect
;
newInset
.
bottom
=
keyboardRect
.
size
.
height
-
MAX
((
CGRectGetMaxY
(
keyboardRect
)
-
CGRectGetMaxY
(
self
.
bounds
)),
0
);
return
newInset
;
}
-
(
CGFloat
)
TPKeyboardAvoiding_idealOffsetForView
:
(
UIView
*
)
view
withViewingAreaHeight
:
(
CGFloat
)
viewAreaHeight
{
CGSize
contentSize
=
self
.
contentSize
;
__block
CGFloat
offset
=
0
.
0
;
CGRect
subviewRect
=
[
view
convertRect
:
view
.
bounds
toView
:
self
];
__block
CGFloat
padding
=
0
.
0
;
__block
UIEdgeInsets
contentInset
;
#ifdef __IPHONE_11_0
if
(
@available
(
iOS
11
.
0
,
*
))
{
contentInset
=
self
.
adjustedContentInset
;
}
else
{
contentInset
=
self
.
contentInset
;
}
#else
contentInset
=
self
.
contentInset
;
#endif
void
(
^
centerViewInViewableArea
)(
void
)
=
^
{
// Attempt to center the subview in the visible space
padding
=
(
viewAreaHeight
-
subviewRect
.
size
.
height
)
/
2
;
// But if that means there will be less than kMinimumScrollOffsetPadding
// pixels above the view, then substitute kMinimumScrollOffsetPadding
if
(
padding
<
kMinimumScrollOffsetPadding
)
{
padding
=
kMinimumScrollOffsetPadding
;
}
// Ideal offset places the subview rectangle origin "padding" points from the top of the scrollview.
// If there is a top contentInset, also compensate for this so that subviewRect will not be placed under
// things like navigation bars.
offset
=
subviewRect
.
origin
.
y
-
padding
-
contentInset
.
top
;
};
// If possible, center the caret in the visible space. Otherwise, center the entire view in the visible space.
if
([
view
conformsToProtocol
:
@protocol
(
UITextInput
)])
{
UIView
<
UITextInput
>
*
textInput
=
(
UIView
<
UITextInput
>*
)
view
;
UITextPosition
*
caretPosition
=
[
textInput
selectedTextRange
].
start
;
if
(
caretPosition
)
{
CGRect
caretRect
=
[
self
convertRect
:[
textInput
caretRectForPosition
:
caretPosition
]
fromView
:
textInput
];
// Attempt to center the cursor in the visible space
// pixels above the view, then substitute kMinimumScrollOffsetPadding
padding
=
(
viewAreaHeight
-
caretRect
.
size
.
height
)
/
2
;
// But if that means there will be less than kMinimumScrollOffsetPadding
// pixels above the view, then substitute kMinimumScrollOffsetPadding
if
(
padding
<
kMinimumScrollOffsetPadding
)
{
padding
=
kMinimumScrollOffsetPadding
;
}
// Ideal offset places the subview rectangle origin "padding" points from the top of the scrollview.
// If there is a top contentInset, also compensate for this so that subviewRect will not be placed under
// things like navigation bars.
offset
=
caretRect
.
origin
.
y
-
padding
-
contentInset
.
top
;
}
else
{
centerViewInViewableArea
();
}
}
else
{
centerViewInViewableArea
();
}
// Constrain the new contentOffset so we can't scroll past the bottom. Note that we don't take the bottom
// inset into account, as this is manipulated to make space for the keyboard.
CGFloat
maxOffset
=
contentSize
.
height
-
viewAreaHeight
-
contentInset
.
top
;
if
(
offset
>
maxOffset
)
{
offset
=
maxOffset
;
}
// Constrain the new contentOffset so we can't scroll past the top, taking contentInsets into account
if
(
offset
<
-
contentInset
.
top
)
{
offset
=
-
contentInset
.
top
;
}
return
offset
;
}
-
(
void
)
TPKeyboardAvoiding_initializeView
:
(
UIView
*
)
view
{
if
(
[
view
isKindOfClass
:[
UITextField
class
]]
&&
(((
UITextField
*
)
view
).
returnKeyType
==
UIReturnKeyDefault
||
(((
UITextField
*
)
view
).
returnKeyType
==
UIReturnKeyNext
))
&&
(
!
[(
UITextField
*
)
view
delegate
]
||
[(
UITextField
*
)
view
delegate
]
==
(
id
<
UITextFieldDelegate
>
)
self
)
)
{
[(
UITextField
*
)
view
setDelegate
:(
id
<
UITextFieldDelegate
>
)
self
];
UIView
*
otherView
=
[
self
TPKeyboardAvoiding_findNextInputViewAfterView
:
view
beneathView
:
self
];
if
(
otherView
)
{
((
UITextField
*
)
view
).
returnKeyType
=
UIReturnKeyNext
;
}
else
{
((
UITextField
*
)
view
).
returnKeyType
=
UIReturnKeyDone
;
}
}
}
@end
@implementation
TPKeyboardAvoidingState
@end
iCemarose/Header-Prefix.h
View file @
18b81387
...
...
@@ -58,6 +58,8 @@
#define NO_MORE_DATA @"------ 沒有啦 ------"
#define Order_API_Auth @"Basic YzJmNmZhZTk3NzQxZWE2ZGI0Y2FkN2FlOGY3MGZlZjM=="
//正式的微信key
#define WechatAppKey @"wx355a497b2a2dd6d5"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment