зеркало из https://github.com/xamarin/ios-samples.git
[Chat] implement smooth content movement
Xamarin.iOS 8.8.2.4
This commit is contained in:
Родитель
c70fd877ec
Коммит
d1679bbe9a
|
@ -70,6 +70,7 @@ namespace Chat
|
||||||
willHideToken = UIKeyboard.Notifications.ObserveWillHide (KeyboardWillHideHandler);
|
willHideToken = UIKeyboard.Notifications.ObserveWillHide (KeyboardWillHideHandler);
|
||||||
willHideMenuToken = UIMenuController.Notifications.ObserveWillHideMenu (MenuWillHide);
|
willHideMenuToken = UIMenuController.Notifications.ObserveWillHideMenu (MenuWillHide);
|
||||||
|
|
||||||
|
UpdateTableInsets ();
|
||||||
UpdateButtonState ();
|
UpdateButtonState ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,15 +89,39 @@ namespace Chat
|
||||||
BottomConstraint.Constant = View.Bounds.GetMaxY () - e.FrameEnd.GetMinY ();
|
BottomConstraint.Constant = View.Bounds.GetMaxY () - e.FrameEnd.GetMinY ();
|
||||||
|
|
||||||
UIViewAnimationCurve curve = e.AnimationCurve;
|
UIViewAnimationCurve curve = e.AnimationCurve;
|
||||||
UIView.Animate (e.AnimationDuration, 0, ConvertToAnimationOptions(e.AnimationCurve), ()=> {
|
UIView.Animate (e.AnimationDuration, 0, ConvertToAnimationOptions (e.AnimationCurve), () => {
|
||||||
View.LayoutIfNeeded ();
|
View.LayoutIfNeeded ();
|
||||||
|
Tuple<nfloat, nfloat> changes = UpdateTableInsets ();
|
||||||
|
|
||||||
|
// Move content with keyboard
|
||||||
|
var offset = TableView.ContentOffset;
|
||||||
|
offset.Y += changes.Item1 - changes.Item2;
|
||||||
|
TableView.ContentOffset = offset;
|
||||||
}, null);
|
}, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns changes in ContentInsetY and ContentOffsetY values
|
||||||
|
Tuple<nfloat, nfloat> UpdateTableInsets()
|
||||||
|
{
|
||||||
|
UIEdgeInsets oldInset = TableView.ContentInset;
|
||||||
|
CGPoint oldOffset = TableView.ContentOffset;
|
||||||
|
|
||||||
|
nfloat hiddenHeight = TableView.Frame.GetMaxY () - Chat.Frame.GetMinY();
|
||||||
|
|
||||||
|
UIEdgeInsets newInset = oldInset;
|
||||||
|
newInset.Bottom = hiddenHeight;
|
||||||
|
|
||||||
|
TableView.ContentInset = newInset; // this may change ContentOffset property implicitly
|
||||||
|
TableView.ScrollIndicatorInsets = newInset;
|
||||||
|
|
||||||
|
return new Tuple<nfloat, nfloat> (newInset.Bottom - oldInset.Bottom, TableView.ContentOffset.Y - oldOffset.Y);
|
||||||
|
}
|
||||||
|
|
||||||
UIViewAnimationOptions ConvertToAnimationOptions(UIViewAnimationCurve curve)
|
UIViewAnimationOptions ConvertToAnimationOptions(UIViewAnimationCurve curve)
|
||||||
{
|
{
|
||||||
// Looks like a hack. But it is correct.
|
// Looks like a hack. But it is correct.
|
||||||
// UIViewAnimationCurve and UIViewAnimationOptions are shifted by 16 bits
|
// UIViewAnimationCurve and UIViewAnimationOptions are shifted by 16 bits
|
||||||
|
// http://stackoverflow.com/questions/18870447/how-to-use-the-default-ios7-uianimation-curve/18873820#18873820
|
||||||
return (UIViewAnimationOptions)((int)curve << 16);
|
return (UIViewAnimationOptions)((int)curve << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,9 @@ namespace Chat
|
||||||
[Outlet]
|
[Outlet]
|
||||||
UIKit.NSLayoutConstraint BottomConstraint { get; set; }
|
UIKit.NSLayoutConstraint BottomConstraint { get; set; }
|
||||||
|
|
||||||
|
[Outlet]
|
||||||
|
UIKit.UIView Chat { get; set; }
|
||||||
|
|
||||||
[Outlet]
|
[Outlet]
|
||||||
UIKit.UIButton SendButton { get; set; }
|
UIKit.UIButton SendButton { get; set; }
|
||||||
|
|
||||||
|
@ -45,6 +48,11 @@ namespace Chat
|
||||||
TextView.Dispose ();
|
TextView.Dispose ();
|
||||||
TextView = null;
|
TextView = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Chat != null) {
|
||||||
|
Chat.Dispose ();
|
||||||
|
Chat = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,36 +17,8 @@
|
||||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5AB-rQ-cHe">
|
|
||||||
<rect key="frame" x="0.0" y="518" width="320" height="50"/>
|
|
||||||
<subviews>
|
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9s5-K4-3tE">
|
|
||||||
<rect key="frame" x="10" y="10" width="253" height="30"/>
|
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
|
||||||
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
|
||||||
</textView>
|
|
||||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gmO-Xl-znj">
|
|
||||||
<rect key="frame" x="273" y="10" width="37" height="30"/>
|
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
|
||||||
<state key="normal" title="Send">
|
|
||||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
|
||||||
</state>
|
|
||||||
</button>
|
|
||||||
</subviews>
|
|
||||||
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="height" constant="50" id="4bm-Wh-9tf"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="gmO-Xl-znj" secondAttribute="trailing" constant="10" id="9rx-oU-n4h"/>
|
|
||||||
<constraint firstItem="9s5-K4-3tE" firstAttribute="top" secondItem="5AB-rQ-cHe" secondAttribute="top" constant="10" id="Qft-O9-MCu"/>
|
|
||||||
<constraint firstItem="gmO-Xl-znj" firstAttribute="leading" secondItem="9s5-K4-3tE" secondAttribute="trailing" constant="10" id="euT-gK-943"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="gmO-Xl-znj" secondAttribute="bottom" constant="10" id="fiq-e9-bSb"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="9s5-K4-3tE" secondAttribute="bottom" constant="10" id="nlh-YW-f6B"/>
|
|
||||||
<constraint firstItem="9s5-K4-3tE" firstAttribute="leading" secondItem="5AB-rQ-cHe" secondAttribute="leading" constant="10" id="pd4-Zd-hcK"/>
|
|
||||||
</constraints>
|
|
||||||
</view>
|
|
||||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="0ka-sN-sOO">
|
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="0ka-sN-sOO">
|
||||||
<rect key="frame" x="0.0" y="20" width="320" height="498"/>
|
<rect key="frame" x="0.0" y="20" width="320" height="548"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="Incoming" id="bHN-iS-6rr" customClass="IncomingCell">
|
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" reuseIdentifier="Incoming" id="bHN-iS-6rr" customClass="IncomingCell">
|
||||||
|
@ -116,10 +88,38 @@
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
</prototypes>
|
</prototypes>
|
||||||
</tableView>
|
</tableView>
|
||||||
|
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="5AB-rQ-cHe">
|
||||||
|
<rect key="frame" x="0.0" y="518" width="320" height="50"/>
|
||||||
|
<subviews>
|
||||||
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="9s5-K4-3tE">
|
||||||
|
<rect key="frame" x="10" y="10" width="253" height="30"/>
|
||||||
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
|
<textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
|
||||||
|
</textView>
|
||||||
|
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="gmO-Xl-znj">
|
||||||
|
<rect key="frame" x="273" y="10" width="37" height="30"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
|
||||||
|
<state key="normal" title="Send">
|
||||||
|
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
|
</state>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="height" constant="50" id="4bm-Wh-9tf"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="gmO-Xl-znj" secondAttribute="trailing" constant="10" id="9rx-oU-n4h"/>
|
||||||
|
<constraint firstItem="9s5-K4-3tE" firstAttribute="top" secondItem="5AB-rQ-cHe" secondAttribute="top" constant="10" id="Qft-O9-MCu"/>
|
||||||
|
<constraint firstItem="gmO-Xl-znj" firstAttribute="leading" secondItem="9s5-K4-3tE" secondAttribute="trailing" constant="10" id="euT-gK-943"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="gmO-Xl-znj" secondAttribute="bottom" constant="10" id="fiq-e9-bSb"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="9s5-K4-3tE" secondAttribute="bottom" constant="10" id="nlh-YW-f6B"/>
|
||||||
|
<constraint firstItem="9s5-K4-3tE" firstAttribute="leading" secondItem="5AB-rQ-cHe" secondAttribute="leading" constant="10" id="pd4-Zd-hcK"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="5AB-rQ-cHe" firstAttribute="top" secondItem="0ka-sN-sOO" secondAttribute="bottom" id="9zR-cm-tcZ"/>
|
<constraint firstItem="2va-98-mOY" firstAttribute="top" secondItem="0ka-sN-sOO" secondAttribute="bottom" id="LxQ-Yp-0SF"/>
|
||||||
<constraint firstItem="2va-98-mOY" firstAttribute="top" secondItem="5AB-rQ-cHe" secondAttribute="bottom" id="auN-MO-VPe"/>
|
<constraint firstItem="2va-98-mOY" firstAttribute="top" secondItem="5AB-rQ-cHe" secondAttribute="bottom" id="auN-MO-VPe"/>
|
||||||
<constraint firstItem="5AB-rQ-cHe" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="cSv-z1-AfV"/>
|
<constraint firstItem="5AB-rQ-cHe" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="cSv-z1-AfV"/>
|
||||||
<constraint firstItem="0ka-sN-sOO" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="sDm-jl-Vpb"/>
|
<constraint firstItem="0ka-sN-sOO" firstAttribute="leading" secondItem="kh9-bI-dsS" secondAttribute="leading" id="sDm-jl-Vpb"/>
|
||||||
|
@ -130,6 +130,7 @@
|
||||||
</view>
|
</view>
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="BottomConstraint" destination="auN-MO-VPe" id="18l-BH-qKE"/>
|
<outlet property="BottomConstraint" destination="auN-MO-VPe" id="18l-BH-qKE"/>
|
||||||
|
<outlet property="Chat" destination="5AB-rQ-cHe" id="WDC-Fe-B4E"/>
|
||||||
<outlet property="SendButton" destination="gmO-Xl-znj" id="mNq-iE-tRc"/>
|
<outlet property="SendButton" destination="gmO-Xl-znj" id="mNq-iE-tRc"/>
|
||||||
<outlet property="TableView" destination="0ka-sN-sOO" id="uxW-0d-AwN"/>
|
<outlet property="TableView" destination="0ka-sN-sOO" id="uxW-0d-AwN"/>
|
||||||
<outlet property="TextView" destination="9s5-K4-3tE" id="w8i-uf-qOI"/>
|
<outlet property="TextView" destination="9s5-K4-3tE" id="w8i-uf-qOI"/>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче