Ionic-framework: ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ ์ž๋™์œผ๋กœ ํƒญ ์ˆจ๊ธฐ๊ธฐ

์— ๋งŒ๋“  2016๋…„ 06์›” 24์ผ  ยท  61์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: ionic-team/ionic-framework

ํ‚ค๋ณด๋“œ๊ฐ€ ํƒญ ํŽ˜์ด์ง€(position=bottom)์—์„œ ์—ด๋ฆฌ๋ฉด ํƒญ์ด ํ‚ค๋ณด๋“œ ์ƒ๋‹จ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ํ‚ค๋ณด๋“œ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ํƒญ์„ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์žฌํ˜„ ๋‹จ๊ณ„:

  1. ์‹œ์ž‘ ํƒญ ํ…œํ”Œ๋ฆฟ ๋งŒ๋“ค๊ธฐ
  2. ํŽ˜์ด์ง€์— ์ด์˜จ ์ž…๋ ฅ ํฌํ•จ
  3. ๊ธฐ๊ธฐ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์ž…๋ ฅ ์š”์†Œ์— ์ง‘์ค‘

๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ(.keyboard-is-open) CSS ํด๋ž˜์Šค๋ฅผ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” Ionic 2์šฉ์ž…๋‹ˆ๋‹ค.

์ฝ”๋ฅด๋„๋ฐ” CLI: 5.2.0
Gulp ๋ฒ„์ „: CLI ๋ฒ„์ „ 3.9.0
Gulp ๋กœ์ปฌ: ๋กœ์ปฌ ๋ฒ„์ „ 3.9.1
Ionic Framework ๋ฒ„์ „: 2.0.0-beta.9
Ionic CLI ๋ฒ„์ „: 2.0.0-beta.30
Ionic ์•ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „: 2.0.0-beta.16
์šด์˜ ์ฒด์ œ:
๋…ธ๋“œ ๋ฒ„์ „: v4.3.2

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์œ„์—์„œ ์„ค๋ช…ํ•œ @Jatapiaro ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋ฅด๋„๋ฐ” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

cordova plugin add cordova-custom-config

๊ทธ๋Ÿฐ ๋‹ค์Œ config.xml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

<platform name="android">
    <preference name="android-manifest/application/activity/<strong i="10">@android</strong>:windowSoftInputMode" value="adjustPan" />
    ...
</platform>

Android ๋ฐ iOS์—์„œ ์ž‘์—…

๋ชจ๋“  61 ๋Œ“๊ธ€

์˜ˆ, Android๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ํ‚ค๋ณด๋“œ ๋ฌธ์ œ...

@tlancina์˜ PhoneGap conf์—์„œ ํ‚ค๋ณด๋“œ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ ๋ฅผ ๋ณด์•˜๋Š”๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฝค ์–ด๋ ค์šด ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!
์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋„ ์ œ ์•ฑ์—์„œ ํ‚ค๋ณด๋“œ๋ฅผ ์—ด๋ฉด ํ•˜๋‹จ ํƒญ๋ฐ”๊ฐ€ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ๋‚˜์œ ๊ฒƒ์€ ๋ฐ”๋‹ฅ์— ๊ฐ€๊นŒ์šด ์ž…๋ ฅ ํ•„๋“œ๋ฅผ ๋ฎ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Tim์€ ๊ทธ๊ฒƒ์„ ํ”ผํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ํŽธ์ง‘ํ•  ๊ธด ๋ชฉ๋ก์ด ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ „์ฒด ํ‚ค๋ณด๋“œ ์ฃผ์ œ๋ฅผ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ๊ฒƒ์ด ionic์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด ์—ฐ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ @tlancina , ionic์—์„œ ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ž์Šต์„œ๊ฐ€

์ €๋„ ์ด ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์—ฌ๋Ÿฌ๋ถ„๋„ ๊ณ ํ†ต์„ ๋Š๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜น์‹œ ์†Œ์‹์ด ์žˆ๋‚˜์š”?

๋˜ํ•œ ์ด ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ, ํƒญ ๋ฐ ์ˆจ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ํ—ค๋”๊ฐ€ ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@jgw96 ์—ฌ๊ธฐ ์— ํ–ฅ์ƒ ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์•ฑ์€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ (ํ‚ค๋ณด๋“œ ์œ„์˜ ํƒญ ์ด๋™) ํƒญ๋„ ์‹ค์ œ ์ฝ˜ํ…์ธ  ๊ณต๊ฐ„์„ ๋ช‡ ์ค„๋กœ ์ œํ•œํ•˜๋ฏ€๋กœ ํŠนํžˆ ์†Œํ˜• ํœด๋Œ€ํฐ์—์„œ๋Š” ์ด๊ฒƒ์ด ๋” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผ ํ•˜์ง€ ์•Š์„๊นŒ์š”?

์ž„์‹œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

TabsComponent ์ƒ์„ฑ์ž:

platform.ready().then(() => {
            Keyboard.onKeyboardShow().subscribe(() => {
                document.body.classList.add('keyboard-is-open');
            });

            Keyboard.onKeyboardHide().subscribe(() => {
                document.body.classList.remove('keyboard-is-open');
            });
});

CSS ๋‚ด๋ถ€:

body.keyboard-is-open ion-tabbar {
  display: none;
}

body.keyboard-is-open scroll-content {
  margin-bottom: 0 !important;
}

ํ•œ ํŽ˜์ด์ง€์— ํƒญ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์ง€๋งŒ CSS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ์„ ์ง์ ‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ Ionic ๋ฒ ํƒ€ 11์„ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋–ค ์—…๋ฐ์ดํŠธ?

@bvx89 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
Rc0 ์— ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด CSS์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

body.keyboard-is-open .tabbar {
  display: none;
}

body.keyboard-is-open .scroll-content {
  margin-bottom: 0 !important;
}

์•„์ง ๊ณต์‹์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์—†์ง€๋งŒ

Android์—์„œ ์ „์ฒด ํ™”๋ฉด ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด ๋ฌธ์ œ๋„ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ์„ค์ •ํ•˜์—ฌ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
<preference name="Fullscreen" value="true" />
v5.0.0 ์ด์ „์˜ Cordova Android ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ config.xml์— ์ถ”๊ฐ€ํ•˜๊ณ  ์„ ํƒ์ ์œผ๋กœ cordova-plugin-fullscreen์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ˆ˜์ •๋  ๋‚˜๋จธ์ง€ ํ‚ค๋ณด๋“œ ๋ฌธ์ œ์™€ ํ•จ๊ป˜ ๋‹ค์Œ ๋ฒ„์ „์—์„œ ์ˆ˜์ •๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ(๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ํ‚ค๋ณด๋“œ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜๋Š” ๊ฒƒ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค) ๋˜๋Š” ์ด๊ฒƒ์ด ๊ท ์—ด ์‚ฌ์ด์— ๋–จ์–ด์กŒ์Šต๋‹ˆ๊นŒ?

@RaymondAtivie
๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฒ„์ „์—์„œ ํ•ด๊ฒฐ๋  ์˜ˆ์ •์ธ๊ฐ€์š”?

RC3์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
onKeyboardShow()๋Š” ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค...

+1, ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋ฅด๋„๋ฐ” CLI: 6.3.1
Ionic CLI ๋ฒ„์ „: 2.1.8
Ionic ์•ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „: 2.1.4
ios-deploy ๋ฒ„์ „: ์„ค์น˜๋˜์ง€ ์•Š์Œ
ios-sim ๋ฒ„์ „: ์„ค์น˜๋˜์ง€ ์•Š์Œ
์šด์˜ ์ฒด์ œ: ์œˆ๋„์šฐ 8.1
๋…ธ๋“œ ๋ฒ„์ „: v6.4.0
Xcode ๋ฒ„์ „: ์„ค์น˜๋˜์ง€ ์•Š์Œ

๋‚˜๋Š” ์ด์™€ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ @RaymondAtivie ๊ฐ€ ๊ฒŒ์‹œํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํƒญ์€ ๋” ์ด์ƒ ํ‘œ์‹œ๋˜์ง€ ์•Š์ง€๋งŒ ์œ„์ชฝ ํ…Œ๋‘๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ถ”๊ฐ€๋ฅผ ์‹œ๋„ํ–ˆ๋‹ค
box-shadow: none; border-top: none;
๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ํƒญ ํ‘œ์‹œ์ค„์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋™์ผํ•œ ์ƒ๋‹จ ํ…Œ๋‘๋ฆฌ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์•„์ด๋””์–ด?

ion-content ์˜ต์…˜์„ fullscreen="true" ๋ฐ”๊ฟ”์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ํƒญ๋ฐ”์˜ ์ˆจ๊ฒจ์ง„ ์Šคํƒ€์ผ ์„ค์ •

      var tabbars =     document.getElementsByClassName('tabbar');
      for(var i=0; i<tabbars.length; i++) {
        var node = <HTMLElement>tabbars[i];
        node.style.display = hide === true && 'none' || 'block';
      }

๋‚˜๋Š” ์ด๊ฒƒ์„ ์‹œ๋„ํ–ˆ๊ณ  ํƒญ ํ‘œ์‹œ์ค„์ด false๋ฅผ ํ‘œ์‹œํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์ƒ๋‹จ ํ…Œ๋‘๋ฆฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@payneBrandon ์ƒ๋‹จ ๋ฐ”๋ฅผ ์ˆจ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค
<ion-header *ngIf="isShowHeader()">

๋‚ด ์ด์˜จ ํƒญ์ด ๋งจ ์•„๋ž˜์— ์žˆ์œผ๋ฏ€๋กœ ํ—ค๋”๋ฅผ ์ˆจ๊ฒจ๋„ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ•˜๋Š” ๋‚ด์šฉ์˜ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฒจ๋ถ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ํ•˜๋‹จ์˜ ํƒญ์ด ์ˆจ๊ฒจ์ ธ ์žˆ์ง€๋งŒ ์Šคํฌ๋กคํ•˜๋ฉด ์ œ์ž๋ฆฌ์— ์œ ์ง€๋˜๋Š” ์ƒ๋‹จ ๊ฒฝ๊ณ„์„ ์ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.
20170113_102807

์ด ๋ง‰๋Œ€๋Š” ์–‘์‹์˜ ์ผ๋ถ€์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
html ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋งˆ์นจ๋‚ด ๊ทธ๊ฒƒ์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํƒญ์ด ๋งจ ์•„๋ž˜์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จธ๋ฆฌ๊ธ€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์ง€๋งŒ ๋ฐ”๋‹ฅ๊ธ€์„ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์— keyboard-is-open ํด๋ž˜์Šค์™€ BAM์ด ๋‹ค์‹œ ๋น„์ฆˆ๋‹ˆ์Šค์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฐ”๋‹ฅ๊ธ€์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ถ€ ํด๋ž˜์Šค๋ฅผ ์ ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@payneBrandon ํ–‰์šด์„ ๋น•๋‹ˆ๋‹ค

๊ทธ ๊ธฐ๋Šฅ๋„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ ion-footer ๋Š” ํ‚ค๋ณด๋“œ ์—ด๊ธฐ/๋‹ซ๊ธฐ์— ๋Œ€ํ•œ ๊ฐ€์‹œ์„ฑ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ฐ„๋‹จํ•œ ์ˆ˜์ •์„ ํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค). .scroll-content ์—๋Š” margin-bottom ์˜ 56px ๊ฐ€ ์žˆ๊ณ  ๋™์ผํ•œ ๋†’์ด์— ํƒญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ‚ค๋ณด๋“œ๋ฅผ ํ™•์ธํ•œ๋‹ค:

public keyboardCheck() {
        return this.keyboard.isOpen();
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ํด๋ž˜์Šค๋ฅผ ion-content , .scroll-content ์˜ ๋ถ€๋ชจ์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

.keyboard-open .scroll-content {
    margin-bottom: 0px !important;
}

์ด๊ฒƒ์„ ion-content ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

<ion-content padding [ngClass]="{'keyboard-open': keyboardCheck()}">

tabs.html ์—์„œ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ๋„ ํƒญ์„ ์ˆจ๊ฒผ์Šต๋‹ˆ๋‹ค.

<ion-tabs [ngClass]="{'remove-tabs': keyboardCheck()}">

.remove-tabs .tabbar {
    display: none;
}

์ˆ˜์ •์ด ํ•„์š”ํ•œ ํŽ˜์ด์ง€์—๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

iOS์™€ Android ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ

์ด๊ฒƒ์€ ํ‘œ์‹œ๋œ CSS๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

```
'@angular/core'์—์„œ { ๊ตฌ์„ฑ์š”์†Œ } ๊ฐ€์ ธ์˜ค๊ธฐ;
'ionic-native'์—์„œ {Keyboard} ๊ฐ€์ ธ์˜ค๊ธฐ
'../home/home'์—์„œ { ํ™ˆํŽ˜์ด์ง€ } ๊ฐ€์ ธ์˜ค๊ธฐ;
'../about/about'์—์„œ { AboutPage } ๊ฐ€์ ธ์˜ค๊ธฐ;
'../contact/contact'์—์„œ { ContactPage } ๊ฐ€์ ธ์˜ค๊ธฐ;

@์š”์†Œ({
templateUrl: 'tabs.html'
})
๋‚ด๋ณด๋‚ด๊ธฐ ํด๋ž˜์Šค TabsPage {
// ์ด๊ฒƒ์€ ํƒญ ๊ตฌ์„ฑ ์š”์†Œ์— ์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
// ๊ฐ ํƒญ์˜ ๋ฃจํŠธ ํŽ˜์ด์ง€์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
tab1Root: ๋ชจ๋“  = ํ™ˆํŽ˜์ด์ง€;
tab2Root: ๋ชจ๋“  = ์ •๋ณด ํŽ˜์ด์ง€;
tab3Root: ๋ชจ๋“  = ์—ฐ๋ฝ์ฒ˜ ํŽ˜์ด์ง€;
valueforngif=์ฐธ;

์ƒ์„ฑ์ž(๊ณต๊ฐœ ํ‚ค๋ณด๋“œ:ํ‚ค๋ณด๋“œ) { }
ionViewDidEnter(){
Keyboard.onKeyboardShow().subscribe(()=>{this.valueforngif=false})
Keyboard.onKeyboardHide().subscribe(()=>{this.valueforngif=true})
}}

this my tabs.html

    ```
 <ion-tabs *ngIf="valueforngif">
  <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>
  <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle" [tabsHideOnSubPages]="true"></ion-tab>
  <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts"></ion-tab>
</ion-tabs>

๋ฉ‹์ง„ @efnan34 , ์ƒ์„ฑ์ž์—์„œ ์ œ๊ณตํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ.

์ด๋กœ ์ธํ•ด ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ฆด ๋•Œ ์ž๋™์œผ๋กœ ๋‹ซํž™๋‹ˆ๋‹ค... ํƒญ์„ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ํฌ์ปค์Šค๊ฐ€ ํƒญ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ํ‚ค๋ณด๋“œ๊ฐ€ ๋‹ซํžˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ?

ionViewDidEnter(){
    Keyboard.onKeyboardShow().subscribe(()=>{this.valueforngif=false})
    Keyboard.onKeyboardHide().subscribe(()=>{this.valueforngif=true})
}

@bvx89 ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ Ionic 2.1.0๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ionic-native์— ๋Œ€ํ•ด ๊ธฐ๋ก๋œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๊ฐ์ง€๋˜์ง€ ์•Š์•„ ๋‹ค๋ฅธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ณต์‹ ์ˆ˜์ •์„ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค @Killmore
์ด์— ๋Œ€ํ•œ ๊ณต์‹์ ์ธ ํ•ด๊ฒฐ์ฑ…์€ ์•„์ง ์—†๋‚˜์š”?

์•ˆ๋…•ํ•˜์„ธ์š”
์œ„์˜ ์†”๋ฃจ์…˜์€ Ionic 2.1.0์—์„œ๋„ ์‹คํ–‰๋˜์ง€๋งŒ *ngif ๋Œ€์‹  ๋” ๋‚˜์€ ๊ฒฐ๊ณผ [hidden] attrb๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ์ด ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ํ•˜๋ฃจ ๋˜์„ธ์š”

์œ„์˜ ๊ฒฝ์šฐ ์ผ๋ถ€ Android ์žฅ์น˜์—์„œ ๊นœ๋ฐ•์ž„์ด ๋ฐœ์ƒํ•˜๋ฉฐ ์‹ค์ œ๋กœ๋Š” ์ž˜๋ชป๋œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค .. ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค

var originalHeight = document.documentElement.clientHeight;
var originalWidth = document.documentElement.clientWidth;
$(์ฐฝ).ํฌ๊ธฐ ์กฐ์ •(ํ•จ์ˆ˜() {
// ๊ฐ€๋กœ/์„ธ๋กœ ๋ชจ๋“œ ์ „ํ™˜ ์ œ์–ด
if (document.documentElement.clientHeight == originalWidth &&
document.documentElement.clientWidth == originalHeight) {
์›๋ณธ ๋†’์ด = ๋ฌธ์„œ.๋ฌธ์„œ์š”์†Œ.ํด๋ผ์ด์–ธํŠธ ๋†’์ด;
์›๋ณธํญ = ๋ฌธ์„œ.๋ฌธ์„œ์š”์†Œ.ํด๋ผ์ด์–ธํŠธํญ;
}
// ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋†’์ด๊ฐ€ ๋” ์ž‘์€์ง€(ํ‚ค๋ณด๋“œ๊ฐ€ ํ‘œ์‹œ๋จ) ํ™•์ธํ•˜์—ฌ ๋ฐ”๋‹ฅ๊ธ€์„ ์ˆจ๊น๋‹ˆ๋‹ค.
if (document.documentElement.clientHeight < originalHeight) {
$('.๋ฐ”๋‹ฅ๊ธ€').hide();
} ๋˜ ๋‹ค๋ฅธ {
$('.๋ฐ”๋‹ฅ๊ธ€').show();
}
});

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

tab.ts

import { Component, ElementRef, Renderer, ViewChild } from '@angular/core';
import { Events, Tabs } from 'ionic-angular';

import { AboutPage } from '../about/about';
import { ContactPage } from '../contact/contact';
import { HomePage } from '../home/home';

@Component({
  templateUrl: 'tabs.html'
})
export class TabsPage {
  @ViewChild('myTabs') tabRef: Tabs;
  mb: any;
  tab1Root = HomePage;
  tab2Root = AboutPage;
  tab3Root = ContactPage;

  constructor(private elementRef: ElementRef, private renderer: Renderer, private event: Events) {

  }
  ionViewDidLoad() {
    let tabs = this.queryElement(this.elementRef.nativeElement, '.tabbar');
    this.event.subscribe('hideTabs', () => {
      this.renderer.setElementStyle(tabs, 'display', 'none');
      let SelectTab = this.tabRef.getSelected()._elementRef.nativeElement;
      let content = this.queryElement(SelectTab, '.scroll-content');
      this.mb = content.style['margin-bottom'];
      this.renderer.setElementStyle(content, 'margin-bottom', '0')
    });
    this.event.subscribe('showTabs', () => {
      this.renderer.setElementStyle(tabs, 'display', '');
      let SelectTab = this.tabRef.getSelected()._elementRef.nativeElement;
      let content = this.queryElement(SelectTab, '.scroll-content');
      this.renderer.setElementStyle(content, 'margin-bottom', this.mb)
    })
  }
  queryElement(elem: HTMLElement, q: string): HTMLElement {
    return <HTMLElement>elem.querySelector(q);
  }
}

ํŠน์ • ํŽ˜์ด์ง€.ts

import { Component } from '@angular/core';
import { NavController, Events } from 'ionic-angular';

import { Keyboard } from '@ionic-native/keyboard';

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
export class HomePage {

  constructor(public navCtrl: NavController, private event: Events, private keyboard: Keyboard) {

  }
  ionViewDidLoad() {
    this.keyboard.onKeyboardShow().subscribe(() => this.event.publish('hideTabs'));
    this.keyboard.onKeyboardHide().subscribe(() => this.event.publish('showTabs'));
  }
}

dPary์— ๋Œ€ํ•œ ํฌ๋ ˆ๋”ง

ํƒญ์„ ์ˆจ๊ธฐ๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์†”๋ฃจ์…˜์œผ๋กœ ์ธํ•ด ์žฅ์น˜์—์„œ ๋ณด๊ธฐ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜์–ด ๋ˆˆ์— ๋„๋Š” ๊นœ๋ฐ•์ž„์ด ๋ฐœ์ƒํ•˜๊ณ  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘๊ฐ€ ์ ์ ˆํ•œ ์žฅ์น˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ตœ๊ณ ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” @cozzbie ์™€ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋‹จ์ง€ ์ผ๋ถ€ ํ•ดํ‚น์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. @ionitron @manucorporat ํŒ€์˜ ์‹ค์ œ ๊ณต์‹ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

+1 ๊ณต์‹ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ˆ˜์ • ์‚ฌํ•ญ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ํ”„๋กœ๋•์…˜ ์šฉ๋„๋กœ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋ฒ„์ „์˜ ionic์€ ์ž์ฒด์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

21 Nis 2017 17:12 "Ruben Callewaert" ์•Œ๋ฆผ @github.com
์•ผ์ฆˆ๋””:

+1 ๊ณต์‹ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ˆ˜์ • ์‚ฌํ•ญ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ƒ์‚ฐ ์‚ฌ์šฉ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/driftyco/ionic/issues/7047#issuecomment-296201358 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AVskkCpgFZZRbrd56ILc5nIPZICRTclUks5ryLlCgaJpZM4I-H1S
.

์ด๊ฒŒ ์ •๋ง ์‹ ๊ฒฝ์จ์ค€๊ฑด์ง€. ์—ฌ์ „ํžˆ ํƒญ๋ฐ”๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด ์ž‘์„ฑ ionic-angular 3.2.0์—์„œ์™€ ๊ฐ™์ด ์ตœ์‹  ๋ฒ„์ „์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2.xx ๋ฒ„์ „์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ–ˆ์ง€๋งŒ ์ด์ œ 3.xx ๋ฒ„์ „์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ญ”๊ฐ€ ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์—์„œ ์›ํ•˜๋Š” ๊ฒƒ์„ ์ˆจ๊ธธ ๋•Œ๊นŒ์ง€
ํ‚ค๋ณด๋“œ๋กœ ํƒ€์ดํ•‘ .์•ˆํƒ€๊น๊ฒŒ๋„ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  2.xx์— ๋Œ€ํ•œ ur ionic ๋ฒ„์ „

2017๋…„ 5์›” 12์ผ ร–ร– 3:32 "vazad28" ์•Œ๋ฆผ @github.com yazdฤฑ:

์ด๊ฒŒ ์ •๋ง ์‹ ๊ฒฝ์จ์ค€๊ฑด์ง€. ์—ฌ์ „ํžˆ ํƒญ๋ฐ”๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. ์ตœ์‹  ์‹คํ–‰
ionic-angular 3.2.0์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/driftyco/ionic/issues/7047#issuecomment-300952251 ,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AVskkNkEdzsMkkrhGW0l9OUW2BKly-PSks5r46ingaJpZM4I-H1S
.

๊ทธ๋ƒฅ ์—ฌ๊ธฐ ์ƒ๊ฐ. ์œ„์˜ ํ•ต์„ ์‚ฌ์šฉํ•˜์—ฌ ํƒญ์„ ์ˆจ๊ธฐ๋ฉด ์žฅ์น˜์—์„œ ๋ณด๊ธฐ๊ฐ€ ์ƒˆ๋กœ ๊ณ ์ณ์ง€๋ฏ€๋กœ ์ˆจ๊ธฐ๋Š” ๋Œ€์‹  ํƒญ ์˜์—ญ์˜ ๋†’์ด๋ฅผ 0์œผ๋กœ ๋‚ฎ์ถ”๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ทธ๋ƒฅ ์ƒ๊ฐ์ด์ง€๋งŒ ์ง€๊ธˆ์€ ๋„ˆ๋ฌด ์ฐธ์—ฌํ•˜์—ฌ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์ˆ˜์ •์„ ์œ„ํ•ด +1! " display:none " ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ—ˆ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊นœ๋ฐ•์ž„์„ ์ผ์œผํ‚ค๊ณ  ํƒญ์ด ํ•œ ๋ฒˆ ๋ Œ๋”๋ง๋œ ๋‹ค์Œ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.... ๊ฑฐ์ถ”์žฅ์Šค๋Ÿฝ๊ณ  ํ•ดํ‚คํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. (๋ˆ„๊ตฐ๊ฐ€ ๊นœ๋ฐ•์ž„์„ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž์—๊ฒŒ ์ข‹๊ฒŒ ๋ณด์ด๋ฉด ํ•ดํ‚น ์œ„์— ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค)

์ด ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ํฌ๋ง์„ ์žƒ๊ณ  UI์˜ ํ’ˆ์งˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์—ฌ์ „ํžˆ ๊ณต์‹ ์ˆ˜์ •์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@patrickmcd , ์—„์ง€์†๊ฐ€๋ฝ์˜ ์ œ์™•, ์ด ์Šต๊ด€์„

@viking2917 ๋‚ด๊ฐ€ ์ œ์•ˆํ•œ ํ•ดํ‚น์„ ์‹œ๋„ํ•˜๊ณ  ํƒญ ๋†’์ด๋ฅผ 0์œผ๋กœ ๊ฐ•์ œ

๋ถˆํ–‰ํžˆ๋„ CSS๋กœ ํƒญ์„ ์ˆจ๊ธฐ๋ฉด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Ionic์€ ion-content ์—ฌ๋ฐฑ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  ์ˆจ๊ฒจ์ง„ ํƒญ์˜ ์กด์žฌ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ๊ป˜ ์ผ๋ถ€ ์œ„์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์†”๋ฃจ์…˜์„ ์ œ๊ฑฐํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Khalid-Nowaf ๋‚˜๋Š” Ionic ํŒ€๊ณผ ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ~2000๋ช…์˜ ๊ด€์ฐฐ์ž๋“ค๋กœ๋ถ€ํ„ฐ ์‹œ๊ฐ„์„ ๋นผ์•—๋Š” ์ŠคํŒธ ๋Œ“๊ธ€์— ๊ฐ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@Floyd1256 ๋‹˜ ์˜ ๋Œ“๊ธ€์€ ์‚ฌ๋ ค๊นŠ์ง€ ์•Š์€ ์ŠคํŒธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋Œ€ํ™”์— ์•„๋ฌด๊ฒƒ๋„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์šฐ๋ฆฌ์˜ ๋ฐ›์€ ํŽธ์ง€ํ•จ์„ ์ฑ„์šฐ๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ "ํ”Œ๋Ÿฌ์Šค ์› / ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ๊ฑฐ๊ธฐ์— ์žˆ์Šต๋‹ˆ๊นŒ?" ์ฝ”๋ฉ˜ํŠธ์ž…๋‹ˆ๋‹ค.

๋‚ด downvotes๋Š” ๋” ์‚ฌ๋ ค ๊นŠ์€ ํ–‰๋™์œผ๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋„›์ง€ํ•˜๋ ค๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค. ๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ ์ „์— ์šฐ๋ฆฌ๋Š” _์‹œ๊ฐ„์ด ์†Œ์ค‘ํ•œ_ ~2000๋ช…์˜ ์‚ฌ๋žŒ๋“ค๊ณผ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด ๊ณต๊ฐ„์„ ์นœ๊ตฌ์™€ ๊ฐœ์ธ์ ์ธ IM ์ฑ„ํŒ…์ฒ˜๋Ÿผ ๊ฒฝ์†”ํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์šฐ๋ฆฌ์˜ ์˜๊ฒฌ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋„์›€์ด ๋  ๊ฒƒ์ธ์ง€ ๋ฐฉํ•ด๊ฐ€ ๋  ๊ฒƒ์ธ์ง€, ๋Œ€ํ™”๋ฅผ ์ง„์ „์‹œํ‚ค๊ฑฐ๋‚˜ ๊ทธ์ € ๋– ๋“ค์ฉํ•œ ๊ฒƒ์ธ์ง€, ์ •๋ง๋กœ ๋งํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š”์ง€ ๋˜๋Š” Github ๋ฐ˜์‘์œผ๋กœ ๋” ์ž˜

https://github.com/ionic-team/ionic/tree/keyboard-fixes ์™€ ํ•จ๊ป˜ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด ์ปค๋ฐ‹ ์€ ํŠนํžˆ โ€‹โ€‹๋งค์šฐ ์œ ๋งํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

ionic v1 ์ด์ƒ ๊ฐˆ ์šฉ๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŒจ์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค(๋‚˜๋Š” ์ด ์ฝค๋ณด๊ฐ€ ์žˆ๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ทฐ์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค).

/* HACK Al Mostrar el teclado el tabbar se pone encima de el en android /var bottom_stored=0;window.addEventListener('native.keyboardshow', ํ•จ์ˆ˜(e) {angular.element(document.getElementsByClassName('tab-nav')).addClass('์ˆจ๊ธฐ๊ธฐ');bottom_stored = angular.element(document.getElementsByClassName('has-tabs')).css('๋ฐ”๋‹ฅ');angular.element(document.getElementsByClassName('has-tabs')).css('๋ฐ”๋‹ฅ','0px');$scope.$apply();});window.addEventListener('native.keyboardhide', ํ•จ์ˆ˜(e) {angular.element(document.getElementsByClassName('tab-nav')).removeClass('์ˆจ๊ธฐ๊ธฐ');angular.element(document.getElementsByClassName('has-tabs')).css('bottom',bottom_stored);$scope.$apply();});/ ํ•ดํ‚น */

์ด๊ฒƒ์€ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค

์ œ ๊ฒฝ์šฐ์—๋Š” Android๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ config.xml์—์„œ android ํƒœ๊ทธ์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<platform name="android"> <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application/activity"> <activity android:windowSoftInputMode="adjustPan" /> </edit-config>

๋‹ค์Œ ์ค„์„ ๊ฐ„๋‹จํžˆ ์ถ”๊ฐ€ํ•˜๋ฉด AndroidManifest.xml์˜ Android ๋นŒ๋“œ๊ฐ€ android:windowSoftInputMode์— adjustPan ์ด ์žˆ์œผ๋ฏ€๋กœ ํ‚ค๋ณด๋“œ๊ฐ€ ํ™”๋ฉด์„ ์œ„๋กœ ๋ฐ€์–ด ์˜ฌ๋ฆฌ๋Š” ๋Œ€์‹  ๋ชจ๋“  ์ฝ˜ํ…์ธ ๋ฅผ ์˜ค๋ฒ„๋ ˆ์ดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ @Jatapiaro ์˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋ฅด๋„๋ฐ” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

cordova plugin add cordova-custom-config

๊ทธ๋Ÿฐ ๋‹ค์Œ config.xml์— ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

<platform name="android">
    <preference name="android-manifest/application/activity/<strong i="10">@android</strong>:windowSoftInputMode" value="adjustPan" />
    ...
</platform>

Android ๋ฐ iOS์—์„œ ์ž‘์—…

๋‹ค์Œ์€ ํ‚ค๋ณด๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

๋‚ด TS ํŒŒ์ผ์—์„œ:

@ViewChild('foot') foo_ter: ElementRef;
  constructor(private platform: Platform, private keyboard: Keyboard) {
    this.platform.ready().then(() => {
      this.keyboard.onKeyboardShow().subscribe(() => {
        this.foo_ter.nativeElement.hidden = true;
      });
      this.keyboard.onKeyboardHide().subscribe(() => {
        this.foo_ter.nativeElement.hidden = false;
      });
    });
  }

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด HTML ํŒŒ์ผ์—์„œ ์œ„์˜ TS์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฐธ์กฐํ•˜๋Š” #footer ๋ผ๋Š” ํ…œํ”Œ๋ฆฟ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

<ion-footer no-border style="padding:5%;" #footer>
  <ion-item no-lines>
   Don't have an account?
    <button ion-button style="text-align:center;" bold item-end clear no-lines clear (click)="signup()">
      Sign Up
    </button>
  </ion-item>
</ion-footer>

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์—๊ฒŒ๋„ ํšจ๊ณผ๊ฐ€ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค :-) @RaymondAtivie

Ionic V3์—์„œ ์ด๋ ‡๊ฒŒ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์™„๋ฒฝํ•˜๊ฒŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
TS ํŒŒ์ผ
ionViewDidEnter() {
if (this.keyboard.isOpen())
this.showTabs = ๊ฑฐ์ง“;
๋˜ ๋‹ค๋ฅธ
this.showTabs = ์‚ฌ์‹ค;
}

HTML ํŒŒ์ผ

๋‹ค์Šค๋‹ค

asd

์ •๋‹ต์ด ์•„๋‹ˆ๋‹ค

์ด์— ๋Œ€ํ•œ ๊ณต์‹ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ค๋Š˜๋ถ€ํ„ฐ.. Ionic v๋กœ
@ionic-native/keyboard๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋งํ–ˆ๋“ฏ์ด .. onKeyboardShow() ์ด๋ฒคํŠธ๋Š” ์ ˆ๋Œ€๋กœ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ cordova-keyboard-plugin๋„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์€ ...
cordova plugin add cordova-plugin-ionic-keyboard --save
์ด๊ฒƒ์„ ๊ฒŒ์‹œํ•˜์‹ญ์‹œ์˜ค .. readme์— ์„ค๋ช… ๋œ๋Œ€๋กœ window.addEventListener๋ฅผ

