App 에서 위치 정보를 사용하는 경우

사용자가 위치 허용을 하지 않았을때

Android 는 앱을 재시작하게하여 다시 권한을 물어 다시 권한을 허용할수 있습니다.

 

하지만 iOS 는 앱을 재시작하더라도 권한을 묻는화면이 뜨지않고

셋팅창에서 앱을 눌러 직접 위치 허용을 해줘야합니다.

 

이때 코드단에서 셋팅창으로 이동하고 싶을때 아래 코드를 사용합니다.

 

DependencyService 를 이용하여

 

아래 처럼 코드하면 앱 셋팅창이 뜨게됩니다.

 

 

 

            if (!CLLocationManager.LocationServicesEnabled)

            {

                if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))

                {

                    UIApplication.SharedApplication.OpenUrl(new NSUrl("App-Prefs:root=General"));

                }

                else

                {

                    UIApplication.SharedApplication.OpenUrl(new NSUrl("prefs:root=General"));

                }

            }

            else if (CLLocationManager.Status == CLAuthorizationStatus.Denied ||

                     CLLocationManager.Status == CLAuthorizationStatus.NotDetermined ||

                     CLLocationManager.Status == CLAuthorizationStatus.Restricted)

            {

                UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));

            }

 

 

 

 

 

Image 를 원형으로 잘라 보이게 하고 싶을때는

Frame 로 감싸서 만들면 된다.


아래는 xaml 단 코드 예시이다.

<Frame 

    Margin="0" 

    Padding="0" 

    CornerRadius="30" 

    WidthRequest="60" 

    HeightRequest="60" 

    BackgroundColor="Transparent" 

    HasShadow="False" 

    IsClippedToBounds="True">

    <Image x:Name="simpleOrder2Image" Source="coffee.png"/>

</Frame>


여기서 유의할건 Frame 에 IsClippedToBounds="True" 를 반드시 설정해야한다는것이고

Xamarin.Forms 4.8.0 이어야 iOS 에서도 정상적으로 잘려서 보이게된다.

4.7.0 이하 버전에서는 iOS 에서 이미지가 잘려서 원형으로 나타나지 않는다. 


이는 버그로 수정되어 업데이트 된지 얼마되지 않었다.

https://github.com/xamarin/Xamarin.Forms/pull/11129



자마린에서 기본 폰트가 아닌 다른 폰트를 사용하는 방법입니다.

 

우선 폰트를 다운 받습니다.

전 타이포_어울림체를 다운받았습니다.(무료)

 

폰트파일을 아래처럼 위치시킵니다.

(폴더구성은 다르게 해도 상관없습니다.)

 

 

각 폰트 속성에서 "포함리소스"(Embedded Resource) 를 선택합니다.

 

 

이제 준비는 끝났습니다.

App.xaml.cs 로 들어가 아래 처럼 namespace 위쪽에 assembly 를 정의합니다.

(참고로  Xamarin.forms  구버전이면 동작하지 않습니다.)

 

[assembly: ExportFont("Typo_EoulrimL.ttf", Alias = "RegularFont")]

[assembly: ExportFont("Typo_EoulrimM.ttf", Alias = "MediumFont")]

[assembly: ExportFont("Typo_EoulrimB.ttf", Alias = "BoldFont")]

 

 

 

 

이제 xaml 단에서 아래처럼 위에서 정의한 Alias 로 FontFamily 에 지정해서 쓰면됩니다.

(여러가지 방법이 있지만 이 방법이 저한테는 가장 간단한거 같습니다.)

 

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

             xmlns:local="clr-namespace:FontXam"

             x:Class="FontXam.MainPage">

 

    <StackLayout>

        <Label Text="안녕하세요(기본)" FontSize="20"

           HorizontalOptions="Center"

           VerticalOptions="CenterAndExpand" />

        <Label Text="안녕하세요(BoldFont)"

           HorizontalOptions="Center" FontSize="20"

               FontFamily="BoldFont"

           VerticalOptions="CenterAndExpand" />

        <Label Text="안녕하세요(MediumFont)"

           HorizontalOptions="Center" FontSize="20"

               FontFamily="MediumFont"

           VerticalOptions="CenterAndExpand" />

        <Label Text="안녕하세요(RegularFont)"

           HorizontalOptions="Center" FontSize="20"

               FontFamily="RegularFont"

           VerticalOptions="CenterAndExpand" />

    </StackLayout>

 

