Grid 에서 특정 Row 를 숨기는 방법


using System;
using System.Globalization;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Foobar.Converters
{

    public class StatusToVisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (Equals(value,null))
                return new GridLength(0);

            var status = value.ToString().ToLower();

            switch (status)
            {
                case ("active"):
                    {
                        return new GridLength(1, GridUnitType.Auto);
                    }
                default:
                    {
                        return new GridLength(0);
                    }
            }
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotSupportedException("Only one way bindings are supported with this converter");
        }}
    }
}
<Grid AbsoluteLayout.LayoutFlags="All"
      AbsoluteLayout.LayoutBounds="0,1,1,1">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="{Binding Contact.Status, Converter={convert:StatusToVisibilityConverter}}" />
.....


              <ShellContent  Title="test" >
                <ShellContent.ContentTemplate>
                    <DataTemplate>
                        <views:TestPage>
                            <x:Arguments>
                                <x:String>test</x:String>
                            </x:Arguments>
                        </views:TestPage>
                    </DataTemplate>
                </ShellContent.ContentTemplate>


위 내용을 코드로 변환하면 아래와 같습니다.

            ShellContent shellContent = new ShellContent();
            shellContent.Title = "test";
            var template = new DataTemplate(typeof(TestPage)); // 인자 없을때
            var template new DataTemplate(() => { return new TestPage("test"); }); // 인자 있을때
            shellContent.ContentTemplate = data;

ShellContent 를 동적으로 생성하면서 인자를 던지고자 할때 사용하면 유용합니다.^^


<application

    android:usesCleartextTraffic="true">

            ...