ํƒญ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

````ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ
// MyTabs.ts
์‡ผ ๋ฆฌ์Šค๋„ˆ() {
console.log('ํ‚ค๋ณด๋“œ ํ‘œ์‹œ');
document.body.classList.add('ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์Œ');
}
์ˆจ๊น€ ๋ฆฌ์Šค๋„ˆ() {
console.log('ํ‚ค๋ณด๋“œ ์ˆจ๊น€');
document.body.classList.remove('ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์Œ');
}

ionViewDidEnter() {
window.addEventListener('keyboardWillShow', this.showListener);
window.addEventListener('keyboardDidHide', this.hideListener);
}

ionViewWillLeave() {
window.removeEventListener('keyboardWillShow', this.showListener);
window.removeEventListener('keyboardDidHide', this.hideListener);
}
````

์ฒ˜์Œ์—๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ์ž…๋ ฅ์„ ์ฒ˜์Œ ํด๋ฆญํ•˜๋ฉด ํƒญ ํ‘œ์‹œ์ค„์ด ์ˆจ๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž…๋ ฅ์„ ํด๋ฆญํ•˜๋ฉด ํƒญ ํ‘œ์‹œ์ค„์ด ๋‹ค์‹œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ œ ๊ฒฝ์šฐ์—๋Š” ์ฒ˜์Œ์— ์ž…๋ ฅ ํ•„๋“œ๋ฅผ ํด๋ฆญํ•  ๋•Œ๋งŒ ํƒญ ํ‘œ์‹œ์ค„์ด ์ˆจ๊ฒจ์กŒ์Šต๋‹ˆ๋‹ค.

