{"id":261,"date":"2023-08-17T14:27:15","date_gmt":"2023-08-17T05:27:15","guid":{"rendered":"https:\/\/shugomatsuzawa.com\/techblog\/?p=261"},"modified":"2023-08-17T14:27:17","modified_gmt":"2023-08-17T05:27:17","slug":"react-native-calendars%e3%81%ae%e3%83%ac%e3%82%b9%e3%83%9d%e3%83%b3%e3%82%b7%e3%83%96%e5%af%be%e5%bf%9c%e3%81%8c%e5%a4%a7%e5%a4%89%e3%81%a0%e3%81%a3%e3%81%9f%e8%a9%b1","status":"publish","type":"post","link":"https:\/\/shugomatsuzawa.com\/techblog\/2023\/08\/17\/261\/","title":{"rendered":"React Native Calendars\u306e\u30ec\u30b9\u30dd\u30f3\u30b7\u30d6\u5bfe\u5fdc\u304c\u5927\u5909\u3060\u3063\u305f\u8a71"},"content":{"rendered":"\n<p>\u307e\u305f\u307e\u305f<a href=\"https:\/\/github.com\/shugomatsuzawa\/Facial-Paralysis-Care\" data-type=\"URL\" data-id=\"https:\/\/github.com\/shugomatsuzawa\/Facial-Paralysis-Care\" target=\"_blank\" rel=\"noreferrer noopener\">\u9854\u9762\u795e\u7d4c\u9ebb\u75fa\u30b1\u30a2\u30a2\u30d7\u30ea<\/a>\u306e\u8a71\u3002<\/p>\n\n\n\n<p>iPad\u3084Android\u306b\u5bfe\u5fdc\u3067\u304d\u306a\u3044\u304b\u3068\u7d20\u4eba\u306a\u308a\u306b\u8272\u3005\u6a21\u7d22\u3057\u3066\u3044\u308b\u3068\u3053\u308d\u3002<a href=\"https:\/\/github.com\/shugomatsuzawa\/Facial-Paralysis-Care\" data-type=\"URL\" data-id=\"https:\/\/github.com\/shugomatsuzawa\/Facial-Paralysis-Care\" target=\"_blank\" rel=\"noreferrer noopener\">\uff08GitHub\uff09<\/a><br>iPadOS\u306b\u306fSplit View\u3084Slide Over\u304c\u3042\u308b\u3057\u3001Android\u3082\u30d5\u30a9\u30eb\u30c0\u30d6\u30eb\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u7b49\u5897\u3048\u3066\u304d\u305f\u306e\u3067\u3001\u53ef\u5909\u30b5\u30a4\u30ba\u306b\u5bfe\u5fdc\u3057\u305f\u3044\u3002<br>\u3057\u304b\u3057React Native Calendars\u306f\u305d\u3046\u7c21\u5358\u306b\u306f\u3044\u304b\u306a\u3044\u306e\u3060\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u3084\u308a\u305f\u3044\u3053\u3068<\/h2>\n\n\n\n<p>React Native Calendars\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u306f1.1300.0\u3002<br><a href=\"https:\/\/wix.github.io\/react-native-calendars\/docs\/Components\/CalendarList#horizontal-calendarlist\" data-type=\"URL\" data-id=\"https:\/\/wix.github.io\/react-native-calendars\/docs\/Components\/CalendarList#horizontal-calendarlist\" target=\"_blank\" rel=\"noreferrer noopener\">Horizontal CalendarList<\/a>\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { StatusBar } from 'expo-status-bar';\nimport React, { useState } from 'react';\nimport { View, SafeAreaView, ScrollView, useWindowDimensions } from 'react-native';\nimport { Button } from 'react-native-paper';\nimport { CalendarList } from 'react-native-calendars';\n\nconst HomeScreen = ({ navigation }) =&gt; {\n  const window = useWindowDimensions();\n\n  const &#91;calendarKey, setCalendarKey] = useState(0);\n  const reloadCalendar = () =&gt; {\n    setCalendarKey(calendarKey + 1);\n  };\n\n  return (\n    &lt;ScrollView contentInsetAdjustmentBehavior=\"automatic\"&gt;\n      &lt;SafeAreaView&gt;\n        &lt;CalendarList\n          key={calendarKey}\n          staticHeader\n          calendarHeight={400}\n          calendarWidth={window.width}\n          horizontal={true}\n          pagingEnabled={true}\n        \/&gt;\n        &lt;View&gt;\n          &lt;Button onPress={reloadCalendar}&gt;\u4eca\u65e5&lt;\/Button&gt;\n        &lt;\/View&gt;\n      &lt;\/SafeAreaView&gt;\n      &lt;StatusBar style=\"auto\" \/&gt;\n    &lt;\/ScrollView&gt;\n  );\n};\n\nexport default HomeScreen;<\/code><\/pre>\n\n\n\n<p>\u3057\u304b\u3057\u3053\u308c\u3060\u3068\u753b\u9762\u30b5\u30a4\u30ba\u304c\u5909\u308f\u3063\u3066\u3082\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u30b5\u30a4\u30ba\u304c\u5909\u308f\u3089\u306a\u3044\u3002<br>\u3061\u306a\u307f\u306b<code>CalendarList<\/code>\u306e<code>key<\/code>\u3092\u66f4\u65b0\u3057\u3066\u3082\u30c0\u30e1\u3060\u3063\u305f\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u753b\u9762\u30b5\u30a4\u30ba\u304c\u5909\u66f4\u3055\u308c\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3092\u53d6\u5f97<\/h2>\n\n\n\n<p>\u3069\u3046\u3044\u3046\u65b9\u6cd5\u3067\u30ab\u30ec\u30f3\u30c0\u30fc\u3092\u30ea\u30ed\u30fc\u30c9\u3059\u308b\u306b\u305b\u3088\u3001\u307e\u305a\u753b\u9762\u30b5\u30a4\u30ba\u304c\u5909\u308f\u3063\u305f\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u5b9f\u884c\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u3002<br><code>Dimensions<\/code>\u3092\u4f7f\u3046\u3053\u3068\u306b\u3057\u305f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { StatusBar } from 'expo-status-bar';\nimport React, { useState } from 'react';\nimport { View, SafeAreaView, ScrollView, Dimensions, useWindowDimensions } from 'react-native';\nimport { Button } from 'react-native-paper';\nimport { useFocusEffect } from '@react-navigation\/native';\nimport { CalendarList } from 'react-native-calendars';\n\nconst HomeScreen = ({ navigation }) =&gt; {\n  const window = useWindowDimensions();\n\n  const &#91;calendarKey, setCalendarKey] = useState(0);\n  const reloadCalendar = () =&gt; {\n    setCalendarKey(calendarKey + 1);\n  };\n\n  useFocusEffect(\n    React.useCallback(() =&gt; {\n      const handleDimensionsChange = () =&gt; {\n        \/\/ \u30ea\u30ed\u30fc\u30c9\u306e\u30ed\u30b8\u30c3\u30af\u3092\u3053\u3053\u306b\u8ffd\u52a0\n      };\n      dimensionsHandler=Dimensions.addEventListener('change',handleDimensionsChange)\n      return ()=&gt;dimensionsHandler.remove()\n    }, &#91;])\n  );\n\n  return (\n    &lt;ScrollView contentInsetAdjustmentBehavior=\"automatic\"&gt;\n      &lt;SafeAreaView&gt;\n        &lt;CalendarList\n          key={calendarKey}\n          staticHeader\n          calendarHeight={400}\n          calendarWidth={window.width}\n          horizontal={true}\n          pagingEnabled={true}\n        \/&gt;\n        &lt;View&gt;\n          &lt;Button onPress={reloadCalendar}&gt;\u4eca\u65e5&lt;\/Button&gt;\n        &lt;\/View&gt;\n      &lt;\/SafeAreaView&gt;\n      &lt;StatusBar style=\"auto\" \/&gt;\n    &lt;\/ScrollView&gt;\n  );\n};\n\nexport default HomeScreen;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u30ea\u30ed\u30fc\u30c9<\/h2>\n\n\n\n<p>\u30ab\u30ec\u30f3\u30c0\u30fc\u306e\u30ea\u30ed\u30fc\u30c9\u306f\u3001\u7d50\u5c40<code>CalendarList<\/code>\u3092\u51fa\u3057\u5165\u308c\u3059\u308b\u3060\u3051\u306b\u3057\u305f\u3002<br>\u4ed6\u306e\u753b\u9762\u3092\u8868\u793a\u4e2d\u306b\u753b\u9762\u30b5\u30a4\u30ba\u304c\u5909\u66f4\u3055\u308c\u308b\u53ef\u80fd\u6027\u3082\u8003\u616e\u3057\u3001<code>useIsFocused<\/code>\u3082\u4f7f\u3063\u3066\u3044\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { StatusBar } from 'expo-status-bar';\nimport React, { useState } from 'react';\nimport { View, SafeAreaView, ScrollView, Dimensions, useWindowDimensions } from 'react-native';\nimport { ActivityIndicator, Button } from 'react-native-paper';\nimport { useFocusEffect, useIsFocused } from '@react-navigation\/native';\nimport { CalendarList } from 'react-native-calendars';\n\nconst HomeScreen = ({ navigation }) =&gt; {\n  const window = useWindowDimensions();\n\n  const &#91;calendarKey, setCalendarKey] = useState(0);\n  const &#91;calendarVisibility, setCalendarVisibility] = useState(true);\n  const reloadCalendar = () =&gt; {\n    setCalendarVisibility(false);\n    setTimeout(() =&gt; {\n      setCalendarKey(calendarKey + 1);\n      setCalendarVisibility(true);\n    },100);\n  };\n\n  useFocusEffect(\n    React.useCallback(() =&gt; {\n      const handleDimensionsChange = () =&gt; {\n        \/\/ \u30ea\u30ed\u30fc\u30c9\u306e\u30ed\u30b8\u30c3\u30af\u3092\u3053\u3053\u306b\u8ffd\u52a0\n        reloadCalendar()\n      };\n      dimensionsHandler=Dimensions.addEventListener('change',handleDimensionsChange)\n      return ()=&gt;dimensionsHandler.remove()\n    }, &#91;])\n  );\n\n  return (\n    &lt;ScrollView contentInsetAdjustmentBehavior=\"automatic\"&gt;\n      &lt;SafeAreaView&gt;\n        {useIsFocused() === false ?\n          &lt;View&gt;\n            &lt;ActivityIndicator animating={true} \/&gt;\n          &lt;\/View&gt;\n        : calendarVisibility ?\n          &lt;CalendarList\n            key={calendarKey}\n            staticHeader\n            calendarHeight={400}\n            calendarWidth={window.width}\n            horizontal={true}\n            pagingEnabled={true}\n          \/&gt;\n        :\n          &lt;View&gt;\n            &lt;ActivityIndicator animating={true} \/&gt;\n          &lt;\/View&gt;\n        }\n        &lt;View&gt;\n          &lt;Button onPress={reloadCalendar}&gt;\u4eca\u65e5&lt;\/Button&gt;\n        &lt;\/View&gt;\n      &lt;\/SafeAreaView&gt;\n      &lt;StatusBar style=\"auto\" \/&gt;\n    &lt;\/ScrollView&gt;\n  );\n};\n\nexport default HomeScreen;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u843d\u3068\u3057\u7a74<\/h2>\n\n\n\n<p>\u8a66\u3057\u305f\u3068\u3053\u308d<code>Dimensions<\/code>\u3092\u4f7f\u3063\u305f\u30a6\u30a3\u30f3\u30c9\u30a6\u30b5\u30a4\u30ba\u5909\u66f4\u30bf\u30a4\u30df\u30f3\u30b0\u306e\u5224\u5b9a\u306f\u3001Apple\u30b7\u30ea\u30b3\u30f3Mac\u3067\u306f\u3067\u304d\u306a\u304b\u3063\u305f\u3002<br>\u7d50\u5c40Mac\u5bfe\u5fdc\u3092\u8ae6\u3081\u308b\u304b\u3001Split View &amp; Slide Over\u5bfe\u5fdc\u3092\u8ae6\u3081\u308b\u304b\u306e\u3069\u3061\u3089\u304b\u306b\u306a\u308a\u305d\u3046\u3060\u3002<\/p>\n\n\n\n<p>Split View\u3068Slide Over\u3092\u7121\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001<code>app.json<\/code>\u306b\u6b21\u3092\u8ffd\u52a0\u3059\u308b\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"expo\": {\n    \"ios\": {\n      \"requireFullScreen\": true\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u53c2\u8003<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/wix.github.io\/react-native-calendars\/docs\/Components\/CalendarList\" data-type=\"URL\" data-id=\"https:\/\/wix.github.io\/react-native-calendars\/docs\/Components\/CalendarList\" target=\"_blank\" rel=\"noreferrer noopener\">CalendarList | RNC<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/reactnative.dev\/docs\/dimensions\" data-type=\"URL\" data-id=\"https:\/\/reactnative.dev\/docs\/dimensions\" target=\"_blank\">Dimensions \u00b7 React Native<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/reactnative.dev\/docs\/usewindowdimensions\" data-type=\"URL\" data-id=\"https:\/\/reactnative.dev\/docs\/usewindowdimensions\" target=\"_blank\" rel=\"noreferrer noopener\">useWindowDimensions \u00b7 React Native<\/a><\/li>\n\n\n\n<li><a rel=\"noreferrer noopener\" href=\"https:\/\/reactnavigation.org\/docs\/use-is-focused\/\" data-type=\"URL\" data-id=\"https:\/\/reactnavigation.org\/docs\/use-is-focused\/\" target=\"_blank\">useIsFocused | React Navigation<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/docs.expo.dev\/versions\/latest\/config\/app\/\" data-type=\"URL\" data-id=\"https:\/\/docs.expo.dev\/versions\/latest\/config\/app\/\" target=\"_blank\" rel=\"noreferrer noopener\">app.json \/ app.config.js &#8211; Expo Documentation<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"\u307e\u305f\u307e\u305f\u9854\u9762\u795e\u7d4c\u9ebb\u75fa\u30b1\u30a2\u30a2\u30d7\u30ea\u306e\u8a71\u3002 iPad\u3084Android\u306b\u5bfe\u5fdc\u3067\u304d\u306a\u3044\u304b\u3068\u7d20\u4eba\u306a\u308a\u306b\u8272\u3005\u6a21\u7d22\u3057\u3066\u3044\u308b\u3068\u3053\u308d\u3002\uff08GitHub\uff09iPadOS\u306b\u306fSplit View\u3084Slide Over\u304c\u3042\u308b\u3057\u3001Android\u3082\u30d5\u30a9\u30eb [&hellip;]","protected":false},"author":1,"featured_media":159,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[75],"tags":[78,74,77,36,71,72,73,79,10],"class_list":["post-261","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-app-development","tag-android","tag-expo","tag-ipados","tag-macos","tag-react-native","tag-react-native-calendar","tag-react-native-paper","tag-react-navigation","tag-memo"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/shugomatsuzawa.com\/techblog\/wp-content\/uploads\/sites\/3\/2022\/10\/meeting-g125fcd6b9_1920.jpg","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/posts\/261","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/comments?post=261"}],"version-history":[{"count":9,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/posts\/261\/revisions"}],"predecessor-version":[{"id":271,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/posts\/261\/revisions\/271"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/media\/159"}],"wp:attachment":[{"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/media?parent=261"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/categories?post=261"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shugomatsuzawa.com\/techblog\/wp-json\/wp\/v2\/tags?post=261"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}