개발

iOS Widget Extension 각 항목별 터치 이벤트 구성하기

소소ing 2020. 11. 19. 18:08
반응형

해당 글에서 코드 부분은 파란색으로 표기 됩니다.

해당 글에서 중요 부분은 붉은색으로 표기 됩니다.

 

 

iOS Widget Extension에 대한 기본 정보는 아래 링크에서 확인이 가능하다.

Widget Extension에 대한 전반적인 기본 정보를 알고 싶을 경우 아래 글이 도움이 될듯 하다.

 

iOS Widget 구성을 위한 Widget Extension 기본부분 살펴보기

해당 글에서 코드 부분은 파란색으로 표기 됩니다. 해당 글에서 중요 부분은 붉은색으로 표기 됩니다. ​ iOS14 에서 새롭게 추가된 Widget을 구성하려면 Widget Extension을 구성하여야 한다. 새롭게

sosoingkr.tistory.com

iOS Widget Extension에서 URL 이미지를 로딩하고 싶을 경우 아래 글을 참고하자

 

iOS Widget Extension에서 URL 이미지 로딩 방법!?

해당 글에서 코드 부분은 파란색으로 표기 됩니다. 해당 글에서 중요 부분은 붉은색으로 표기 됩니다. iOS Widget Extension에 대한 기본 정보는 아래 링크에서 확인이 가능하다. Widget Extension에 대한

sosoingkr.tistory.com

 

 

iOS Widget Extension으로 위젯을 구성하게 되면, 위젯을 클릭 할때 기본적으로 앱이 실행되게 된다. 

이 액션을 변경하고자 할때, 또는 위젯의 요소별로 다른 이벤트를 주고자 할때 아래 방법을 사용하면 된다.

(추가적으로 Widget Extension에서는 Button에 대한 이벤트를 수신할 수 없기 때문에 아래 방법으로 대체가 가능하다.)

 

 

방법은 Link를 사용하는 것이다. 그럼 아래 예시 코드를 살펴보자 

참고:  Widget Extension의 화면 구성은 SwiftUI만 지원된다.

// Ex)

// 1. HStack 안 VStack으로 4개의 항목이 존재할때 각 항목 마다 버튼을 구성한다고 가정한다. 

HStack {

    Spacer()

    VStack {

        Image("sample")

        Text("TEST")

    }

    Spacer()

    VStack {

        Image("sample")

        Text("TEST")

    }

    Spacer()

    VStack {

        Image("sample")

        Text("TEST")

    }

    Spacer()

    VStack {

        Image("sample")

        Text("TEST")

    }

    Spacer()

}

 

// 2. VStack으로 묶여 있다고 가정할 경우 VStack을 Link로 아래와 같이 감싸게 한다.

// - Link로 감쌀 경우 앱으로 전달할 링크를 전달한다. 

// - 여기서는 myWidget으로 정의 했다. 

HStack {

    Spacer()

    Link(destination: URL(string: "myWidget://widgetaction?parm1=data1")!) {

        VStack {

            Image("sample")

            Text("TEST")

        }

    }

    Spacer()

    Link(destination: URL(string: "myWidget://widgetaction?parm1=data2")!) {

        VStack {

            Image("sample")

            Text("TEST")

        }

    }

    Spacer()

    Link(destination: URL(string: "myWidget://widgetaction?parm1=data2")!) {

        VStack {

            Image("sample")

            Text("TEST")

        }

    }

    Spacer()

    Link(destination: URL(string: "myWidget://widgetaction?parm1=data2")!) {

        VStack {

            Image("sample")

            Text("TEST")

        }

    }

    Spacer()

}

 

// 3. Link로 전달한 URL 수신 처리 하기 (Widget Extension 코드내에서가 아니라 App Code 내에서 처리해주어야 한다.)

// - 앱의 appDelegate 또는 sceneDeleagate의 openURL 메소드로 들어온다.// appDelegate open url 함수

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

    // 들어온 URL 중 Link로 전달한 스키마 기준으로 원하는 기능 구현하기 

}

// or sceneDeleagate open url 함수

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

    // 들어온 URL 중 Link로 전달한 스키마 기준으로 원하는 기능 구현하기

}

 

 

반응형