์–ด๋– ํ•œ ์ œ์•ˆ? @dharapvj

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ํƒญ ํ‘œ์‹œ์ค„์„ "์ˆจ๊ธฐ๊ธฐ"์™€ ๊ฐ™์ง€๋Š” ์•Š์ง€๋งŒ ์ด ์†”๋ฃจ์…˜์€ ํ‚ค๋ณด๋“œ๊ฐ€ ํƒญ ํ‘œ์‹œ์ค„์„ ๋ˆ„๋ฅด๋Š” ๋Œ€์‹  ํƒญ ํ‘œ์‹œ์ค„์„ ๊ฐ€๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ config.xml์—์„œ ๋‹ค์Œ์„ ํฌํ•จํ•˜๋„๋ก Android ํ”Œ๋žซํผ์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

    <platform name="android">
        ...
        <edit-config file="AndroidManifest.xml" mode="merge" target="/manifest/application/activity">
            <activity android:windowSoftInputMode="adjustPan" />
        </edit-config>
    </platform>

์ด๊ฒƒ์ด ํ•˜๋Š” ์ผ์€ Cordova๊ฐ€ AndroidManifest.xml์— ์“ฐ๋Š” ๊ธฐ๋ณธ๊ฐ’์„ ์ˆ˜์ •ํ•˜์—ฌ ์•ฑ์˜ ์ „์—ญ ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ž…๋‹ˆ๋‹ค.

...๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋นŒ๋“œ์—์„œ AndroidManifest.xml์„ ํ™•์ธํ•˜๋ฉด android:windowSoftInputMode= "

@codymbeardsley ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ์†”๋ฃจ์…˜์€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ฒฝ์šฐ ์ข‹์€ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ํ‚ค๋ณด๋“œ๊ฐ€ ์—ด๋ ค ์žˆ์„ ๋•Œ ๋„๊ตฌ ๋ชจ์Œ ์„ ๋ฐ”๋‹ฅ๊ธ€์„ ์ˆจ๊น๋‹ˆ๋‹ค !

38433253_2249424885084611_5542912714352885760_n
38404571_2249424851751281_3916148672231899136_n

์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
@codymbeardsley ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋ฌธ์ œ๋ฅผ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด ๋ฌธ์ œ๋Š” ์›๋ž˜ ๋ฌธ์ œ์™€ ๊ด€๋ จ์ด ์—†๋Š” ๋Œ“๊ธ€์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ž ๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์—ฌ์ „ํžˆ ์ตœ์‹  ๋ฒ„์ „์˜ Ionic์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ ์ƒˆ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ…œํ”Œ๋ฆฟ์ด ์™„์ „ํžˆ ์ฑ„์›Œ์กŒ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