Maui์๋ ์ด๋ฏธ ์์ ํ ์ ๋๋ฉ์ด์ API๊ฐ ์์ด ํ์ด์ง์์ ์์ํ๊ณ ์ ๋์ ์ธ ์ฝํ ์ธ ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ด์ง ์ฌ์ด๋ฅผ ํ์ํ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํฉ๋๊น?
์ด ์ฌ์์ Maui ์ ํ API๋ฅผ ์ ์ํฉ๋๋ค. ์ ์ฐจ๋ณํ๋ ์ ํ์๋ ๋ ๊ฐ์ง ์ ํ์ด ์์ต๋๋ค.
๊ธฐ์กด ์ ํ์ ๊ฒฝ์ฐ ์ง์๋๋ ์ ํ์ด ์๋ ์ ์ด๊ฑฐํ์ด ํ์ํฉ๋๋ค.
public enum NavigationTransitionType
{
None,
Fade,
Flip,
Scale,
SlideFromLeft,
SlideFromRight,
SlideFromTop,
SlideFromBottom,
Turnstile
}
๊ทธ๋ฆฌ๊ณ , NavigationPage ๋ฐ ์ ธ์ ์ฌ์ฉํ์ฌ ํ์ด์ง ์ ํ ํ ์ ์๋๋ก ํ์ด์ง์์ ์ ์์ฑ์ ํฌํจํ๋ค :
public static readonly BindableProperty TransitionTypeProperty =
BindableProperty.Create(nameof(TransitionType), typeof(NavigationTransitionType), typeof(NavigationPage), PageTransitionType.None,
BindingMode.TwoWay, null);
public NavigationTransitionType TransitionType
{
get { return (NavigationTransitionType)GetValue(TransitionTypeProperty); }
set { SetValue(TransitionTypeProperty, value); }
}
public static readonly BindableProperty TransitionDurationProperty =
BindableProperty.Create(nameof(TransitionDuration), typeof(double), typeof(NavigationPage), 500d,
BindingMode.TwoWay, null);
public double TransitionDuration
{
get { return (double)GetValue(TransitionDurationProperty); }
set { SetValue(TransitionDurationProperty, value); }
}
๋ฐ๋ฉด์ ๊ณต์ ์์ ์ ํ์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. ํต์ฌ์ ๋ ๊ฐ์ ๋ค๋ฅธ ํ์ด์ง์์ ์ฌ์ฉํ ์ ์๋ ๋์ผํ ํญ๋ชฉ์ _"๋งํฌ"_ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
View์์ ์์๋ ์ง์๋๋ ์์์ TransitionTag ์์ฑ์ด ์ฐ๊ฒฐ๋ฉ๋๋ค.
public static readonly BindableProperty TransitionTagProperty =
BindableProperty.CreateAttached("TransitionTag", typeof(int), typeof(Transition), 0,
propertyChanged: OnPropertyChanged);
์ฉ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Image Source="xamarin.jpg" TransitionTag="logo" WidthRequest="100" />
์์ค ํ์ด์ง์์ ์ ํํ ์ปจํธ๋กค์ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
<Image Source="xamarin.jpg" TransitionTag="logo" WidthRequest="300" />
๊ทธ๋ฆฌ๊ณ ๋์ ํ์ด์ง์์ ์ ํํ ์ปจํธ๋กค์ ํ๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค.
๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ด์ง ๊ฐ ์ ํ์ ์ฌ์ฉํ๋ ์ํ:
<ContentPage
TransitionType=โSlideFromBottomโ
TransitionDuration="750" />
๊ณต์ ์ ํ ์์๋ฅผ ์ฌ์ฉํ๋ ์ํ:
ํ์ด์ง 1:
<Image
Source="xamagon_preview.png"
TransitionTag="xamagon"/>
2 ์ชฝ:
<Image
Source="xamagon.png"
TransitionTag="xamagon"/>
TransitionTag
๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค.TransitionTag
๋ ๊ณ ์ ํด์ผ ํฉ๋๋ค.enum
๋์ ์ ๋๋ฉ์ด์
์ ์์ ํ๋ ์์ฑ์ด ์๋๊น์?
์ผ๋ถ ITransitionAnimation
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ ์ฌ์ฉ์ ์ ์ ์ ๋๋ฉ์ด์
์ ํ์ฅํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
๊ธ๊ผด์ NamedSize
์ ๊ฐ์ด ์ฌ์ฉํ ๋ฏธ๋ฆฌ ์ ์๋ ์ ๋๋ฉ์ด์
์์:
<ContentPage
Transition=โ{local:MyCustomTransition}"
TransitionDuration="750" />
๋๋ ๋ฏธ๋ฆฌ ์ ์๋ "๋ช ๋ช ๋ ์ ํ"
<ContentPage
Transition=โFade"
TransitionDuration="750" />
๊ณต์ ์ ํ๊ณผ ๊ด๋ จํ์ฌ ํญ๋ชฉ ๋ชฉ๋ก(์: Collectionview)์์ ์ ํ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ "TransitionTag" ์์ฑ์ด ์ ๋๋ฉ์ด์ ํ๋ ค๋ ๋ณด๊ธฐ๋ฅผ ์๋ณํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง์ ํ ์คํธ๊ฐ ํฌํจ๋ ํญ๋ชฉ ๋ชฉ๋ก์ด ์๋ DataTemplate์ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ์ด๋ฏธ์ง๋ ๋ค๋ฅด์ง๋ง TransitionTag๋ ํญ์ ๋์ผํฉ๋๋ค(์: "ImageToTransition").
์์๋ฅผ ํญํ ๋ ํ์ ๋ ๋๋ฌ๋ ๋ฒ์ญํด์ผ ํ๋ ์์๋ฅผ ์ ํํ ์์์ผ ํ๋ฉฐ CollectionView์ ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ํด ๋จ์ผ ํ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
๋ด ํ๋ฌ๊ทธ์ธ์์ ๋ฒ์ญํ ์์๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ๋ TransitionGroup ์์ฑ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ธฐ์ฌํ๊ณ ์ถ์ง๋ง Android์ฉ ์ฝ๋๊ฐ ์ถฉ๋ถํ ์์ ์ ์ด์ง ์์ต๋๋ค(TabbedPages/MasterPage๋ฅผ ์ฌ์ฉํ ๋ ChildFragments์ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ ธ์์๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค). iOS์์๋ ์ข์ ์ ํ ๋ชจ์์ ๋ง๋ค๊ธฐ ์ํด ๋ช ๊ฐ์ง ํดํน์ ๊ณ ์ํฉ๋๋ค. .
๋๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์ ๋ง์ ์ฝ๋๋ฅผ ์ฌ์์
ํ๊ณ ์ง๊ธ์ ๋ ์ข์ ๋ณด์ด์ง๋ง ํต์ฌ์ ๋ค์ด๊ฐ ๋งํผ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ํ ๊ฒฝ์ฐ ๋์์ ์ฃผ๊ณ ๊ธฐ์ฌํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
https://github.com/GiampaoloGabba/Xamarin.Plugin.SharedTransitions
Btw ์ผ๋ถ ์์ฑ์ ๋ฉ์ธ ์ฝ์ด์ ํตํฉํ ์ ์๋ค๋ฉด ๋ง์ ์ฝ๋๊ฐ ํฌ๊ฒ ๋จ์ํ๋ ์ ์์ต๋๋ค.
@felipebaltazar TabView https://github.com/xamarin/Xamarin.Forms/issues/10773 ์์ ์ฌ์ฉ์ ์ง์ ์ ํ์ ๋ง๋๋ ์ ์๊ณผ ์ ์ฌํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ํํ ํ ์ฌ์์ ๊ฒํ ํฉ๋๋ค.
@GiampaoloGabba ์ด API์ ๋ํ ๊ทํ์ ํผ๋๋ฐฑ์ ์ข์ ๊ฒ์
๋๋ค. ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด Xamarin.Forms์์์ ๊ฐ์ด PR์ ์๋ฝํ๊ณ ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ปฌ๋ ์
์ ๋ํด ์ง์ ํ๋ ๋งค๊ฐ ๋ณ์์ ๋ํด ๊ฒํ ํ ๊ฒฐ๊ณผ ๋ง์ต๋๋ค. Mnn, ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ถ๊ฐ ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค( TransitionGroup
). ๋๋ ์์์ ๋ถ๋ชจ๊ฐ ์ปฌ๋ ์
์ธ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ๊ทธ๋ฃน์ ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค.
๋๋ ์์์ ๋ถ๋ชจ๊ฐ ์ปฌ๋ ์ ์ธ ๊ฒฝ์ฐ ๋ด๋ถ์ ์ผ๋ก ๊ทธ๋ฃน์ ์๋์ผ๋ก ๋ง๋ญ๋๋ค.
์ด ๋ฐฉ๋ฒ์ ์๋ํ์ง๋ง ์กฐ๊ธ ์ด๋ ค์ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปฌ๋ ์
๋ทฐ์์ SelectedItem ๋ณ๊ฒฝ ์ฌํญ์ ๊ธฐ๋ฐ์ผ๋ก ํ์์ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฃนํ๋ฅผ ์ํด ์์ฑ์ "๋๋ฆฌ๊ธฐ"ํ ๋ค์ ์ฌ์ฉ์๊ฐ ์ธ์ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํ๋๋ก ํ๋ ๊ฒ์ด ํจ์ฌ ์ฌ์ ์ต๋๋ค. :)
Btw ๋๋ ์ด๊ฒ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉํ ๊ธฐ๋ณธ ์ํคํ ์ฒ๋ฅผ ๋ค๋ฃจ๋ ์์ ๋ฌธ์๋ฅผ ์ฌ๊ธฐ์ ์์ฑํ ๊ณํ์ ๋๋ค. , Android์์๋ ํจ์ฌ ๋ ์ฝ์ง๋ง, tappedpage ๋ฐ MasterDetail์ ์ํด ์์ฑ๋ ์์ ์กฐ๊ฐ์ ์ ์ธํ๋ฉด)
์ฌ๊ธฐ์ ํฌํ ํ ์ข์ ์์ด๋์ด๊ฐ ์๊ณ ๋์ ์์ด๋์ด๋ ์ ์ธํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๋ง์ด ์์ ๊ฒ์ ๋๋ค. :)
@GiampaoloGabba , ๊ฐ์ฌํฉ๋๋ค!
@felipebaltazar TabView xamarin/Xamarin.Forms#10773 ์์ ์ฌ์ฉ์ ์ง์ ์ ํ์ ์์ฑํ๋ ์ ์๊ณผ ์ ์ฌํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ํ ์คํธ๋ฅผ ์ํํ ํ ์ฌ์์ ๊ฒํ ํฉ๋๋ค.
์ข์ ์๋ฆฌ !!!!
Xamarin.Forms.Skeleton
๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ผ๋ถ ์ ๋๋ฉ์ด์
์ ์ํํ๋๋ฐ ์๋ก์ด ์์ด๋์ด์ ๋์์ด ๋ ์ ์์ต๋๋ค. ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค...
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ณต์ ์ ํ๊ณผ ๊ด๋ จํ์ฌ ํญ๋ชฉ ๋ชฉ๋ก(์: Collectionview)์์ ์ ํ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ "TransitionTag" ์์ฑ์ด ์ ๋๋ฉ์ด์ ํ๋ ค๋ ๋ณด๊ธฐ๋ฅผ ์๋ณํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง์ ํ ์คํธ๊ฐ ํฌํจ๋ ํญ๋ชฉ ๋ชฉ๋ก์ด ์๋ DataTemplate์ ์์ํด ๋ณด์ธ์. ๋ชจ๋ ์ด๋ฏธ์ง๋ ๋ค๋ฅด์ง๋ง TransitionTag๋ ํญ์ ๋์ผํฉ๋๋ค(์: "ImageToTransition").
์์๋ฅผ ํญํ ๋ ํ์ ๋ ๋๋ฌ๋ ๋ฒ์ญํด์ผ ํ๋ ์์๋ฅผ ์ ํํ ์์์ผ ํ๋ฉฐ CollectionView์ ๋ชจ๋ ์ด๋ฏธ์ง์ ๋ํด ๋จ์ผ ํ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค.
๋ด ํ๋ฌ๊ทธ์ธ์์ ๋ฒ์ญํ ์์๋ฅผ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ๋ TransitionGroup ์์ฑ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๊ธฐ์ฌํ๊ณ ์ถ์ง๋ง Android์ฉ ์ฝ๋๊ฐ ์ถฉ๋ถํ ์์ ์ ์ด์ง ์์ต๋๋ค(TabbedPages/MasterPage๋ฅผ ์ฌ์ฉํ ๋ ChildFragments์ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ ธ์์๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค). iOS์์๋ ์ข์ ์ ํ ๋ชจ์์ ๋ง๋ค๊ธฐ ์ํด ๋ช ๊ฐ์ง ํดํน์ ๊ณ ์ํฉ๋๋ค. .
๋๋ ์ฒซ ๋ฒ์งธ ๋ฒ์ ์์ ๋ง์ ์ฝ๋๋ฅผ ์ฌ์์ ํ๊ณ ์ง๊ธ์ ๋ ์ข์ ๋ณด์ด์ง๋ง ํต์ฌ์ ๋ค์ด๊ฐ ๋งํผ ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํ์ง๋ง ํ์ํ ๊ฒฝ์ฐ ๋์์ ์ฃผ๊ณ ๊ธฐ์ฌํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค.
https://github.com/GiampaoloGabba/Xamarin.Plugin.SharedTransitions