๊ฒฝ๊ณ : ์ด ์ฌ์์ ์ฌ์ ํ โโWIP์ด๋ฉฐ ์ด ๊ฐ๋ ์ ๊ณ์ ์คํ ์ค์ ๋๋ค.
์ฌ๋ฆผ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ ๋ค์ค ํ๊ฒํ ๋ฐ ๋จ์ผ ํ๋ก์ ํธ ๊ธฐ๋ฅ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
EntryRenderer.cs
public partial class EntryRenderer {
public static PropertyMapper<IView> ViewMapper = new PropertyMapper<IView> {
// Add your own method to map to any property
[nameof(IView.BackgroundColor)] = MapBackgroundColor
};
}
EntryRenderer.iOS.cs
// You donโt need to register a new renderer.
public partial class EntryRenderer
{
// You know what method to call because you named it!
public static void MapBackgroundColor (IViewRenderer renderer, IView view)
{
// You donโt need to call any base methods here or worry about order.
// Every renderer is consistent; you know where the native view is.
var nativeView = (NativeView)renderer.NativeView;
var color = view.BackgroundColor;
if (color != null) {
// Phew! That was easy!
nativeView.BackgroundColor = UIColor.FromRGB (204, 153, 255);
}
}
}
๋ชจ๋ ๊ธฐ๋ณธ ๋ ๋๋ฌ๋ ๋ชจ๋ ํ๋ซํผ์ ๋ํด ์ด ์ํคํ ์ฒ๋ก ์ด์๋ฉ๋๋ค.
rendererRegistrar๋ ์ข
์์ฑ ์๋น์ค์ ์กด์ฌํ๋ฉฐ serviceCollection.Get<IRendererRegistrar>()
์ํด ์ก์ธ์ค๋์ด ์ด๋ค ๋ ๋๋ฌ๊ฐ ์ด๋ค ์ปจํธ๋กค์ ์ฐ๊ฒฐ๋๋์ง ์ ์ดํ ์ ์์ต๋๋ค.
์์ฑ ๋งคํผ๋ ์๋ต ์์ฑ ๋ณ๊ฒฝ์์ ์์ ์ ํธ๋ฆฌ๊ฑฐํ๋ ์ญํ ์ ํฉ๋๋ค. ์ฌ๋ฆผ ๋ ๋๋ฌ ์์ฒด๋ ์์ฑ ๋ณ๊ฒฝ ์ฌํญ์ ๊ตฌ๋ ํ์ง ์์ง๋ง ์ ์ธ๋ ์ผ๋ถ ์์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ ์๋ต์ผ๋ก ์คํ๋ฉ๋๋ค.
์ปจํธ๋กค์ ์์ฑ ๋งคํผ ์์ฑ์ public static
์ด๋ฉฐ ์ฌ์ฉ์ ์ฝ๋๋ก ํ์ฅํ ์ ์์ต๋๋ค.
์์ฑ ๋งคํผ๋ ํผ๋๋ฐฑ ๋ฃจํ์์ ์ญํ ์ ํ์ง ์์ต๋๋ค(๋ฒํผ ํด๋ฆญ, ํ ์คํธ ์ ๋ ฅ)
TODO: ๋งคํผ ํค์ ๋ฌด์์ ์ฌ์ฉํ ์ง ๋
ผ์ํฉ๋๋ค. string
๋๋ object
? ์ฐธ์กฐ๋ฅผ ๋น๊ตํ ์ ์๋ ๊ฒฝ์ฐ(BindableProperties์ ๊ฒฝ์ฐ) ๋ฌธ์์ด ๋น๊ต๋ฅผ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด ์ํคํ ์ฒ์ ์๋ก์ด ํ์ฅ์ฑ ๋ชจ๋ธ์ ์์ฑ ๋งคํผ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ ์์ฑ์ ๋ํ ์ง์์ ์ถ๊ฐํ๋ ค๋ฉด ์ ์์ฑ์ ๋งคํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์์ฑ์ด ์กด์ฌํ๋ ค๋ฉด ์ปจํธ๋กค์ ์๋ธํด๋์ฑํด์ผ ํ์ง๋ง ๋ ๋๋ฌ๋ฅผ ์๋ธํด๋์ฑํ๋ ๊ฒ์ ํ์ํ์ง ์์ต๋๋ค.
๊ธฐ์กด ์ฌ์ฉ์ ์ง์ ๋ ๋๋ฌ์ ํ์ ํธํ์ฑ์ ์ ์งํ๋ ค๋์ง ๋๋ ์ด์ ๋ ๋๋ฌ์ ํ์ ํด๋์ค๊ฐ ์ด ์ํคํ ์ฒ์ ์ํฅ์ ๋ฏธ์น ์ง ์ฌ๋ถ
Xamarin์ wpf ๋ ๋๋ฌ์ ButtonRenderer์ ๊ฐ์ ์ผ๋ถ Android ๋ ๋๋ฌ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ฑํ๋ฉฐ ์ฌ๊ธฐ์ "๋น ๋ฅธ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์๊ณ ์์ต๋๋ค.
์ด ๋ ๋๋ฌ๊ฐ ๋น ๋ฅด๊ฑฐ๋ ๋น ๋ฅด์ง ์์ต๋๊น?
๋ฏธ๋ฆฌ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
@ysmoradi ๋ต! ์ด๋ฌํ ์ ๋ ๋๋ฌ๋ ๋น ๋ฅธ ๋ ๋๋ฌ ํจํด์ ๋ฐ๋ฆ ๋๋ค(์ฆ, ๊ธฐ๋ณธ ๋ณด๊ธฐ ์ฃผ์์ ๋ํผ ๋ณด๊ธฐ ์์). Android ๋ฐ WPF๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ํ๋ซํผ์ ๋ํด ์ด ์์ ์ ์ํํ ๊ณํ์ ๋๋ค.
์ด๋ค ๊ฒฝ์ฐ์๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ค๊ณ ํ์ง ๋ง์ญ์์ค. ์ด๊ฒ์ ์๋ก์ด ๊ฒ์ ๋๋ค. XF์ ํธํ๋ ํ์๋ ์์ต๋๋ค. ๋น์ ์ ๋ ๋์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.
Skia ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ๋๋ง๋๋ C#์ผ๋ก ์์ ํ ์์ฑ๋ ๋งคํ ๋ฐ ๋์ ๋ ผ๋ฆฌ ์์ด ์์ฒด ์ปจํธ๋กค ์ธํธ๋ก UI ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๋๋ค์ด ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉ์ ์ ์๋ ๋์์ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ซํผ ๋์์ธ ์ง์นจ์ ์ผ์น์ํค๋ ค๊ณ ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ผํ ํ์๋ ์ ์ฐํ ์ฌ์ฉ์ ์ ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์์ ํด ์ฃผ์ธ์. ํ์ง๋ง ์ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ณด๋ค ์ด์ ์ด ๋ ๋ง์์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํ๋ซํผ๋ณ ๋ ๋๋ฌ ๋์ ํ๋ซํผ ๊ฐ ๋ ๋๋ฌ๋ฅผ ์์ฑํ ์ ์์ต๋๊น? Skia-sharp ์ปจํธ๋กค์ ์ฌ์ฉํ์ฌ Button ์ปจํธ๋กค์ ๋งคํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ซํผ ๋ ๋๋ฌ๋ ์๋ชป๋ ๋์์ธ์
๋๋ค. ๋ณด์๋ค์ํผ ํ๋ซํผ ์ ํ์ผ๋ก ์ธํด UWP๋ฅผ ์ง์ํ์ง ์๋ xamarin ์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ง์ด ์์ต๋๋ค.
UWP์ ๊ทธ๋ฆผ์๋ฅผ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ๋ชจ์๋ฆฌ ๋ฒํผ์์ ๋ชจ์๋ฆฌ ๊ทธ๋ฆผ์๋ฅผ ์ป์ ์ ์์ต๋๋ค(๋ฌผ๋ก ๋ฒํผ ํ
ํ๋ฆฟ์ ๋ณ๊ฒฝํ์ฌ ์ด๋ฅผ ์ํํ ์ ์์ง๋ง ์ด๋ ๋ค๋ฅธ ๋ฌธ์ ์
๋๋ค).
ํฌ๋ก์ค ํ๋ซํผ ๋ ๋๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ๋งค์ฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ flutter๋ ์ด๊ฒ์ด ๊ฐ๋ฅํ๋ค๊ณ ๋งํ์ต๋๋ค. ์ฅ๊ธฐ์ ์ผ๋ก ํฌ๋ก์ค ํ๋ซํผ ๋ ๋๋ฌ๊ฐ ์ต์์ ์๋ฃจ์ ์ ๋๋ค.
์ ์ฒด ์ฑ์ ์ฌ์ฉ์ ์ง์ 2D ์บ๋ฒ์ค๋ก ๋ ๋๋งํ๋ ๊ฒ์ด ๋ชจ๋ฐ์ผ ์ฑ์์ ์ํํ๊ฒ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋๊ทธ ๋๋กญ, ํ ์คํธ ์ ํ, ํ ์คํธ ์กฐ์์ ์ํ ํค๋ณด๋ ๋จ์ถํค ๋ฑ๊ณผ ๊ฐ์ด ๋ค์ ๊ตฌํํด์ผ ํ๋ ์ฌ์ฉ์ ์์ ์ด ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฐ์คํฌํฑ ์ฑ์ด๋ ๋ณต์กํ ์ฑ์์๋ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
Skia ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ๋๋ง๋๋ C#์ผ๋ก ์์ ํ ์์ฑ๋ ๋งคํ ๋ฐ ๋์ ๋ ผ๋ฆฌ ์์ด ์์ฒด ์ปจํธ๋กค ์ธํธ๋ก UI ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๋๋ค์ด ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉ์ ์ ์๋ ๋์์ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ซํผ ๋์์ธ ์ง์นจ์ ์ผ์น์ํค๋ ค๊ณ ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ผํ ํ์๋ ์ ์ฐํ ์ฌ์ฉ์ ์ ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์์ ํด ์ฃผ์ธ์. ํ์ง๋ง ์ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ณด๋ค ์ด์ ์ด ๋ ๋ง์์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
์ ์ฒด ์ฑ์ ์ฌ์ฉ์ ์ง์ 2D ์บ๋ฒ์ค๋ก ๋ ๋๋งํ๋ ๊ฒ์ด ๋ชจ๋ฐ์ผ ์ฑ์์ ์ํํ๊ฒ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋๊ทธ ๋๋กญ, ํ ์คํธ ์ ํ, ํ ์คํธ ์กฐ์์ ์ํ ํค๋ณด๋ ๋จ์ถํค ๋ฑ๊ณผ ๊ฐ์ด ๋ค์ ๊ตฌํํด์ผ ํ๋ ์ฌ์ฉ์ ์์ ์ด ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ๋ฐ์คํฌํฑ ์ฑ์ด๋ ๋ณต์กํ ์ฑ์์๋ ์๋ํ์ง ์์ ์ ์์ต๋๋ค.
Skia ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ๋๋ง๋๋ C#์ผ๋ก ์์ ํ ์์ฑ๋ ๋งคํ ๋ฐ ๋์ ๋ ผ๋ฆฌ ์์ด ์์ฒด ์ปจํธ๋กค ์ธํธ๋ก UI ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๋๋ค์ด ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉ์ ์ ์๋ ๋์์ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ซํผ ๋์์ธ ์ง์นจ์ ์ผ์น์ํค๋ ค๊ณ ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ผํ ํ์๋ ์ ์ฐํ ์ฌ์ฉ์ ์ ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์์ ํด ์ฃผ์ธ์. ํ์ง๋ง ์ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ณด๋ค ์ด์ ์ด ๋ ๋ง์์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
๋น์ ์ ์ด ๋ชจ๋ ๊ฒ์ ๋ํด ์ ๋์ ์ผ๋ก ์ณ์ต๋๋ค. ํ์ง๋ง ํ์ด ๋จ ํ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ ํํ๋๋ก ๊ฐ์๋ฐ๋ ๊ฒ์ ์๋๋๋ค. ์๊ฐ์ด ๋ถ์กฑํด์ ๊ทธ๋ฐ ๊ฒ ๊ฐ์์. ๋ด ๋ง์ ๊ทธ๋ค์ด .net 6๊ณผ ํจ๊ป "์์ ํ ์๋ก์ด" ์์ ํ ํฌ๋ก์ค ํ๋ซํผ UI ํ๋ ์์ํฌ๋ฅผ 1๋ ์์ ์ถ์ํด์ผ ํ๋ค๋ ๋ป์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋์ ํ ์คํธ๋ฅผ ๊ฑฐ์น ์ข์ ํ๋ ์์ํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒ์ด ํจ์ฌ ๋ ์ํํฉ๋๋ค. ๊ด์ฐฎ๊ณ ๊ทธ๋์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์ฅ๊ธฐ์ ์ผ๋ก ์ปค์คํ 2D ์บ๋ฒ์ค ๋ ๋๋ง์ด ํจ์ฌ ๋ ๋ง์ ์ด์ ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ "ํฌ๋ก์ค ํ๋ซํผ"์ด๋ผ๊ณ ๋ถ๋ฅผ ๊ฐ์น๊ฐ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. Xamarin ์์์ ์ ๋ง ์ข์ ๊ธฐ๋ฅ์ด๋ฉฐ ์ค๋๋ ์์ฒญ๋ ๋ฐ์ ์ ์ด๋ฃจ๊ณ ์์ต๋๋ค. ํ์ง๋ง ๊ณ์ํด์ผ ํ ๋์ ๋๋ค. Microsoft์ xamarin ํ์ ๋งค์ฐ ์๋ฆฌํ ์์ง๋์ด๋ฅผ ๋ณด์ ํ๊ณ ์์ผ๋ฉฐ ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ๊ณ ๋ คํ๊ฑฐ๋ http://avaloniaui.net/ ์ ๋น์ฅ์ ์นด๋๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
Skia ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ ๋๋ง๋๋ C#์ผ๋ก ์์ ํ ์์ฑ๋ ๋งคํ ๋ฐ ๋์ ๋ ผ๋ฆฌ ์์ด ์์ฒด ์ปจํธ๋กค ์ธํธ๋ก UI ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ฌ๋๋ค์ด ๊ฐ๋ ฅํ๊ฒ ์ฌ์ฉ์ ์ ์๋ ๋์์ธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋ซํผ ๋์์ธ ์ง์นจ์ ์ผ์น์ํค๋ ค๊ณ ํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ผํ ํ์๋ ์ ์ฐํ ์ฌ์ฉ์ ์ ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. ๋๋ฝ๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์์ ํด ์ฃผ์ธ์. ํ์ง๋ง ์ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ณด๋ค ์ด์ ์ด ๋ ๋ง์์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
Skia ๊ฐ๋ฐ์๊ฐ 100% ๋ณ๊ฒฝํ์ฌ ํ๋ถํ ๋์์ธ์ ์ ๊ณตํ ์ ์๋๋ก 4์ฐจ ๋ ๋ ๊ธฐ๋ณธ ํ์์ ์ฌ์ฉํ๋ฉด ๋ฉ์ง ์ ์์ต๋๋ค.
๋ฐฑ์ฝค ๊ฐ๋ฅ์ฑ์ ์ํด 3๊ฐ๋ ๊ทธ๋๋ก ๋์ง๋ง "๊ฐ๋ฐ์์๊ฒ ์ง์ ๊ทธ๋ฆฌ์ญ์์ค"_skia_render๋ฅผ ์ถ๊ฐํ๊ณ ๊ฐ๋ฐ์์ ๋ํ 90%์ ์ฑ
์์ ์ง๋๋ค.
๋ ๋๋ฌ์ ๊ฐ๋
์ด ์ ์ง๋์ด์ผ ํ๋ค๋ฉด INotifyPropertyChanged
๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ๊ณต์ UI ์ฝ๋์ ๋ ๋๋ฌ ์ฌ์ด์ ๋ค๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ์๊ฐํ ์ ์์ต๋๊น? ์ฆ
PropertyChanged
์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๋์ ํ๋ซํผ ๋ ๋๋ฌ์์ ์ง์ ์์ฑ์ ๋งคํํ๊ณ ์ค์ ํ INotifyPropertyChanged
๋ MVVM ๋์์ธ ๋ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ๋ทฐ ๋ชจ๋ธ์ ์ ํฉํ์ง๋ง ๊ณต์ UI ์ฝ๋์ ํ๋ซํผ ๋ ๋๋ฌ ์ฌ์ด์ ๋ธ๋ฆฌ์ง ๋ฉ์ปค๋์ฆ์ผ๋ก ํญ์ ํฌ๋ฐํ๊ฒ ๋๊ปด์ก์ต๋๋ค. ์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋์ ์ฑ๋ฅ, ๊ณต์ UI์ ๋ ๋๋ฌ ๋ ์ด์ด ๊ฐ์ '์๋ค' ๊ฐ์, ๋ ๋์ ๊ฐ๋ฐ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
์ด๊ฒ์ ๊ธธ์ง๋ง ๋ง์ฐ์ด์ "์ผ๊ตฌ ๋ด๋ถ"๋ฅผ ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
https://www.youtube.com/watch?v=_MGh3xipWm4
๋ง์ฐ์ด์ ์ํคํ ์ฒ๋ ํ๋ซํผ์์ ๋ ๋๋ง๋ ์ปจํธ๋กค๊ณผ ์บ๋ฒ์ค๋ก ๊ทธ๋ฆฐ ์ปจํธ๋กค์ ๋ชจ๋ ์ง์ํ ๊ฒ์ด๋ฉฐ, ๋ ๋์๊ฐ ๊ณ ๊ทํ @Clancey ๋ MVU ํ๋ ์ด๋ฒ์์๋ง ์๋ํ๋ ๊ฒ์ด ์๋ ๋ง์ฐ์ด์ฉ ์คํค ๊ธฐ๋ฐ ๋ ๋ ์ธํธ์์ ๊ณ์ ์์ ํ ๊ฒ์ ๋๋ค. ๋ง์ฐ์ด ๋ฟ๋ง ์๋๋ผ MVVM ํจํด์๋ ์ ์ฉ๋ฉ๋๋ค.
์ธ๋ป ๋ณด๊ธฐ์ Maui๋ Forms์ ๋ธ๋๋ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง๋ง ์์ธํ ์ดํด๋ณด๋ฉด ๋ ์ด์ด๋ฅผ ๋ ๋์จํ๊ฒ ๊ฒฐํฉํ์ฌ ์ด ์ค๋ ๋์์ ์ฐ๋ฆฌ๊ฐ ์์ฒญํ๋ ๋ง์ ๊ฒ์ ์ง์ํ๋๋ก Forms ์ํคํ ์ฒ๋ฅผ ์ฌ๊ตฌ์ฑํ ๊ฒ์ ๋๋ค. ์์ผ๋ก ์ฆ๊ฑฐ์ด ์๊ฐ.
์ด๊ฒ์ ์ฃผ์ ์์ ์ฝ๊ฐ ๋ฒ์ด๋์ง๋ง ์ด ์ ํํ ๊ฒ๊ณผ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฌป๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
SKCanvasView
(๋๋ ์ผ๋ฐ์ ์ผ๋ก Skia)์์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ๊ฐ๊ฐ์ ํญ์ ํฌ๊ธฐ์ ๋น๋กํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํฉ๋๊น? ๋ค๋ฅธ ํญ๋ชฉ๊ณผ ๊ฒน์น๋ฉด ๋ณ๊ฒฝ๋ฉ๋๊น?
์๋ฅผ ๋ค์ด ๊ทธ๋ผ๋์ธํธ ์ปจํธ๋กค(Skia๋ก ์์ฑ๋ ๋ ๋๋ฌ)์ด ์๊ณ ๊ทธ ์์ ๋ฐํฌ๋ช ๋ฒํผ(Skia๋ก ์์ฑ๋ ๋ ๋๋ฌ)์ด ์๋ ๊ฒฝ์ฐ ๋ ๋ฐฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๊ฑฐ๋ ๊ทธ๋ํฝ ์ปจํ ์คํธ๊ฐ ์ด๋ป๊ฒ๋ ๊ณต์ ๋ฉ๋๊น? Skia ์ปจํธ๋กค์ด Skia ์ด์ธ์ ์ปจํธ๋กค๊ณผ ๊ฒน์น๋ฉด ์ด๋ป์ต๋๊น?
์ด์ ์ Skia๋ฅผ ์ฌ์ฉํ์ฌ Forms์์ ๋ฉ์ง ๊ทธ๋ํฝ ์ปจํธ๋กค์ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์๋ ๋ฐฉ์์ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ด ํญ์ ๊ฑฑ์ ๊ฑฐ๋ฆฌ๊ฐ ๋์์ต๋๋ค.
@GalaxiaGuy wpf ์ปจํธ๋กค์์ ํธ์คํ
๋๋ winform ์ปจํธ๋กค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํค์ด ์ปจํธ๋กค์ด ์๋ ์ปจํธ๋กค์์ ๊ฒน์น ์คํค์ด ์ปจํธ๋กค์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋น์ ์ ์ด๊ฒ์ ํ ์ ์์ง๋ง ์ต์ ์ ์๋๋๋ค.
SKCanvasView
๋ ๋๋ง๋ ๋ ๊ฐ์ ์ปจํธ๋กค์ด ์๋ ๊ฒฝ์ฐ ๊ทธ๋ํฝ ์ปจํ
์คํธ๋ ๊ณต์ ๋์ง ์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ ๋๋ง๋ ๋ ๊ฐ๋ฅผ ํฉ์ฑํ์ฌ ๋จ์ผ ์บ๋ฒ์ค์ ๊ทธ๋ฆฌ๋ ๊ฒ์
๋๋ค.
๋ด ํ
์คํธ์์ SkiaSharp
์ฑ๋ฅ์ ์ ์ ์์
๋ง ํ๋ฉด ๊ทธ๋ ๊ฒ ๋์์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ์ง ์ ๋๋ฉ์ด์
์ ํ๋ ค๊ณ ํ๋ฉด ๋ด ๋ฉํฑ์์ CPU ์ฌ์ฉ๋์ด ์ฝ๊ฐ ๋์ต๋๋ค.
๋ง์ ์ฌ๋๋ค์ด Skia์ ์ด๊ดํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ข์ ๋ ๋๋ง ์ฌ์์ ๋ฎ์ ์์ค์์ ์ฌ์ฉ๋๋ ๋ ๋๋ง ์์ง๊ณผ ๋ฌด๊ดํฉ๋๋ค. ํน์ ํ๋ซํผ ๋ ๋๋ฌ๊ฐ Skia(๋๋ Direct2D ๋๋ OpenGL ๋ฑ)๋ฅผ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ ๊ณ์ธต์์ ๊ฑฑ์ ํด์ผ ํ ์ฌํญ์ด ๋์ด์๋ ์ ๋ฉ๋๋ค.
๋ช ๋
์ WPF๋ฅผ ์ฌ์ฉํ XAML์ ๊ฐ์ฅ ํฐ ์ฝ์์ Lookless Controls ์ ์์ด๋์ด์์ต๋๋ค. Xamarin Forms๋ ์ด ๊ธฐ๋ฅ ์์ด XAML์ ์ฌ์ฉํ์ผ๋ฉฐ ์ด๊ฒ์ด ๊ฐ์ฅ ์ทจ์ฝํ ์ง์ ์ด์์ต๋๋ค. ๋ช ๋
ํ Drawing ์ฌ์์ผ๋ก ๋ถ๋ถ์ ์ผ๋ก ์์ ๋์์ต๋๋ค.
๋ค์ํ OS ๋ฐ ํ๋ ์์ํฌ์ ๊ธฐ์กด ๊ตฌ์ฑ ์์์ ๋ํ ๋ ๋ค๋ฅธ ์ธํฐํ์ด์ค ๋ฐ ์ถ์ํ ์งํฉ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ง ์์ง๋ง ํ๋ซํผ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์๊ฐ์ ๊ธฐ๋ณธ ์์ ๋ฐ ํ๋ซํผ๋ณ ๊ทธ๋ํฝ ๋ ๋๋ง ๋ฐฑ์๋๋ก ํ
ํ๋ฆฟ ํ ๋ XAML ๊ธฐ๋ฐ์ ์ง์ ์ผ๋ก
๋ช ๋ ์ WPF๋ฅผ ์ฌ์ฉํ XAML์ ๊ฐ์ฅ ํฐ ์ฝ์์ ์ปจํธ๋กค์ ์ค์ ๊ทธ๋ํฝ์ด ํ ํ๋ฆฟ์ผ๋ก ์ฐ๊ธฐ๋๋ Lookless Controls์ ์์ด๋์ด์์ต๋๋ค. Xamarin Forms๋ ์ด ๊ธฐ๋ฅ ์์ด XAML์ ์ฌ์ฉํ์ผ๋ฉฐ ์ด๊ฒ์ด ๊ฐ์ฅ ์ทจ์ฝํ ์ง์ ์ด์์ต๋๋ค. ๋ช ๋ ํ Drawing ์ฌ์์ผ๋ก ๋ถ๋ถ์ ์ผ๋ก ์์ ๋์์ต๋๋ค.
๋์! ๊ทธ๋ฆฌ๊ณ ์ฑ์ด ํ์๋ก ํ๋ ๋ชจ๋ ๊ฒ์ 99%๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ์ ๋ง ์ ์ ์์ ๋ ๋๋ง ๊ธฐ๋ณธ ์์๊ฐ ํ์ํฉ๋๋ค.
XF ๋ ๋๋ง ํ๋ซํผ์ ํ๋ ์์ํฌ์ ์๋ก์ด ์ ํ์ ์ปจํธ๋กค์ด ์ถ๊ฐ๋ ๋๋ง๋ค ํ๋ ์์ํฌ ๋ด์ ๊ธฐ์กด ํ๋ฆฌ๋ฏธํฐ๋ธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋ํ๋ ๋์ ์ ๋ ๋๋ฌ๋ก ์ํ๋๊ธฐ ๋๋ฌธ์ ๋๋ฌด ๋น๋ํด์ก์ต๋๋ค.
์, ํจ์ฌ ๋ ๋ง์ ๋
ผ๋ฆฌ๋ฅผ ํ๋ ์์ํฌ ๊ณ์ธต์ผ๋ก ์ด๋ํด์ผ ํ๋ฉฐ, ํญ๋ชฉ ์ ์ด์ ๊ด๋ จํ์ฌ ๊ฐ์ฅ ์ด๋ ค์ด ์ ์
๋๋ค( VirtualizingStackPanel
๋ ํ์ฅ ๊ฐ๋ฅํ ํญ๋ชฉ ๋ทฐ์ด๋ฅผ ๊ฐ๋ ๋ฐ ์ค์ํ์ง๋ง ๋ด๊ฐ ์๋ ํ ์ธ๋ถ๋ก ํจ๊ณผ์ ์ผ๋ก ์ด์๋ ์ ์ด ์๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. WPF๊ฐ ๋๋ฌด ๋ณต์กํ๊ธฐ ๋๋ฌธ์). ๊ทธ๋ฌ๋ WPF๊ฐ ์คํ ์์ค์ด๊ธฐ ๋๋ฌธ์ ๋ง์ ๊ฒ๋ค์ด ์ง๊ธ MAUI๋ก ํฌํ
๋ ์ ์์ผ๋ฉฐ ๋ง์นจ๋ด ์ด๊ฒ์ด ์ผ์ด๋๊ธฐ ์์ํด์ผ ํ ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฑ์ด ํ์๋ก ํ๋ ๋ชจ๋ ๊ฒ์ ์๋ง 99%๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ์์ฃผ ์ ์ ์์ ๋ ๋๋ง ํ๋ฆฌ๋ฏธํฐ๋ธ๊ฐ ์ ๋ง๋ก ํ์ํฉ๋๋ค.
Uno ํ๋ซํผ์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@velocitysystems
๊ณต์ ์ปจํธ๋กค์ ์์ฑ์ ์ค์ ํ๊ณ PropertyChanged ์ด๋ฒคํธ๊ฐ ์ ํ๋๋ ๋์ ํ๋ซํผ ๋ ๋๋ฌ์์ ์์ฑ์ ์ง์ ๋งคํํ๊ณ ์ค์ ํ ์ ์์ต๋๊น?
์ด๊ฒ์ด ์ด๋ฒ ๋ณํ์ ํฐ ๋ชฉํ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ํธ์ ์์ผ๋ฉด ๋ ๋๋ฌ๋ BindableObject ๋๋ INPC๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค.
์ด๊ฒ์ด ์ด๋ฒ ๋ณํ์ ํฐ ๋ชฉํ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ํธ์ ์์ผ๋ฉด ๋ ๋๋ฌ๋ BindableObject ๋๋ INPC๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ํ ๋ชจ๋ฆ ๋๋ค.
๋ ๋๋ฌ์ ๋ฐฉ๋ฒ์ ๋๋ง๋ค ํ๋ ์ ์ํฌ์ ์ํด ํธ์ถ ์ป์ ๊ฒ์ด๋ค ๊ทธ๋์ BindableProperty
๊ฐ ๋์ ์ ๊ฐ์
ํด์ผํ๋ ๋ ๋๋ฌ์ ๋ณ๊ฒฝ PropertyChanged
?
@legistek ๋ง์
์ด๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ข ์์ฑ์ ๋ฐ์ ์ํต๋๋ค.
๋ฐ๋ผ์ ๋ ๋๋ฌ๋ IButton์ ๋ํด์๋ง ์๋ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ System.Maui๋ ๋ ๋๋ฌ๊ฐ Xamarin.Forms.Core์ ๋ํ ์ฐธ์กฐ๋ฅผ ๊ฐ๋ ๋ฐฉ์๊ณผ ๋ฐ๋๋๋ ๋ ๋๋ฌ ํ๋ก์ ํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์์๋ ์คํ์ดํฌ๋ฅผ ํ์ธํ์ต๋๋ค
https://github.com/dotnet/maui/pull/66
๊ทธ๋์ ๋น์ ์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์๊ฒผ๋์ง ๋ณผ ์ ์์ต๋๋ค
์ ๋ ์ค๋ ์คํ 3์ 30๋ถ PDT ์๊ฐ์ @davidortinau ์ ํจ๊ป
https://www.twitch.tv/microsoftdeveloper
์ฐ๋ฆฌ์ ํจ๊ป! ํ์ธ ํด๋ด! ๊ทธ๋ฆฌ๊ณ ์ง๋ฌธํ์ธ์!
@PureWeen ๋ถํํ๋ ๋๋ ๊ทธ๊ฒ์ ๋์ณค๋ค. YouTube์์ ์ฌ์ฉํ ์ ์๋ ๋ น์์ด ์์ต๋๊น?
์ด๊ฒ์ด ์ด๋ฒ ๋ณํ์ ํฐ ๋ชฉํ์ด๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ๋ฐ๋ํธ์ ์์ผ๋ฉด ๋ ๋๋ฌ๋ BindableObject ๋๋ INPC๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ํ ์์ง ๋ชปํฉ๋๋ค.
๊ทธ๊ฒ์ ๊ฑฐ๋ํ๊ณ ์ค์ง์ ์ธ ๊ฐ์ ์ ๋๋ค. ์์ฌํ ์ฌ์ง ์์ด ๋ง์ฐ์ด๋ก์ ์ด๋๊ณผ ํจ๊ป ๋ง์ ๋ ๋๋ฌ์์ ์ฌ์ฉ๋๋ ๋ณต์กํ ์์ ๋ชจ๋ธ์ด ์ ๊ฑฐ๋์ด ๋ณด๋ค ๊ตฌ์ฑ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์ ํธํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
์ค๋์ #66์ ๋ฆฌ๋ทฐํฉ๋๋ค.
#66์ ๋ณด๋ฉด ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํ๋ ๋์ 'bait-and-switch'๋ก ์ฌ๋ฆผ ๋ ๋๋ฌ๊ฐ ๋น๋๋๊ณ ํธ์ถ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์๊ฐ:
ObjectDisposedException
์ด์ด์ง๋ ๊ฐ์ํ๋ ๋ ์ด์์์ ์์ ๋ณด๊ธฐ์์ ํนํ ๋๋๋ฌ์ง๋๋ค.Effect
์ ์ฌ์ฉ ์ค๋จ์ผ๋ก ์ด์ด์ง๋๊น? ํจ๊ณผ๋ ์ ์ฉํ ์ ์์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ๋ ์ด์์ ์๋ช
์ฃผ๊ธฐ์ ๋ณต์ก์ฑ๊ณผ ๋๊ธฐ ์๊ฐ์ ๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํฉ๋๋ค.MediaElement
์ Position( TimeSpan
) ์์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Setter๋ ํ์ฌ ์์น๋ฅผ ์
๋ฐ์ดํธํ๊ณ getter๋ ๊ธฐ๋ณธ ๋ฏธ๋์ด ํ๋ ์ด์ด(์: AVPlayer
, MediaPlayer
์์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ฌ๋ฆผ ๋ ๋๋ฌ๋ก _getter_๋ฅผ ๋งคํํ๊ธฐ ์ํ ๋์์ธ์ด ์์ต๋๊น?Slim ๋ ๋๋ฌ๊ฐ GC ๋ฌธ์ , ํนํ ๊ด๋ฆฌ ๋ฐ ๊ธฐ๋ณธ ์ ์ด ์๋ช ์ฃผ๊ธฐ ๊ฐ์ ๋ถ์ผ์น๊ฐ ์๋ Android์์ ํด๊ฒฐํ ์ ์์ต๋๊น? ์ด๊ฒ์ ๋๋ ค์ด ObjectDisposedException์ผ๋ก ์ด์ด์ง๋ ๊ฐ์ํ๋ ๋ ์ด์์์ ์์ ๋ณด๊ธฐ์์ ํนํ ๋๋๋ฌ์ง๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์์ด๋์ด๊ฐ ์์ต๋๋ค!! ์ฐ๋ฆฌ๋ ODE ์์ธ์ ์ ๋ถ๋ ์๋์ง๋ผ๋ ๋๋ถ๋ถ์ ํฌ๋ง์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ํ๊ธฐ ์ ๋ต์ ์ฝ๊ฐ ์ฌ์์ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ง๊ธ ์ฐ๋ฆฌ๋ Android/iOS์ ๋ชจ๋ ๊ฒ์ ๋งค์ฐ ์ ๊ทน์ ์ผ๋ก ํ๊ธฐํ์ง๋ง GC๊ฐ ํ๋ ์ผ์ ํ๊ธฐ ์ํด GC์ ์์กดํ ์ ์๋ค๊ณ ํ์ ํฉ๋๋ค. ๋ชจ๋ ๊ฒ์ ์ญ์ฐธ์กฐํ๊ณ GC๊ฐ ์ด๋ฌํ ๋ง์ ๊ฒฝ์ฐ์ ๋์์ด ๋๋ ์์ ์ ์ํํ๋๋ก ํ๋ฉด
Slim ๋ ๋๋ฌ๋ Effect์ ์ฌ์ฉ ์ค๋จ์ผ๋ก ์ด์ด์ง๋๊น? ํจ๊ณผ๋ ์ ์ฉํ ์ ์์ง๋ง ๊ถ๊ทน์ ์ผ๋ก ๋ ์ด์์ ์๋ช ์ฃผ๊ธฐ์ ๋ณต์ก์ฑ๊ณผ ๋๊ธฐ ์๊ฐ์ ๋ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ ์ถ๊ฐํฉ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ด ์์ด๋์ด๋ฅผ ๋ฐ์ ์ํฌ ๋ ์ดํด๋ด์ผ ํ ์ข์ ์ ์ ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ์ต์ข ๋์์ธ์ ๋๋ฌํ๋ฉด ํจ๊ณผ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์, ํจ๊ณผ๊ฐ ์ ์ฒด ๋ ๋๋ฌ๋ก ์ ํํ์ง ์๊ณ ๋ ๊ธฐ๋ณธ ์์๋ฅผ ํ์ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์๋๋ ๋๋ก ์ฌ์ฉ๋์ง ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋งคํผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ชจ์๋ ํจ๊ณผ
'์๋ฐฉํฅ' ์์ฑ์ ์๋ก์ด ๋ ๋๋ฌ ๋์์ธ์์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ์๋ฅผ ๋ค์ด ์์น(TimeSpan) ์์ฑ์ด ์๋ MediaElement๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Setter๋ ํ์ฌ ์์น๋ฅผ ์ ๋ฐ์ดํธํ๊ณ getter๋ ๊ธฐ๋ณธ ๋ฏธ๋์ด ํ๋ ์ด์ด(์: AVPlayer, MediaPlayer)์์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ฌ๋ฆผ ๋ ๋๋ฌ๋ก ๊ฒํฐ๋ฅผ ๋งคํํ๊ธฐ ์ํ ๋์์ธ์ด ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์์ง ์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. @Clancey๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง ActionMapper๋ ์ด์ ๋ํ ์ฐ๋ฆฌ์ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ด์์ต๋๋ค. ์? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91
'์๋ฐฉํฅ' ์์ฑ์ ์๋ก์ด ๋ ๋๋ฌ ๋์์ธ์์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ์๋ฅผ ๋ค์ด ์์น(TimeSpan) ์์ฑ์ด ์๋ MediaElement๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Setter๋ ํ์ฌ ์์น๋ฅผ ์ ๋ฐ์ดํธํ๊ณ getter๋ ๊ธฐ๋ณธ ๋ฏธ๋์ด ํ๋ ์ด์ด(์: AVPlayer, MediaPlayer)์์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ฌ๋ฆผ ๋ ๋๋ฌ๋ก ๊ฒํฐ๋ฅผ ๋งคํํ๊ธฐ ์ํ ๋์์ธ์ด ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์์ง ์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. @Clancey๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง ActionMapper๋ ์ด์ ๋ํ ์ฐ๋ฆฌ์ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ด์์ต๋๋ค. ์? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91
์ ํํ. ๋ฐ๋ผ์ ActionMapper๋ SetElement ๋จ๊ณ์์ ํธ์ถ๋์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ PropertyMapper์ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ WebView, GoBack๊ณผ ๊ฐ์ ๊ฒฝ์ฐ. ์ด๊ธฐํ ์ค์ ํธ์ถํ๊ณ ์ถ์ง๋ ์์ง๋ง ์ฌ์ ํ ๋ ๋๋ฌ์ ํต์ ํด์ผ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์๋ฐฉํฅ ๋งคํ์ ์ง์ํฉ๋๋ค. ์ฆ ์ํธ๋ฆฌ. ํ
์คํธ ๊ฐ์ด ํญ๋ชฉ์ ์์ ๋. IEntry์๋ string Text {get;set;}
๊ฐ ์์ผ๋ฉฐ ๊ฐ์ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฏธ๋์ด ์์์ ๊ฒฝ์ฐ 2๊ฐ์ง ์ต์
์ด ์์ต๋๋ค. ํ๋๋ ๋จ์ํ ์์น/์๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ค์ ์ค์ ํ๋ ๊ฒ์
๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ๋์ ์ฟผ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด. ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. xplat ๋ณด๊ธฐ๋ ๋ ๋๋ฌ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. view.Renderer.NativeView as NativeMediaView
์ด์ ์ํ๋ ์์ฑ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค!
๋ค์์ ๋น๋ ์ค ์คํธ๋ฆผ์ ์ผ๋ถ ๋น๋์ค์ ๋๋ค.
@Clancey ๋ ์ฌ๊ธฐ์์ ๋ ์์ธํ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.
https://www.youtube.com/watch?v=_MGh3xipWm4
๋๋ David์ ํจ๊ป ์ฌ๊ธฐ์์ ๊ทธ๊ฒ๋ค์ ์ฝ๊ฐ ๋ง์ง๋ค.
https://www.youtube.com/watch?v=lAmwjfZY1IM
'์๋ฐฉํฅ' ์์ฑ์ ์๋ก์ด ๋ ๋๋ฌ ๋์์ธ์์ ์ด๋ป๊ฒ ์๋ํฉ๋๊น? ์๋ฅผ ๋ค์ด ์์น(TimeSpan) ์์ฑ์ด ์๋ MediaElement๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. Setter๋ ํ์ฌ ์์น๋ฅผ ์ ๋ฐ์ดํธํ๊ณ getter๋ ๊ธฐ๋ณธ ๋ฏธ๋์ด ํ๋ ์ด์ด(์: AVPlayer, MediaPlayer)์์ ํ์ฌ ์์น๋ฅผ ๊ฒ์ํฉ๋๋ค. ์ฌ๋ฆผ ๋ ๋๋ฌ๋ก ๊ฒํฐ๋ฅผ ๋งคํํ๊ธฐ ์ํ ๋์์ธ์ด ์์ต๋๊น?
์ฐ๋ฆฌ๋ ์์ง ์ด ๋ฌธ์ ๋ฅผ ์กฐ๊ธ ํด๊ฒฐํ๊ณ ์์ต๋๋ค. @Clancey๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง ActionMapper๋ ์ด์ ๋ํ ์ฐ๋ฆฌ์ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ด์์ต๋๋ค. ์? https://github.com/dotnet/maui/blob/slim-renderers/Maui.Core/PropertyMapper.cs#L91
์ ํํ. ๋ฐ๋ผ์ ActionMapper๋ SetElement ๋จ๊ณ์์ ํธ์ถ๋์ง ์๋๋ค๋ ์ ์ ์ ์ธํ๊ณ PropertyMapper์ ๋์ผํฉ๋๋ค. ๋ฐ๋ผ์ WebView, GoBack๊ณผ ๊ฐ์ ๊ฒฝ์ฐ. ์ด๊ธฐํ ์ค์ ํธ์ถํ๊ณ ์ถ์ง๋ ์์ง๋ง ์ฌ์ ํ ๋ ๋๋ฌ์ ํต์ ํด์ผ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฏธ ์๋ฐฉํฅ ๋งคํ์ ์ง์ํฉ๋๋ค. ์ฆ ์ํธ๋ฆฌ. ํ ์คํธ ๊ฐ์ด ํญ๋ชฉ์ ์์ ๋. IEntry์๋
string Text {get;set;}
๊ฐ ์์ผ๋ฉฐ ๊ฐ์ ์ค์ ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ฏธ๋์ด ์์์ ๊ฒฝ์ฐ 2๊ฐ์ง ์ต์ ์ด ์์ต๋๋ค. ํ๋๋ ๋จ์ํ ์์น/์๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ ๋ค์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค. ๋น์ ์ด ๊ทธ๊ฒ์ ๋์ ์ฟผ๋ฆฌํ๋ ๊ฒ์ผ๋ก ๋ง๋ค๊ณ ์ถ๋ค๋ฉด. ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. xplat ๋ณด๊ธฐ๋ ๋ ๋๋ฌ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.view.Renderer.NativeView as NativeMediaView
์ด์ ์ํ๋ ์์ฑ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค!
์ฌ๊ธฐ์ ๊ณ ๋ คํด์ผ ํ ๋ ๋ค๋ฅธ ์ฌํญ์ C#9์์ ์ ๊ณต๋๋ ๋ ์ฝ๋์
๋๋ค. ํน์์ฑ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ init
์์ฑ ์ ๊ทผ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ค๋ฉด ๋งคํผ๊ฐ with
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ทฐ๊ฐ ๋ ์ฝ๋์ ๋ฐ์ธ๋ฉ๋ ์ ์๊ธฐ๋ฅผ ์ง์ฌ์ผ๋ก ๋ฐ๋๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ MVVM ๋๋ ์์ MVU์ ๊ฒฝ์ฐ ํจ์ฌ ๋ ์ฌ์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ง๋ฌธ: ๊ทํ๊ฐ ๊ฒ์ํ ๋ค์ด์ด๊ทธ๋จ์๋ Windows.UI.*
์ํด ๋ ๋๋ง๋๋ Windows ์ปจํธ๋กค์ด ์์ง๋ง ์ ๊ฐ ์ดํดํ๋ ๋ฐ์ ๊ฐ์ด ์ด๋ ํ์ฌ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ์
๋ฐ์ดํธ๊ฐ ํ์๋์ง ์์ต๋๋ค. ์ ์ฐฝํ ๋์์ธ ๋ ๋๋ง์ ๋ํ ๋ชจ๋ ๊ฐ์ ์ฌํญ์ WinUI ํ๋ก์ ํธ์ ์ผ๋ถ๋ก Microsoft.UI.*
์์ ์งํ๋ฉ๋๋ค. ์ด์ ๋ํ ์๊ฒฌ์ ๋ง์ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ค์ดํฐ๋ธ ์ปจํธ๋กค์ ๋งคํํ๋ ๊ฒ์ ํฐ ์ค์๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ Xamarin.Forms์ ๋์ฐํ ๋ถ๋ถ์ ๋๋ค. ๋ ํนํ๊ณ ์๋ฆ๋ค์ด ๋ ์ด์์์ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ๋๋ง์ ์ฌ์ฉํ์ฌ ๋ชจ์ ์์ด WPF ๋ฐ Flutter ์ปจํธ๋กค์ ๊ฐ๋ ๊ณผ ์ ๊ทผ ๋ฐฉ์์ ๋ฐ๋ผ์ผ ํ์ต๋๋ค. OpenGL / DirectX / Metal์ ์ฌ์ฉํ์ฌ C ++๋ก ์์ฑ๋ ์์ง์ ์ง์์ ์ผ๋ก ๋ณํํ๋ ํ๋ซํผ ๊ตฌ์กฐ์ ์์กดํ์ง ์์ ๋ฟ๋ง ์๋๋ผ ์ด์์ฑ, ์ฑ๋ฅ ๋ฐ ์ ์ฐ์ฑ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ ์๋ก์ด ์ํคํ ์ฒ/์์ฑ ๋งคํผ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ ๋๋ค. ๋งคํ ๋์์ด ์๋๋๋ค. ๋ค์ ํ ๋ฒ ๋ง์๋๋ฆฝ๋๋ค. ๋ค์ดํฐ๋ธ๋ฅผ ์ํ ์ฌ๋ฆผ ๋ ๋ ์ํคํ ์ฒ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฆฐ ์ปจํธ๋กค ์ ๊ทผ ๋ฐฉ์์ ์ ๋ ํ์ง ์์ ๊ฒ์ด๋ผ๋ ์๋ฏธ๊ฐ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ค์ดํฐ๋ธ ๋ ๋น๋ค์ดํฐ๋ธ ์ปจํธ๋กค์ ํผํฉํ์ฌ ์ผ์น์ํฌ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ์์ํ๊ฒ ๊ทธ๋ ค์ง๋ฉด ๋ ์ด๋ ต์ต๋๋ค. ๋๋ก์ ๋ ์ด์ด๋ฅผ ํฌํจํ์ฌ ๋์ผํ ์ฌ๋ฆผ ๋ ๋๋ฌ ์ํคํ ์ฒ๋ฅผ ๋ฐ๋ฅด๋ Skia ๊ธฐ๋ฐ ์ปจํธ๋กค์ ๋ํ ์์ ์ ๊ณ์ํ ๊ณํ์ ๋๋ค. https://github.com/Clancey/Comet/tree/dev/src/Comet.Skia/Handlers.
์ด ๋ ๋๋ฌ์ ๋ํ ๋์ 2ยข(๋ด๊ฐ ์์ ํ ์ดํดํ์ง ๋ชปํ๋ค๋ ๊ฒ์ ์ธ์ ํฉ๋๋ค, TBH):
๋์ผํ ์ปจํธ๋กค ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ซํผ์์ ๋ ๋๋ง๋ ์ปจํธ๋กค(์: UIButton ๋ํ)๊ณผ ๊ฒ๋ณด๊ธฐ ์๋ ์ปจํธ๋กค(WPF๋ก ํ์)์ ๋ชจ๋ ๊ตฌํํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์์ต๋๋ค. ์์งํ ๋งํด์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. Maui Button ํด๋์ค๊ฐ ์ปจํธ๋กค ํ ํ๋ฆฟ์ ์ฌ์ฉํ๋๋ก ํ๊ณ ์ฌ๊ธฐ์์ ๋ชจ๋ ํ๋ซํผ๋ณ ๋ ๋๋ฌ ์ฝ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ButtonRenderer๊ฐ ํฌํจ๋ Button์ ๋ํ ๊ธฐ๋ณธ ํ ํ๋ฆฟ์ ์ ๊ณตํฉ๋๋ค. ButtonRenderer๋ ๊ฐ UI ํดํท์ ๋ํ ํ๋ซํผ๋ณ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Cocoa/UIKit/UWP/etc์ ํต์ ํ๊ณ ์ฑ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ Button ํด๋์ค๋ ๋จ์ํ ์์ฑ์ ์ ๋ฌํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฌ์ฉ์ ์ ์ ๊ทธ๋ฆฐ ๋ฒํผ์ ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ WPF์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ButtonRenderer ๋์ ํ ํ๋ฆฟ์ ์ฌ์ ์ํ๊ณ ๋๋ก์ ํด๋์ค(์ด๋ค ๋ชจ์์ด๋ ์ง ๊ฐ์)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. WPF๋ฅผ ์ดํดํ๋ ๊ฒ๋งํผ Xamarin.Forms๋ฅผ ์ดํดํ๋ ๋ฐ ์๊ฐ์ ๋ค์ด์ง ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ์ค๋๋ ๋ง์ฐ์ด์์ ์ด๋ฏธ ๊ฐ๋ฅํ์ง(๋๋ ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ์ง) ์์งํ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋ค๊ฐ ์๊ฐํ๋ ๊ฒ์ ๋งํด์ค!
์ฌ๋ฆผ ๋ ๋๋ฌ๊ฐ ๋ค๋ฅธ ์ฑ ๋ชจ๋ธ(MVVM, MVU ๋ฑ)์ ๋ํด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ดํดํ๋ ค๊ณ ํฉ๋๋ค.
์ด๊ธฐ ๋ค์ด์ด๊ทธ๋จ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฑ ๋ชจ๋ธ์ ์์ฒด ๋ ๋๋ฌ ์ธํธ๊ฐ ์์์ ์๋ ค ์ฃผ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ์๊ฐ์๋ ๋ ๋๋ง ์ ํ(์: XF์ ๊ฐ์ ๊ธฐ๋ณธ ์ปจํธ๋กค์ผ๋ก ๋ ๋๋ง, ์บ๋ฒ์ค๋ก ๋ ๋๋ง ๋ฑ)๋น ํ๋์ ๋ ๋๋ฌ ์ธํธ๊ฐ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ ๋๋ฌ๋ ์ฑ ๋ชจ๋ธ์ ์ธ์ํ ํ์๊ฐ ์์ผ๋ฉฐ ๊ธฐ๋ณธ ์ปจํธ๋กค์ ์ฌ๋ฐ๋ฅธ ์
๋ฐ์ดํธ๋ฅผ ์ ์ฉํ ์ ์๋๋ก ์ด๋ค ๊ฐ์ด ์ด๋ค ์์ฑ์ ๋งคํ๋๋์ง๋ง ์๋ฉด ๋ฉ๋๋ค.
IButton
๊ฐ ์ฑ ๋ชจ๋ธ์ ๋ํด ๋ค๋ฅด๊ฒ ๊ตฌํ๋๋ฉฐ ํด๋น ๋ ๋๋ฌ์ ๋งคํ๋ ๊ธฐ๋ฅ์ ํธ์ถํฉ๋๋ค.
Fabulous์ ๊ฐ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ ๊ฐ ํ๋ซํผ์ ๊ฐ ์ปจํธ๋กค์ ๋ํ ๋ชจ๋ ์ ์ ํ ๋ ๋๋ฌ๋ฅผ ๊ตฌํํ๋(๋ชจ๋ ๋ฒ๊ทธ์ ํจ๊ป) Microsoft์ ์ธ๋ ฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ค์ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์์ ์ ์ ์ด ์ธํฐํ์ด์ค( IButton
)๊ฐ ๋ ๋๋ฌ์์ ์ฌ์ฉํ๋ ค๋ฉด getter ์ ์ฉ์ด์ด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
๋ ๋๋ฌ๋ ๊ฐ์ ์ค์ ํ์ง ์์ผ๋ฉฐ ๊ฐ ์ฑ ๋ชจ๋ธ์ ์ปจํธ๋กค์ ๋ค๋ฅด๊ฒ ํ์ฑํฉ๋๋ค(BindableProperty, BindingObject ๋ฑ).
์๋ฅผ ๋ค์ด Fabulous๋ ๋ณ๊ฒฝํ ์ ์๋ ๋ทฐ๋ฅผ ๊ฐ์ต๋๋ค. ๋ด๋ถ์ ์ผ๋ก๋ง IButton
์ ์ธ์คํด์ค๋ก ๋ณํ์ ์ค์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ์์ผ๋ก Fabulous๋ IButton
์ธํฐํ์ด์ค๋ฅผ ๋ด๋ถ ์ฌ์ ์ ํตํด ๋
์ ๋ณด๊ธฐ๋ก ์ง์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ ๋๋ฌ๊ฐ ์๋ํ ์ ์์ต๋๋ค.
// This is the type used by our users, sort of a Builder that return a new instance each time
// and append the set value to an internal list
public struct Button
{
public Button Text(string value) => (...);
internal ReadOnlyDictionary<string, obj> Build() { ... }
}
// This will be an implementation of IButton, hidden from our users
internal class FabulousButton : IButton
{
private ReadOnlyDictionary<string, obj> _properties;
FabulousButton(ReadOnlyDictionary<string, obj> properties)
{
_properties = properties;
}
void Update(ReadOnlyDictionary<string, obj> properties)
{
var previousProperties = _properties;
_properties = properties;
// Diffing of the 2 dictionaries to determine what changed
// and which mapped functions inside the renderer should be called
(...)
}
public string Text => _properties["Text"];
}
@TimLariviere ๋น์ ์ด ๋งํ ๋ชจ๋ ๊ฒ์ด ์๋ ๋ฐฉ์์ ๋๋ค :-)
๊ฑฐ๊ธฐ์ ์๋ ๊ทธ๋ฆผ์ ๋ ๋๋ฌ๋งํผ ํผ๋์ค๋ฝ์ต๋๋ค.
์ด๊ฒ์์ ๋น์ ์ด ๊ฑฑ์ ํด์ผ ํ ์ ์ผํ ๋ถ๋ถ์ Fabulous Button์ด๊ณ ๊ฑฐ๊ธฐ์์ ์ฐ๋ฆฌ๊ฐ ์ฒ๋ฆฌํ ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๋๋ค.
๋๋ถ๋ถ์ ์ธํฐํ์ด์ค๋ ์ฝ๊ธฐ ์ ์ฉ์ ๋๋ค.
๋ฒํผ์ด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค์
๋๋ค.
https://github.com/dotnet/maui/blob/slim-renderer-samples/Maui.Core/Views/IText.cs
(๋ ๋๋ฌ์ ๊ดํ ํ) ์ค์ ๋ก ๋น์ ์๊ฒ ๋ฌ๋ ค ์๋ ๊ฒ์ IButton์ ๋ค์ ์๋นํด์ผ ํ๋ค๋ ์ ํธ๋ฅผ ๋ ๋๋ฌ์ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ด ๋ชจ๋ ๊ฒ์ BindableObject ๋ฒ์ ์์ ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์์ Renderer์ updateproperty ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค.
https://github.com/dotnet/maui/blob/slim-renderer-samples/System.Maui.Core/VisualElement.cs#L1132
(๊ณง?) @Clancey ๋ Comet์ ๊ณต๊ฐ ๋ฒ์ ์ ๊ฒ์ด๋ฏ๋ก ๊ทธ๊ฐ ์ด๋ป๊ฒ ํ๋์ง ๋ณผ ์ ์์ต๋๋ค.
๋๋ ์ฒดํฌ ์์ ํ ๊ฒ์ด๋ค
https://github.com/dotnet/maui/blob/slim-renderer-samples
์ฌ๊ธฐ์ Fabulous.Core ํค๋๋ฅผ ์ถ๊ฐํ ๋ค์ ์ธํฐํ์ด์ค์ ๊ตฌํ ์ถ๊ฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค.
@PureWeen ์ค
@PureWeen @Clancey ๋ง์ฐ์ด ํ์ด ์ด ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง๋ง ์๋ก์ด Slim ๋ ๋๋ฌ๋ ์์๋ณด๋ค ๊ตฌ์ฑ์ ์ ํธํ ์ ์์ต๋๋ค. ์์์ ์ ์ฉํ์ง๋ง ๋ถํํ๋ XF์์๋ ์ผ๋ถ ๋ ๋๋ฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋งค์ฐ ๋ณต์กํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค์์ต๋๋ค.
@PureWeen
์ด URL
https://github.com/dotnet/maui/blob/slim-renderer-samples
404๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋น๊ณต๊ฐ์ ๋๊น?
@๋๋ค
https://github.com/dotnet/maui/tree/slim-renderer-samples
@velocitysystems
๋๋ Maui ํ์ด ์ด ๋ชจ๋ ๊ฒ์ ๋ค๋ฃฐ ๊ฒ์ด๋ผ๊ณ ํ์ ํ์ง๋ง ์๋ก์ด Slim ๋ ๋๋ฌ๋ ์์๋ณด๋ค ๊ตฌ์ฑ์ ์ ํธํ ์ ์์ต๋๋ค. ์์์ ์ ์ฉํ์ง๋ง ๋ถํํ๋ XF์์๋ ์ผ๋ถ ๋ ๋๋ฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋งค์ฐ ๋ณต์กํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค์์ต๋๋ค.
๊ทธ๊ฒ์ด ๊ทธ๋ค์ด ๋ง๋ค์ด์ง๋ ๋ฐฉ์์
๋๋ค. System.Object
์์ ์ง์ ์์ํ๋ ๋งค์ฐ ์์ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ดํฐ๋ธ ์ธ๋งฅ์ด ์์ต๋๋ค.
๊ฑฐ๊ธฐ์์ ๋ชจ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ ์ ํตํด ์ ์๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ฝ๋ ์ดํฐ์ฒ๋ผ ์๋ํฉ๋๋ค.
์ถ๊ฐ ๋งคํผ๋ก ๋งคํผ๋ฅผ ์ฅ์ํ ์ ์์ผ๋ฉฐ ์์ ์ func ๋ฑ์ ์ฃผ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ์ฉ์ ์๋๋ฆฌ์ค์ 95%๊ฐ ๋งคํผ์ ๊ณ ์ ํ Func๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ชจ๋ ๋ค์ค ๋์์ด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์์์ ์ง์ ์ก์ธ์คํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
@PureWeen ์ํ์์ ์ด๋ฌํ ์ฌ๋ฆผ ๋ ๋๋ฌ์ ๊ตฌํ์ ๋ ผ์ํ๋ ๋ฐ ๊ฐ์ฅ ์ ์ ํ ์ฑ๋์ ๋ฌด์์ ๋๊น?
๋ค์๊ณผ ๊ฐ์ ์ง๋ฌธ์ด ์์ต๋๋ค.
๊ธฐ๋ณธ๊ฐ์ ์ค์ ์ง์ค์์ผ๋ก ์ ์๋ฉ๋๊น? XF์์๋ ํ์ฌ BindableProperty ํ๋๋ฅผ ์์ฑํ ๋ ์ ์๋์ง๋ง ์ฑ ๋ชจ๋ธ์ ๋ฐ๋ผ ํ์๋์ง ์์ต๋๋ค.
์ข์ ์ง๋ฌธ์ ๋๋ค. @ํด๋์ ? ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์์ง ์ ์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค. ๋ชจ๋ ๋งคํผ๊ฐ ์์ฑ์ ํ์ฌ ๊ฐ(๊ธฐ๋ณธ๊ฐ)์ผ๋ก ํธ์ถ๋๋ ์ด๊ธฐ ์ค์ ๋จ๊ณ๊ฐ ์์ง๋ง ์์ง ๊ธฐ๋ณธ๊ฐ์ ๋ํ ๊ณํ์ด ์๋์ง, ์ด๋ป๊ฒ ์ผ๋ฐํํ ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Application ํด๋์ค๋ (๋ถ๋ถ์ ์ผ๋ก) ์ธํฐํ์ด์ค๊ฐ ๋ฉ๋๊น? ๋ง์ UI ๋์(๋ฆฌ์์ค, ๋ฉ๋ด, ๋ฉ์ธ ํ์ด์ง)์ ์ ์ํ๊ณ ๋ค๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์! ์ฐ๋ฆฌ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค(๋ค์ดํฐ๋ธ ๋ฐ xplat)๋ฅผ ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ํด๋์ค๋ก ์ถ์ํ๊ธฐ๋ฅผ ํฌ๋งํฉ๋๋ค. ์ด๊ฑธ ์ ๋ฌผ์ด๋ณด๋๊ฑฐ์ผ? ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ถ๊ธํฉ๋๋ค.
์ธก์ /์ ๋ ฌ/๋ฑ์ด ์ ์ด ์ธํฐํ์ด์ค์์ ์ถ์ถ๋ฉ๋๊น? ์ฑ ๋ชจ๋ธ์ด ์ด๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌํํ๋ ๊ฒ์ ์ ๋ง ์๋ฏธ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ์์ ์์ ๊ทธ๊ฒ์ด ๊ณํ์ ๋๋ค. ์์ด๋์ด๋ ๋ชจ๋ ๋ ์ด์์ ์ฝ๋๋ฅผ ์ถ์ถํ์ฌ BindableObject/Property์ ์์กดํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก Blazor/Comet/other๋ StackLayout์ ์ฌ์ฉํ ์ ์๊ณ ๊ฒฐ๊ณผ๋ ๋์ผํฉ๋๋ค.
์ด๊ฑธ ์ ๋ฌผ์ด๋ณด๋๊ฑฐ์ผ? ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๊ถ๊ธํฉ๋๋ค.
๋๋ ์์ง ๋ด๊ฐ ๋ฌด์์ ์ํ๋์ง ์์ ํ ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๊ทธ๋ฌ๋ Fabulous์์๋ ํ์ฌ ๊ธ๋ก๋ฒ ์คํ์ผ๊ณผ ๋ฉ์ธ ๋ฉ๋ด(macOS์ ๊ฐ์)๋ฅผ ์ ์ํ๋ ๋ฐ ์ข์ ์คํ ๋ฆฌ๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ Application ํด๋์ค๋ฅผ ์ค์ค๋ก ์๋ธํด๋์คํํ ์ ์๋๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋์ Xamarin.Forms์์์ ๊ฐ์ด ๋ฆฌ์์ค/๋ฉ๋ด๋ฅผ ์ ์ํ๋๋ก ์ง์ํฉ๋๋ค.
๋ฐ๋ผ์ ์ด์์ ์ผ๋ก๋ Application์ ๋ชจ๋ UI ๊ด๋ จ ์์ฑ๋ ๋ณด๊ธฐ์ ์ผ๋ถ๊ฐ ๋๋ฏ๋ก ๋ณด๊ธฐ ๊ตฌ๋ถ ๋ ผ๋ฆฌ๋ ์ ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๊ฒ
public interface IAppRoot
{
IEnumerable<object> Resources { get; }
IMenu MainMenu { get; }
IPage MainPage { get; }
}
public class Application
{
/// Bootstrapping and other logic of MAUI
public IAppRoot Root { get; set; } // Replaces MainPage, which is typed for pages only
}
@PureWeen ๋ ๋ค๋ฅธ ์ง๋ฌธ: TextChanged
, Toggled
๋ฑ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ์ฑ
์์ ๋๊ตฌ์๊ฒ ์์ต๋๊น? ์ปจํธ๋กค ๋๋ ๋ ๋๋ฌ?
๋ค๋ฅธ ์ฑ ๋ชจ๋ธ์ ๊ตฌํ์ ํฌ๊ฒ ๋จ์ํํ ์ ์๋ค๊ณ ์๊ฐํ๋ ํ ๊ฐ์ง๋ ๋ณ๊ฒฝ์ด ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ ๋ ์ํ ๋ณ๊ฒฝ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ง ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค.
์๋ฅผ ๋ค์ด, ์ค๋ TextChanged
on Entry๋ ์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ์ธ ๋๋ MyEntry.Text = "New value";
ํ ๋ ๋ชจ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ๋ณ๊ฒฝ์ ๋ฐ์ํ๋ ๊ฒ์ ์ค์ ๋ก ์ ์ฉํ์ง ์์ผ๋ฉฐ ์ฝ๋์ ๋ํด ์ถ๋ก ํ๋ ๋ฐ ์ข์ง ์์ ์์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ํ๋ซํผ์ด ์ฝ๊ฐ์ ์ง์ฐ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ณ Fabulous๊ฐ ๋์์ฌ ๊ฐ๋ฅ์ฑ ์์ด ๋๊ธฐํ๋์ง ์๋๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ Android์์ ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ฐพ์ ์ ์ผํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ์ค์ ํ๊ธฐ ์ ์ ๋จผ์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋
์ทจ์ํ ๋ค์ ๋ค์ ๊ตฌ๋
ํ๋ ๊ฒ์
๋๋ค...
๊ถ๊ธํ ์ง๋ฌธ์ ๋๋ค. MAUI๊ฐ ์ํคํ ์ฒ์ ๊ตฌ์ ๋ฐ์ง ์๋ ๊ฒฝ์ฐ ์ปจํธ๋กค ์ด๋ฆ์ด ์ํคํ ์ฒ ์ด๋ฆ์ผ๋ก ์ง์ ๋๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์๋ฅผ ๋ค์ด ์์ ๋ค์ด์ด๊ทธ๋จ์๋ Maui๊ฐ ์์ต๋๋ค. Mvvm .ButtonRenderer.Android? @PureWeen @Clancey
XF์๋ Compressed Layouts(๋ฒ๊ทธ๊ฐ ์์)๋ผ๋ ๊ฒ์ด ์์ต๋๋ค.
MAUI์ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์ด ์์ต๋๊น?
์ด ์ค๋ ๋์์ UI๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด Flutter/Skia ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ณด๊ณ ๋๋ถ๋ถ ๋์ํฉ๋๋ค.
MAUI๊ฐ ๋ค์ดํฐ๋ธ/๋น๋ค์ดํฐ๋ธ ์ปจํธ๋กค ๋ฐ ๋ ๋๋ง์ ์ ์ฌ์ ์ผ๋ก ์ง์ํ๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ UI๋ก ์์
ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ ์น์ ์ธ ์ธก๋ฉด์์ ํ๋ ์์ํฌ๋ฅผ ํ๋ณดํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, ์ ๋ Apple์ ๋ํด ์ง์ ํ๊ณ ์์ต๋๋ค. ์ต์ ๋ด์ค๋ก ์ธํด ์ด๋ค ์์ ์์ Flutter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด '๋ฌธ์ํ๋์ง ์์/์ ํ๋ ๊ธฐ๋ฅ์ ์
์ฉ'ํ๊ฑฐ๋ 'Apple UI ์ง์นจ์ ๋ฐ๋ฅด์ง ์์' ๋ฑ์ผ๋ก ๊ฐ์ฃผ๋๋๋ผ๋ ๋๋ผ์ง ์์ ๊ฒ์
๋๋ค.
์ด ์ค๋ ๋์์ UI๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด Flutter/Skia ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ณด๊ณ ๋๋ถ๋ถ ๋์ํฉ๋๋ค.
MAUI์์ ์ ์ฌ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ์ปจํธ๋กค ๋ฐ ๋ ๋๋ง์ด ์๋ ์ฌ์ฉ์ ์ง์ ์ ์ง์ํ๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ UI๋ก ์์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ ์น์ ์ธ ์ธก๋ฉด์์ ํ๋ ์์ํฌ๋ฅผ ํ๋ณดํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, ์ ๋ Apple์ ๋ํด ์ง์ ํ๊ณ ์์ต๋๋ค. ์ต์ ๋ด์ค๋ก ์ธํด ์ด๋ค ์์ ์์ Flutter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด '๋ฌธ์ํ๋์ง ์์/์ ํ๋ ๊ธฐ๋ฅ์ ์ ์ฉ'ํ๊ฑฐ๋ 'Apple UI ์ง์นจ์ ๋ฐ๋ฅด์ง ์์' ๋ฑ์ผ๋ก ๊ฐ์ฃผ๋๋๋ผ๋ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค.
MAUI๊ฐ ์น(์: Flitter)์ ์ง์ํ๋ ๊ฒฝ์ฐ ํญ์ WebView๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
์ผ๋ถ ๋๊ธฐ์
์ WebView๋ฅผ ํตํด์๋ง AppStore์ ํ์๋๊ธฐ ๋๋ฌธ์ Apple์ WebView ๊ธฐ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐํ ์ฐจ๋จํ์ง ์์ ๊ฒ์
๋๋ค.
์ด ์ค๋ ๋์์ UI๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด Flutter/Skia ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ํด ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ณด๊ณ ๋๋ถ๋ถ ๋์ํฉ๋๋ค.
MAUI์์ ์ ์ฌ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ์ปจํธ๋กค ๋ฐ ๋ ๋๋ง์ด ์๋ ์ฌ์ฉ์ ์ง์ ์ ์ง์ํ๊ฒ ๋์ด ์ ๋ง ๊ธฐ์ฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ธฐ๋ณธ UI๋ก ์์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ์ ์น์ ์ธ ์ธก๋ฉด์์ ํ๋ ์์ํฌ๋ฅผ ํ๋ณดํ๋ค๊ณ ๋งํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค, ์ ๋ Apple์ ๋ํด ์ง์ ํ๊ณ ์์ต๋๋ค. ์ต์ ๋ด์ค๋ก ์ธํด ์ด๋ค ์์ ์์ Flutter๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด '๋ฌธ์ํ๋์ง ์์/์ ํ๋ ๊ธฐ๋ฅ์ ์ ์ฉ'ํ๊ฑฐ๋ 'Apple UI ์ง์นจ์ ๋ฐ๋ฅด์ง ์์' ๋ฑ์ผ๋ก ๊ฐ์ฃผ๋๋๋ผ๋ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค.MAUI๊ฐ ์น(์: Flitter)์ ์ง์ํ๋ ๊ฒฝ์ฐ ํญ์ WebView๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
์ผ๋ถ ๋๊ธฐ์ ์ WebView๋ฅผ ํตํด์๋ง AppStore์ ํ์๋๊ธฐ ๋๋ฌธ์ Apple์ WebView ๊ธฐ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐํ ์ฐจ๋จํ์ง ์์ ๊ฒ์ ๋๋ค.
๊ทธ๊ฒ์ ์ด๋ฏธ ์ง์นจ์ ์๋ฐฐ๋ฉ๋๋ค - https://developer.apple.com/app-store/review/guidelines/#minimum -functionity
MAUI์ ์ด ์์ ํ ์๋ก์ด ์ธ๊ณ๊ฐ ๋ฌด์์ธ์ง ๋ค์ ํ ๋ฒ ์ฝ๊ณ ๋ค ๋ฒ์งธ๋ก ์ฝ์ ํ, ๊ฑฐ๋ฃฉํ ๋ชจ๋ ์ฌ๋์ ์ฌ๋์ ์ํด ์ค์ ๋ก SKIA ๋๋ ๊ธฐํ ๋ค์ค ํ๋ซํผ ๋ ๋๋ง ์์ง๊ณผ ๊ฐ์ ๋ ๋๋ง ์์ง์ ์ด๋์์๋ ์ฌ์ฉํ๊ณ ์ฌ์ฉ์ ์ ์๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค. Xamarin Forms์ ๊ฐ์ ๊ฐ ํ๋ซํผ์ UI๋ ๋ง์น ์ง์ฅ์ ์ผ๊ณฑ ๋ฒ์งธ ์ํด์์ ๋ง๋ ์๋ฃจ์ ์ฒ๋ผ ์ค๋๋๊ณ ์ค๋๋ ๋๋์ ๋๋ค.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ด ํ์์ธ ๊ฒฝ์ฐ ์๋กญ๊ณ ํ๋์ ์ธ ๋ ๋ ์ง์์ ์ด์ ๊ตฌ์ฑ ์์๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ๋ฒ์ผ๋ก "๊ทธ๋ฅ" ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ค๋ฅธ ํ๋ซํผ์์ ์ด์ ๋ํ ๊น๋ํ ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๊ฐ์ฅ ์ต๊ทผ์ ์ฌ์ฉํ ๊ฒ์ Unity์ UI ์์ง์ ์์ต๋๋ค. ์๋ก์ด ์ต์ UXML์๋ IMGUI ๋ ๋๊ฐ ์์ต๋๋ค.
@jackie0100
๋ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค
Xamarin Forms์ฒ๋ผ ๊ฐ ํ๋ซํผ์์ ์ฌ์ฉ์ ์ง์ UI๋ฅผ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ ์ค๋๋๊ณ ์ง์ฅ์ ์ผ๊ณฑ ๋ฒ์งธ ์ํด์์ ๋ง๋ ์๋ฃจ์ ์ธ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
๋ ๋๋ฌ ๊ตฌํ์ ๊ดํด์๋, iView๋ฅผ์ ์์ด๋์ด์ ๋ํ ์ด๋ค ๊ฒ์ ๋ค์ดํฐ๋ธ ๋ทฐ (๋์ iView๋ฅผ์ ๊ธฐ๋ณธ๋ณด๊ธฐ๊ฐ ์์ต๋๋ค)์ ๋๋ค. ์ฆ, ๊ตฌ์ฑ ๋์ ์์? ์ด๋ "์์ ์ค๋ฒํค๋"๊ฐ ์ ๋์ ์ผ๋ก ์๋ ๊ฐ์ฅ ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ์ํคํ ์ฒ๋ก ์ด์ด์ง ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์ํ ๊ธฐ๋ณธ ๋ณด๊ธฐ์ ๊ณตํต ์ธํฐํ์ด์ค๋ก ์์ ํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ iOS ๋๋์์ ๋ทฐ๋ฅผ UIView๋ก ์บ์คํ ํ๊ณ IView๊ฐ UIView์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์์(์ํ๋ ์ ํ์ด ๋ฌด์์ด๋ )์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, '๋ค์ดํฐ๋ธ ์๋ฒ ๋ฉ'์ ํ๊ณ ์ถ๋ค๋ฉด IView๊ฐ UIView์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ต๋๋ค. IView ์ค ํ๋๋ฅผ ๋ค์ดํฐ๋ธ ๋ทฐ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค. ๊ฐ์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๊ฒ์ ๋ค์ดํฐ๋ธ <-> maui ์ํธ ์ด์ฉ์ฑ์ ์ต๋ํ ํ์ฑํํ๊ณ ์ต๊ณ ์์ค์ ์ฑ๋ฅ๊ณผ ์ต์ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ง์ ํ๋กํ ํ์ดํ์ ํ๊ณ ์ถ์ ๊ธฐ๋ถ์ด ๋ญ๋๋ค. ์๋ง๋ ์ฃผ๋ง/์ ๋ ํ๋ก์ ํธ...
๋ค์ดํฐ๋ธ UI๋ก ์์ ํ๋ ๊ธฐ๋ฅ์ ์ฌ๋ฌผ์ ์ ์น์ ์ธก๋ฉด์์ ํ๋ ์์ํฌ๋ฅผ ๋ณดํธํฉ๋๋ค. [์ฌ๊ณผ]
์ด๋ ์์ ์์ Apple์ ์๋ฉด ์ ์ฑ ์์ ๊ธฐ๋ณธ UI ์์ ฏ์ ์ฌ์ฉํด์ผ ํ๋ ์๊ตฌ ์ฌํญ์ ์ญ์ ํ์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ ์ฑ ์ ๋ค์ ์ ํ์ ์ผ๋ก ๋๋๋ฆด ์ค์ง์ ์ธ ๋ฐฉ๋ฒ์ ๋ณด์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ๊ธฐ๋ณธ ์ปจํธ๋กค์ ์ฌ์ฉํ๋ _๊ฐ๋ฅ_ํ ๊ฒ์ ์ข์ ์ ํ์ ๋๋ค.
@legistek
๋ง์ ์ฌ๋๋ค์ด Skia์ ์ด๊ดํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ข์ ๋ ๋๋ง ์ฌ์์ ๋ ๋๋ง ์์ง๊ณผ ๋ฌด๊ดํฉ๋๋ค...
"๋ถ๊ด๋ก "์ด๋ผ๋ ๊ฒ์ ์ ์ ์ผ๋ก ๋์ํ์ง๋ง OpenGL/Metal/Vulkan/์ ์์ค ๋ ๋๋ง ์์ง์ผ๋ก ์ง์ ์ด๋ํ๋ ๊ฒฝ์ฐ ๋ํํ UI๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํด ๊ตฌํํด์ผ ํ๋ ์ธ๋ถ ์ฌํญ์ด _๋ง์_ ์์ต๋๋ค. ์ฌ๋๋ค์ Skia๊ฐ ์ฑ์ UI ๋ฌธ์ ์ ์ค์ ๋ ๋๋ง ์์ง ์ฌ์ด์ ํจ๊ณผ์ ์ธ _์ค๊ฐ ๊ณ์ธต_์ด๊ธฐ ๋๋ฌธ์ Skia์ ์ง์ฐฉํฉ๋๋ค. Skia๋ ๋ฒ ์ด ๋ฉํ๋ง ์๋ค๋ฉด ์ค๊ณ ๋ฐ ๊ตฌํํด์ผ ํ๋ ๊ฒ์ _๋ง์_์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ์ํ์ ์ฌ๋ฐ๋ช ํ ์ด์ ๊ฐ ์์ต๋๋ค. _only_ ๋์์ด ๋์ด์๋ ์ ๋์ง๋ง ๋งค์ฐ ๊ฐ์น ์๊ณ ์ฑ์ํ ๋์์ด๋ฏ๋ก OpenGL์์ Vulkan์ผ๋ก ํจ์ฌ ์ฝ๊ฒ ์ด๋ํ ์ ์์ต๋๋ค.
๋ํ Skia๋ฅผ ๋์์ผ๋ก ํ๋ ๊ฒ์ด Xamarin Forms์์ ํ๋ซํผ ๊ฐ ์์ ฏ๊ณผ ๊ธฐ๋ณธ ์์ ฏ์ด๋ผ๋ ๋ ๊ฐ์ ๋ณ๋ ฌ ์์ ฏ ๊ณ์ธต์ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ฒ๊ฑฐ๋กญ์ง ์์๊น ์๊ฐํฉ๋๋ค.
Skia๋ .Net Maui๊ฐ ๋ธ๋ผ์ฐ์ ์์ ๊ณ ์ฑ๋ฅ์ ๋ฐํํ๋ ๋ ์ ์๋น๊ธธ ์๋ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง, ๋ ๋๋ง์ ๋ฎ์ ์์ค์์ ๊ตฌ์ถํ๋ ๋์ ์ ์ ํ ์ค๊ฐ ์์ค ์ถ์ํ์์ ์์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ํฐ ์น๋ฆฌ๊ฐ ๋ ๊ฒ์ ๋๋ค.
์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ, ์์ง ๋ง์ธ์.
https://github.com/dotnet/maui/discussions/103
์ต๊ทผ ๋ง์ฐ์ด ๋น๋์ค๋ฅผ ๋ณธ ๊ฒฐ๊ณผ, ๋ด๊ฐ ์ค์ํ์ง ์๋ ํ ํ๋ซํผ ๋ ๋ฆฝ ์ธก๋ฉด์์ ์ํ๋ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ฒ๋ ์ด๋๋ ๋ค์ดํฐ๋ธ ์ปจํธ๋กค๊ณผ ํจ๊ป ๋ ์คํ์ผ์ด ์ง์ ๋ ์ปจํธ๋กค์ ๊ฐ๋ ๊ฒฝํฅ์ด ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ skia์ด๋ ๋ค์ดํฐ๋ธ ์บ๋ฒ์ค ๋๋ก์์ ๋ํ ์ผ์ข ์ ๋ฐฐ์น interop์ด๋ ์ด ์ ๊ทผ ๋ฐฉ์์ด ์ถ๊ตฌ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค! XF ํ๋ซํผ ๋ ๋๋ฌ ๋ชจ๋ธ์ ํญ์ ์์ด๋ฌ๋ํ๊ฒ๋ ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉ๋๋ Microsoft UI ํ๋ซํผ์ ๊ฐ์ฅ ํฐ ํผํด๋ฅผ ์ ํ์ต๋๋ค.
๋ํ ์ปจํธ๋กค์ด ๋ค์ดํฐ๋ธ ๊ตฌ์ฑ ์์๋ฅผ ๋ช ์์ ์ผ๋ก ๊ฐ์ง ์๋๋ก ํ๊ณ ๋ ์ด์์ ํฉ์ฑ๊ธฐ๊ฐ ์ด๋ฅผ ๊ฐ์งํ ์ ์๋ ๊ธฐ๋ฅ์ ์ด์ด ๋ก๋๋ค. ๊ทธ๋ฌ๋ฉด ์์ฑ๋ ๋ค์ดํฐ๋ธ ๋ทฐ๊ฐ ์๋์ผ๋ก ์ถ์๋ ์ ์์ต๋๋ค(์ฆ, ์ปจํ ์ด๋์ ๋ชจ๋ ์ปจํธ๋กค์ด skia์ ๊ฒฝ์ฐ ์ปจํ ์ด๋๋ฅผ SkView๋ก ๋ง๋ค๊ณ ๋ ์ด๋ธ ์์ ์ปจํธ๋กค์์ ๊ทธ๋ฆฌ๊ธฐ ์์ ์ ํธ์ถํ ์ ์์ต๋๋ค.
I do not understand what a renderer is.
If the program for absorbing the visual differences of the target is called a renderer, it should be absorbed by Xamarin and MAUI altogether. If not, I think it 's an unfinished Xamarin and MAUI. And it will never be completed.
I think application programming should be more independent of the differences in the target environment.
๋ ๋๋ฌ๋ผ๋ ๊ฒ์ด ์ดํดํ ์ ์์ต๋๋ค.
๋์์ ๋น์ฃผ์ผ์ ๋ํ ์ฐจ์ด๋ฅผ ํก์ํ๊ธฐ์ํ ํ๋ก๊ทธ๋จ์ ๋ ๋๋ฌ๋ผ๊ณ ํ๋ค๋ฉด, ๊ทธ๊ฒ์ Xamarin๊ณผ MAUI์ด ๋ชจ๋ ํก์ํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ๋ฉด ๊ทธ๊ฒ์ Xamarin๋ MAUI๋ ๋ฏธ์์ฑ์ด๋ค๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์์ํ ์์ฑํ๋ ๊ฒ์ ์์ ๊ฒ์
๋๋ค.
์์ฉ ํ๋ก๊ทธ๋๋ฐ์ ๋ ๋์ ํ๊ฒฝ์ ์ฐจ์ด์์ ๋
๋ฆฝ ํ ์ ์๋๋กํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๋ค ๊ฒฝ์ฐ์๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ค๊ณ ํ์ง ๋ง์ญ์์ค. ์ด๊ฒ์ ์๋ก์ด ๊ฒ์ ๋๋ค. XF์ ํธํ๋ ํ์๋ ์์ต๋๋ค. ๋น์ ์ ๋ ๋์ ๊ฒ์ ๋ง๋ค ์ ์์ต๋๋ค.