</ContentPage>

 

 

(결과)

iOS

 

 

Android

 

소스

https://github.com/kei-soft/FontXam

 

 

 

iOS 에서 SafeArea 를 지정 하면

상단과 하단에 영역이 생기면서 그쪽에는 앱구동 화면이 표시되지 않는다

하지만 하단의 영역은 살려두고 싶을때가 있다. 

이때는 OnAppearing() 에 아래처럼 코딩하면 하단의 영역을 살려 

앱구동화면이 하단에도 문제 없이 표시된다.


protected override void OnAppearing()

{

    base.OnAppearing();

    var safeInsets = On<iOS>().SafeAreaInsets();

    safeInsets.Bottom = 0;

    Padding = safeInsets;

}




Rg.Plugins.Popup 을 이용해서 팝업을 호출한 경우 Back  버튼이나 팝업을 벗어난 화면을 터치한 경우

팝업이 닫히게 되는데 이를 막기 위해서 코드단에 아래와 같은 코드를 넣으면 된다.


CloseWhenBackgroundIsClicked = false;

하단에 메뉴가 있고 배경이 여러이미지로 슬라이딩되면서 변경되는 화면을 구성하는 방법을 소개한다.


우선 Grid 를 배치하고 Grid 안으로 CarouselView 를 위치하고 좌측 상단에 로고 이미지를

하단에는 메뉴 아이콘을 배치했으며 이미지가 가로로 스크롤이 되도록 CarouselView 의  ItemsLayout 속성을 "HorizontalList" 으로 설정한다.

<?xml version="1.0" encoding="utf-8" ?>

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"

             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"

             xmlns:d="http://xamarin.com/schemas/2014/forms/design"

             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

             mc:Ignorable="d"

             x:Class="SlideImage.MainPage">


    <StackLayout Margin="0" Padding="0" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" BackgroundColor="Black">

        <Grid HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Margin="0" Padding="0" ColumnSpacing="0" RowSpacing="0" BackgroundColor="White">

            <CarouselView  x:Name="mainView" ItemsLayout="HorizontalList" Margin="0" BackgroundColor="LightYellow" HorizontalScrollBarVisibility="Always">

                <CarouselView.ItemTemplate>

                    <DataTemplate>

                        <Image Source="{Binding ImageSrc}" Aspect="Fill"/>

                    </DataTemplate>

                </CarouselView.ItemTemplate> 

            </CarouselView>


            <Image Source="keisoft_textlogo.png" WidthRequest="100" HeightRequest="30" VerticalOptions="Start" HorizontalOptions="Start" Margin="10,0,0,0"/>


            <StackLayout VerticalOptions="End" Padding="0,0,0,20" HorizontalOptions="Center" Orientation="Horizontal" Spacing="20">

                <Image Source="main_store.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="StoreButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_menu.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="MenuButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_order.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="CartButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

                <Image Source="main_member.png" WidthRequest="60" HeightRequest="60" >

                    <Image.GestureRecognizers>

                        <TapGestureRecognizer Tapped="PersonButton_Clicked"></TapGestureRecognizer>

                    </Image.GestureRecognizers>

                </Image>

            </StackLayout>

        </Grid>

    </StackLayout>

</ContentPage>


여기에 일정 시간 간격으로 이미지가 자동으로 스크롤이 되도록 Timer 를 이용해 처리하면 아래 와 같은 화면이 완성된다.

Device.StartTimer(TimeSpan.FromSeconds(3), (Func<bool>)(() =>
{
    this.mainView.Position = (this.mainView.Position + 1) % 3;
    return true;
}));


자동으로 가로로 스크롤 되며 터치로도 슬라이드 동작을 하면 스크롤 된다.


* 이미지는 저작권이 있으므로 마음대로 쓰면 안됨.


소스

https://github.com/kei-soft/Slide-Image

iOS 프로젝트를 정리하고 재 빌드하면 된다. 끝.

도대체 왜 이런건지 알수가 없네..;;

윈도우에서 작업하던 소스를 갑사에서 mac 에서 소스를 열어서 테스트 하는데
이미지 탭한 경우 이벤트 발생이 안되는 현상 발생되었다

일단 결론부터 말하면 원인은 4월2일 xCode 11.4 로 업데이트 되었는데 
이전에 배포되었던 Xamarin.iOS 13.16 버전이 문제가 있어 이미지 탭한 경우 
탭 이벤트가 발생안되는 현상이었다.