</application>```


android 의 AndroidManifest.xml 쪽에 android:usesCleartextTraffic="true" 항목을 추가해주면 된다.


Install-Package Xamarin.AndroidX.Migration -Version 1.0.0-preview06


참고

https://www.nuget.org/packages?q=Tags%3A%22AndroidX%22+Authors%3A%22Microsoft%22

https://devblogs.microsoft.com/xamarin/androidx-for-xamarin/

Picker 에서 UnderLine 제거하는 방법입니다.

BorderlessPicker.cs

namespace SuaveControls.MaterialForms
{
    public class BorderlessPicker : Picker
    {
    }
}

BorderlessPickerRenderer.cs – Android

[assembly: ExportRenderer(typeof(BorderlessPicker), typeof(BorderlessPickerRenderer))]
namespace SuaveControls.MaterialForms.Android.Renderers
{
    public class BorderlessPickerRenderer : PickerRenderer
    {
        public static void Init() { }
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
            if (e.OldElement == null)
            {
                Control.Background = null;
 
                var layoutParams = new MarginLayoutParams(Control.LayoutParameters);
                layoutParams.SetMargins(0, 0, 0, 0);
                LayoutParameters = layoutParams;
                Control.LayoutParameters = layoutParams;
                Control.SetPadding(0, 0, 0, 0);
                SetPadding(0, 0, 0, 0);
            }
        }
    }
}


BorderlessPickerRenderer.cs – iOS

[assembly: ExportRenderer(typeof(BorderlessPicker), typeof(BorderlessPickerRenderer))]
namespace SuaveControls.MaterialForms.iOS.Renderers
{
    public class BorderlessPickerRenderer : PickerRenderer
    {
        public static void Init() { }
        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
 
            Control.Layer.BorderWidth = 0;
            Control.BorderStyle = UITextBorderStyle.None;
        }
    }

}



BorderlessPickerRenderer.cs – UWP

[assembly: ExportRenderer(typeof(BorderlessPicker), typeof(BorderlessPickerRenderer))]
 
namespace SuaveControls.MaterialForms.UWP.Renderers
{
    public class BorderlessPickerRenderer : PickerRenderer
    {
        public static void Init() { }
        protected override void OnElementChanged(ElementChangedEventArgs<Picker> e)
        {
            base.OnElementChanged(e);
 
            if (Control != null)
            {
                Control.BorderThickness = new Windows.UI.Xaml.Thickness(0);
                Control.Margin = new Windows.UI.Xaml.Thickness(0);
                Control.Padding = new Windows.UI.Xaml.Thickness(0);
            }
        }
    }

}


예전에 빌드 했던 앱을 열어서 Nuget 을 모두 업데이트 했는데 

아래 처럼 에러가 발생되었다.



unable to get provider com.google.android.gms.ads.mobileadsinitprovider: java.lang.illegalstateexception


해결방법은 AndroidManifest.xml 파일에

아래처럼 AdMob 에서 할당된 앱의 고유 ID 를 넣으면 해결된다.


<application android:label="UnitConversion" android:icon="@drawable/module48">

    <meta-data

        android:name="com.google.android.gms.ads.APPLICATION_ID"

        android:value="ca-app-pub-4681470946279796~5708961527"/>

</application>


앱의 ID 는 AdMob 사이트에서 아래 처럼 확인 할 수 있다.


이전에는 저 항목이 없어도 광고 표시에 문제가 없었는데 버전업이 되면서 필수 항목으로 바뀐듯하다.



https://docs.microsoft.com/ko-kr/xamarin/get-started/tutorials/

Package Summary:

 

1 package(s) were not uploaded because they had problems:

/var/folders/n8/1kztj15176g1mt3hb4m4rr780000gn/T/BDC154E6-D0DD-43C1-84E5-8B9720D0CA85/1482499510.itmsp - Error Messages:

ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in '**.iOS.app' can't be transparent nor contain an alpha channel."

2019-10-28 01:37:31.401 altool[2620:38440] *** Error: Errors uploading 'Desktop/**.iOS.ipa': (

    "Error Domain=ITunesTransporterErrorDomain Code=-18000 \"ERROR ITMS-90717: \"Invalid App Store Icon. The App Store Icon in the asset catalog in '**QR.iOS.app' can't be transparent nor contain an alpha channel.\"\" UserInfo={NSLocalizedRecoverySuggestion=ERROR ITMS-90717: \"Invalid App Store Icon. The App Store Icon in the asset catalog in '**QR.iOS.app' can't be transparent nor contain an alpha channel.\", NSLocalizedDescription=ERROR ITMS-90717: \"Invalid App Store Icon. The App Store Icon in the asset catalog in '**QR.iOS.app' can't be transparent nor contain an alpha channel.\", NSLocalizedFailureReason=ERROR ITMS-90717: \"Invalid App Store Icon. The App Store Icon in the asset catalog in '**QR.iOS.app' can't be transparent nor contain an alpha channel.\"}"

)


앱 아이콘(AppIcon.appiconset)에 투명도가 있다면 발생되는 에러로 아이콘의 투명도를 모두 제거 하면된다.


Visual Studio 를 이용해 ipa 파일을 생성하고 Application Loader 를 이용해 

ipa 파일을 업로드 하려는데... 아무리 찾아도 보이지 않아 확인해보니

xcode 11 버전 부터 Application Loader 를 지원하지 않는다고 한다..

(맥미니를 새로 구입하면서.. 이런상황이...)


1. 앱 암호를 생성해야한다.

https://appleid.apple.com/account/manage

위 사이트로 들어가 로그인하고 보안 섹션의 앱암호 에서 암호 생성을 하고 기억한다.

(참고로 암호는 내가 지정하는것이 아니라 내가 특정 단어를 입력하면 단어 기준으로 암호가 만들어진다.)


2. 터미널을 실행히야 엡을 업로드 한다.

유틸리티에서 터미널을 실행하고


아래 명령어를 실행한다.

(바탕화면에 ipa 파일이 있다는 가정이다.)

xcrun altool --upload-app --type ios --file "Desktop/kjun.iOS.ipa" --username "ios 계정(메일)" --password "앱암호"


아래처럼 업로드 완료



  1. 사파리 앱으로 http://get.udid.io/ 에 들어갑니다.

  2. 녹색 버튼인 "Tap to find UDID" 를 클릭하시면 "Get Your UDID" 프로파일이 다운로드 되고 설정에 들어가서 프로파일을 설치합니다. 설치하시면 자동으로 해당 사이트로 방문하며 UDID 정보가 나옵니다.


+ Recent posts