[아래 링크 참고 (모든 탭 이벤트 먹통됨)]

언제인지 모르겠으나 이후 MS 에서 문제점을 알고 버그 픽스 버전을 출시예정이라고 한다.
(현시점 2주안에 해결해 준다고 하는데.....)

Xamarin.iOS 이전 버전을 설치하여 해결가능하다고 하여 아래링크의 pkg 를 받아 설치해보았다.

설치하고 정상동작 되는 걸 확인.


윈도우에서 개발을 하여 테스트를 하고 있었는데 
윈도우에서 비쥬얼 스튜디오를 이용해 작업하는경우 mac 연결 시
자동으로 Xamain.iOS 버전을 13.16.0.11 을 설치했었는데 그땐 에뮬 동작이 제대로 동작된다.;
하지만 iOS 에서 솔루션 열면 또 안되는.. 머 이런 .

하필 갑한테 보여주는날.. ㅜㅠ

결론 
이전버전으로 돌리거나 
좀 기다렸다가 최신으로 업데이트 받으면 된다.


* 추가

mac 에서는 preview 버전 13.18 을 설치하면 정상 동작 된다고 한다.

아래는 주문 이력 화면 예시로 

CollectionView 에서 Header 가 있는 경우 처리하는 방법입니다.

        <CollectionView
                x:Name="historyCollectionView"
                Margin="5"
                SelectionMode="Single"
                EmptyView="주문이력이 없습니다."
                SelectionChanged="OnCollectionViewSelectionChanged" >
            <CollectionView.Header>
                <StackLayout>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="90" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="70" />
                            <ColumnDefinition Width="70" />
                        </Grid.ColumnDefinitions>
                        <Label Grid.Column="0" Text="주문일자" TextColor="Black" FontSize="15" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="1" Text="주문매장" TextColor="Black" FontSize="15" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="2" Text="주문상태" TextColor="Black" FontSize="15" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="3" Text="주문가격" TextColor="Black" FontSize="15" VerticalTextAlignment="Center" HorizontalTextAlignment="End"/>
                    </Grid>
                    <BoxView HeightRequest="1" HorizontalOptions="FillAndExpand" Color="Black"/>
                </StackLayout>
            </CollectionView.Header>
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="0,10,0,0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="90" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="70" />
                            <ColumnDefinition Width="70" />
                        </Grid.ColumnDefinitions>
                        <Label Grid.Column="0" Text="{Binding ORDER_DATE}" TextColor="Black" FontSize="12" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="1" Text="{Binding STORE_NAME}" TextColor="Black" FontSize="13" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="2" Text="{Binding ORDER_STATUS}" TextColor="Black" FontSize="12" VerticalTextAlignment="Center" HorizontalTextAlignment="Center"/>
                        <Label Grid.Column="3" Text="{Binding PRICE, StringFormat='{0:N0}'}" TextColor="#B32026" FontSize="15" VerticalTextAlignment="Center" HorizontalTextAlignment="End"/>
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>

* EmptyView 는 항목이 없는 경우 중간에 Text 로 표시가 필요할 때 사용한다.

위 내용을 데이터를 체우면 아래 처럼 표시 된다.

 

 

 

애플 개발자 계정에 아이폰 기기를 등록하는 과정을 설명합니다.


1. 앱개발자 사이트 접속 (https://developer.apple.com/account/#/welcome) 하여 Certificates, Identifiers & Profiles 선택


2. 죄측메뉴 중 Devices 메뉴 선택후 우측의 파란바탕의 + 버튼 클릭


3. Device Name 을 입력하고 DeviceID(UDID) 입력

UDID 확인은 iTune 를 연결하여 확인하거나 아래 작성글을 참고해서 폰에서도 확인 가능

(https://kjcoder.tistory.com/985)


4. Register 버튼을 클릭


5. Done 버튼 클릭하여 등록 완료


* 여기 까지만 하면 맥과 폰을 연결해도 비쥬얼 스튜디오에서 목록이 나타나지 않는다.


6. 맥과 폰을 연결하여 iTune 를 실행하여 아래처럼 화면이 뜨면 신뢰 클릭 (폰에서도 신뢰 선택)


7. 비쥬얼 스튜디오에서 기기 목록이 뜨는지 확인


+ Recent posts