[ios] New interface controls.
|
@ -1,524 +1,524 @@
|
|||
<!DOCTYPE skin>
|
||||
<skin>
|
||||
<page height="256" file="symbols.png" width="512">
|
||||
<symbolStyle name="route_to" id="1">
|
||||
<resourceStyle x="0" y="0" height="71" width="71"/>
|
||||
<page height="256" width="512" file="symbols.png">
|
||||
<symbolStyle id="1" name="route_to">
|
||||
<resourceStyle height="71" x="0" width="71" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="current-position-compas" id="2">
|
||||
<resourceStyle x="71" y="0" height="39" width="31"/>
|
||||
<symbolStyle id="2" name="compass-image">
|
||||
<resourceStyle height="60" x="71" width="60" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="current-routing-compas" id="3">
|
||||
<resourceStyle x="102" y="0" height="39" width="31"/>
|
||||
<symbolStyle id="3" name="current-routing-compas">
|
||||
<resourceStyle height="39" x="131" width="31" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="search-result-active" id="4">
|
||||
<resourceStyle x="133" y="0" height="35" width="35"/>
|
||||
<symbolStyle id="4" name="current-position-compas">
|
||||
<resourceStyle height="39" x="162" width="31" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="compass-image" id="5">
|
||||
<resourceStyle x="168" y="0" height="33" width="33"/>
|
||||
<symbolStyle id="5" name="search-result-active">
|
||||
<resourceStyle height="35" x="193" width="35" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-yellow" id="6">
|
||||
<resourceStyle x="201" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="6" name="placemark-green">
|
||||
<resourceStyle height="31" x="228" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-red" id="7">
|
||||
<resourceStyle x="218" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="7" name="placemark-brown">
|
||||
<resourceStyle height="31" x="245" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-orange" id="8">
|
||||
<resourceStyle x="235" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="8" name="placemark-pink">
|
||||
<resourceStyle height="31" x="262" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-pink" id="9">
|
||||
<resourceStyle x="252" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="9" name="placemark-purple">
|
||||
<resourceStyle height="31" x="279" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-green" id="10">
|
||||
<resourceStyle x="269" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="10" name="placemark-blue">
|
||||
<resourceStyle height="31" x="296" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-purple" id="11">
|
||||
<resourceStyle x="286" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="11" name="placemark-red">
|
||||
<resourceStyle height="31" x="313" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-brown" id="12">
|
||||
<resourceStyle x="303" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="12" name="placemark-yellow">
|
||||
<resourceStyle height="31" x="330" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="placemark-blue" id="13">
|
||||
<resourceStyle x="320" y="0" height="31" width="17"/>
|
||||
<symbolStyle id="13" name="placemark-orange">
|
||||
<resourceStyle height="31" x="347" width="17" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="tennis" id="14">
|
||||
<resourceStyle x="337" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="14" name="baseball">
|
||||
<resourceStyle height="23" x="364" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="tennis-borderless" id="15">
|
||||
<resourceStyle x="360" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="15" name="information">
|
||||
<resourceStyle height="23" x="387" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="telephone" id="16">
|
||||
<resourceStyle x="383" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="16" name="basketball">
|
||||
<resourceStyle height="23" x="410" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_roof" id="17">
|
||||
<resourceStyle x="406" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="17" name="baseball-borderless">
|
||||
<resourceStyle height="23" x="433" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="taxi" id="18">
|
||||
<resourceStyle x="429" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="18" name="bicycle_rental">
|
||||
<resourceStyle height="23" x="456" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="synagogue" id="19">
|
||||
<resourceStyle x="452" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="19" name="bird">
|
||||
<resourceStyle height="23" x="479" width="23" y="0"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="peak-mini" id="20">
|
||||
<resourceStyle x="475" y="0" height="23" width="23"/>
|
||||
<symbolStyle id="20" name="bowls-borderless">
|
||||
<resourceStyle height="23" x="0" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="peak" id="21">
|
||||
<resourceStyle x="0" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="21" name="bowls">
|
||||
<resourceStyle height="23" x="23" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="information-office" id="22">
|
||||
<resourceStyle x="23" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="22" name="barrier">
|
||||
<resourceStyle height="23" x="46" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="information" id="23">
|
||||
<resourceStyle x="46" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="23" name="bar">
|
||||
<resourceStyle height="23" x="69" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="kindergarten" id="24">
|
||||
<resourceStyle x="69" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="24" name="bus-mini">
|
||||
<resourceStyle height="23" x="92" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="kindergarten2" id="25">
|
||||
<resourceStyle x="92" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="25" name="bus">
|
||||
<resourceStyle height="23" x="115" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="kiosk" id="26">
|
||||
<resourceStyle x="115" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="26" name="bus_sta">
|
||||
<resourceStyle height="23" x="138" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="library" id="27">
|
||||
<resourceStyle x="138" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="27" name="cafe">
|
||||
<resourceStyle height="23" x="161" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="man-made-halfpipe" id="28">
|
||||
<resourceStyle x="161" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="28" name="campsite">
|
||||
<resourceStyle height="23" x="184" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="memorial" id="29">
|
||||
<resourceStyle x="184" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="29" name="cannon">
|
||||
<resourceStyle height="23" x="207" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="university" id="30">
|
||||
<resourceStyle x="207" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="30" name="car_rental">
|
||||
<resourceStyle height="23" x="230" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="mountain_pass" id="31">
|
||||
<resourceStyle x="230" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="31" name="car_repair">
|
||||
<resourceStyle height="23" x="253" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="museum" id="32">
|
||||
<resourceStyle x="253" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="32" name="bakery">
|
||||
<resourceStyle height="23" x="276" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="tramway" id="33">
|
||||
<resourceStyle x="276" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="33" name="castle">
|
||||
<resourceStyle height="23" x="299" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="tramway-mini" id="34">
|
||||
<resourceStyle x="299" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="34" name="atm">
|
||||
<resourceStyle height="23" x="322" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking-mini" id="35">
|
||||
<resourceStyle x="322" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="35" name="athletics">
|
||||
<resourceStyle height="23" x="345" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="toilets" id="36">
|
||||
<resourceStyle x="345" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="36" name="cinema">
|
||||
<resourceStyle height="23" x="368" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="theatre" id="37">
|
||||
<resourceStyle x="368" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="37" name="clothes">
|
||||
<resourceStyle height="23" x="391" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking" id="38">
|
||||
<resourceStyle x="391" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="38" name="cricket-borderless">
|
||||
<resourceStyle height="23" x="414" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="slipway" id="39">
|
||||
<resourceStyle x="414" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="39" name="cricket">
|
||||
<resourceStyle height="23" x="437" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="shooting" id="40">
|
||||
<resourceStyle x="437" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="40" name="curling-borderless">
|
||||
<resourceStyle height="23" x="460" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="shooting-borderless" id="41">
|
||||
<resourceStyle x="460" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="41" name="curling">
|
||||
<resourceStyle height="23" x="483" width="23" y="71"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="shelter" id="42">
|
||||
<resourceStyle x="483" y="71" height="23" width="23"/>
|
||||
<symbolStyle id="42" name="athletics-borderless">
|
||||
<resourceStyle height="23" x="0" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="shelter-fireplace" id="43">
|
||||
<resourceStyle x="0" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="43" name="diving-borderless">
|
||||
<resourceStyle height="23" x="23" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="school" id="44">
|
||||
<resourceStyle x="23" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="44" name="diving">
|
||||
<resourceStyle height="23" x="46" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="ruins" id="45">
|
||||
<resourceStyle x="46" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="45" name="arrow">
|
||||
<resourceStyle height="23" x="69" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="soccer-borderless" id="46">
|
||||
<resourceStyle x="69" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="46" name="dog_park">
|
||||
<resourceStyle height="23" x="92" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="soccer" id="47">
|
||||
<resourceStyle x="92" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="47" name="archery">
|
||||
<resourceStyle height="23" x="115" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="restaurant" id="48">
|
||||
<resourceStyle x="115" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="48" name="earthquake-camp">
|
||||
<resourceStyle height="23" x="138" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="religion" id="49">
|
||||
<resourceStyle x="138" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="49" name="archery-borderless">
|
||||
<resourceStyle height="23" x="161" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="recycling" id="50">
|
||||
<resourceStyle x="161" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="50" name="equestrian-borderless">
|
||||
<resourceStyle height="23" x="184" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="railway-station" id="51">
|
||||
<resourceStyle x="184" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="51" name="equestrian">
|
||||
<resourceStyle height="23" x="207" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="railway-station-mini" id="52">
|
||||
<resourceStyle x="207" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="52" name="fastfood">
|
||||
<resourceStyle height="23" x="230" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="railway-crossing" id="53">
|
||||
<resourceStyle x="230" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="53" name="firebrigade">
|
||||
<resourceStyle height="23" x="253" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="railway-crossing-small" id="54">
|
||||
<resourceStyle x="253" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="54" name="football-borderless">
|
||||
<resourceStyle height="23" x="276" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="pubx" id="55">
|
||||
<resourceStyle x="276" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="55" name="football">
|
||||
<resourceStyle height="23" x="299" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="pub" id="56">
|
||||
<resourceStyle x="299" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="56" name="fountain">
|
||||
<resourceStyle height="23" x="322" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="subway-station-l" id="57">
|
||||
<resourceStyle x="322" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="57" name="gate">
|
||||
<resourceStyle height="23" x="345" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="subway-station-m" id="58">
|
||||
<resourceStyle x="345" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="58" name="golf-course">
|
||||
<resourceStyle height="23" x="368" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="subway-station-s" id="59">
|
||||
<resourceStyle x="368" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="59" name="gymnastics-borderless">
|
||||
<resourceStyle height="23" x="391" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="subway" id="60">
|
||||
<resourceStyle x="391" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="60" name="gymnastics">
|
||||
<resourceStyle height="23" x="414" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="supermarket" id="61">
|
||||
<resourceStyle x="414" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="61" name="hairdresser">
|
||||
<resourceStyle height="23" x="437" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="swimming-borderless" id="62">
|
||||
<resourceStyle x="437" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="62" name="handball-borderless">
|
||||
<resourceStyle height="23" x="460" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="postoffice" id="63">
|
||||
<resourceStyle x="460" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="63" name="handball">
|
||||
<resourceStyle height="23" x="483" width="23" y="94"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="postbox" id="64">
|
||||
<resourceStyle x="483" y="94" height="23" width="23"/>
|
||||
<symbolStyle id="64" name="helipad">
|
||||
<resourceStyle height="23" x="0" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="police" id="65">
|
||||
<resourceStyle x="0" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="65" name="hospital">
|
||||
<resourceStyle height="23" x="23" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="playground" id="66">
|
||||
<resourceStyle x="23" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="66" name="hostel">
|
||||
<resourceStyle height="23" x="46" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="swimming" id="67">
|
||||
<resourceStyle x="46" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="67" name="hotel">
|
||||
<resourceStyle height="23" x="69" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="pharmacy" id="68">
|
||||
<resourceStyle x="69" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="68" name="alpine_hut">
|
||||
<resourceStyle height="23" x="92" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="petrolstation" id="69">
|
||||
<resourceStyle x="92" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="69" name="hunting_closed_high">
|
||||
<resourceStyle height="23" x="115" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="clothes" id="70">
|
||||
<resourceStyle x="115" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="70" name="information-guidepost">
|
||||
<resourceStyle height="23" x="138" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cinema" id="71">
|
||||
<resourceStyle x="138" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="71" name="information-office">
|
||||
<resourceStyle height="23" x="161" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="castle" id="72">
|
||||
<resourceStyle x="161" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="72" name="slipway">
|
||||
<resourceStyle height="23" x="184" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="car_repair" id="73">
|
||||
<resourceStyle x="184" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="73" name="shooting">
|
||||
<resourceStyle height="23" x="207" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="car_rental" id="74">
|
||||
<resourceStyle x="207" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="74" name="kindergarten">
|
||||
<resourceStyle height="23" x="230" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cannon" id="75">
|
||||
<resourceStyle x="230" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="75" name="kindergarten2">
|
||||
<resourceStyle height="23" x="253" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="campsite" id="76">
|
||||
<resourceStyle x="253" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="76" name="kiosk">
|
||||
<resourceStyle height="23" x="276" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cafe" id="77">
|
||||
<resourceStyle x="276" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="77" name="library">
|
||||
<resourceStyle height="23" x="299" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bus_sta" id="78">
|
||||
<resourceStyle x="299" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="78" name="airport">
|
||||
<resourceStyle height="23" x="322" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bus" id="79">
|
||||
<resourceStyle x="322" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="79" name="man-made-halfpipe">
|
||||
<resourceStyle height="23" x="345" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bus-mini" id="80">
|
||||
<resourceStyle x="345" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="80" name="memorial">
|
||||
<resourceStyle height="23" x="368" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bowls" id="81">
|
||||
<resourceStyle x="368" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="81" name="university">
|
||||
<resourceStyle height="23" x="391" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bowls-borderless" id="82">
|
||||
<resourceStyle x="391" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="82" name="mountain_pass">
|
||||
<resourceStyle height="23" x="414" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bird" id="83">
|
||||
<resourceStyle x="414" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="83" name="museum">
|
||||
<resourceStyle height="23" x="437" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bicycle_rental" id="84">
|
||||
<resourceStyle x="437" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="84" name="tramway">
|
||||
<resourceStyle height="23" x="460" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="basketball" id="85">
|
||||
<resourceStyle x="460" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="85" name="tramway-mini">
|
||||
<resourceStyle height="23" x="483" width="23" y="117"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="baseball" id="86">
|
||||
<resourceStyle x="483" y="117" height="23" width="23"/>
|
||||
<symbolStyle id="86" name="parking-mini">
|
||||
<resourceStyle height="23" x="0" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="baseball-borderless" id="87">
|
||||
<resourceStyle x="0" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="87" name="toilets">
|
||||
<resourceStyle height="23" x="23" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="barrier" id="88">
|
||||
<resourceStyle x="23" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="88" name="theatre">
|
||||
<resourceStyle height="23" x="46" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bar" id="89">
|
||||
<resourceStyle x="46" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="89" name="parking">
|
||||
<resourceStyle height="23" x="69" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bakery" id="90">
|
||||
<resourceStyle x="69" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="90" name="tennis">
|
||||
<resourceStyle height="23" x="92" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="atm" id="91">
|
||||
<resourceStyle x="92" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="91" name="tennis-borderless">
|
||||
<resourceStyle height="23" x="115" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="athletics" id="92">
|
||||
<resourceStyle x="115" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="92" name="telephone">
|
||||
<resourceStyle height="23" x="138" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="athletics-borderless" id="93">
|
||||
<resourceStyle x="138" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="93" name="parking_roof">
|
||||
<resourceStyle height="23" x="161" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="arrow" id="94">
|
||||
<resourceStyle x="161" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="94" name="taxi">
|
||||
<resourceStyle height="23" x="184" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="archery" id="95">
|
||||
<resourceStyle x="184" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="95" name="synagogue">
|
||||
<resourceStyle height="23" x="207" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="archery-borderless" id="96">
|
||||
<resourceStyle x="207" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="96" name="peak-mini">
|
||||
<resourceStyle height="23" x="230" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="alpine_hut" id="97">
|
||||
<resourceStyle x="230" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="97" name="peak">
|
||||
<resourceStyle height="23" x="253" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="airport" id="98">
|
||||
<resourceStyle x="253" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="98" name="petrolstation">
|
||||
<resourceStyle height="23" x="276" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="information-guidepost" id="99">
|
||||
<resourceStyle x="276" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="99" name="pharmacy">
|
||||
<resourceStyle height="23" x="299" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="hunting_closed_high" id="100">
|
||||
<resourceStyle x="299" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="100" name="swimming">
|
||||
<resourceStyle height="23" x="322" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="hotel" id="101">
|
||||
<resourceStyle x="322" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="101" name="playground">
|
||||
<resourceStyle height="23" x="345" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="hostel" id="102">
|
||||
<resourceStyle x="345" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="102" name="police">
|
||||
<resourceStyle height="23" x="368" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="hospital" id="103">
|
||||
<resourceStyle x="368" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="103" name="postbox">
|
||||
<resourceStyle height="23" x="391" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="helipad" id="104">
|
||||
<resourceStyle x="391" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="104" name="postoffice">
|
||||
<resourceStyle height="23" x="414" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="handball" id="105">
|
||||
<resourceStyle x="414" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="105" name="swimming-borderless">
|
||||
<resourceStyle height="23" x="437" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="handball-borderless" id="106">
|
||||
<resourceStyle x="437" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="106" name="supermarket">
|
||||
<resourceStyle height="23" x="460" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="hairdresser" id="107">
|
||||
<resourceStyle x="460" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="107" name="subway">
|
||||
<resourceStyle height="23" x="483" width="23" y="140"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="gymnastics" id="108">
|
||||
<resourceStyle x="483" y="140" height="23" width="23"/>
|
||||
<symbolStyle id="108" name="subway-station-s">
|
||||
<resourceStyle height="23" x="0" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="gymnastics-borderless" id="109">
|
||||
<resourceStyle x="0" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="109" name="subway-station-m">
|
||||
<resourceStyle height="23" x="23" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="golf-course" id="110">
|
||||
<resourceStyle x="23" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="110" name="subway-station-l">
|
||||
<resourceStyle height="23" x="46" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="gate" id="111">
|
||||
<resourceStyle x="46" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="111" name="pub">
|
||||
<resourceStyle height="23" x="69" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="fountain" id="112">
|
||||
<resourceStyle x="69" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="112" name="pubx">
|
||||
<resourceStyle height="23" x="92" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="football" id="113">
|
||||
<resourceStyle x="92" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="113" name="railway-crossing-small">
|
||||
<resourceStyle height="23" x="115" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="football-borderless" id="114">
|
||||
<resourceStyle x="115" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="114" name="railway-crossing">
|
||||
<resourceStyle height="23" x="138" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="firebrigade" id="115">
|
||||
<resourceStyle x="138" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="115" name="railway-station-mini">
|
||||
<resourceStyle height="23" x="161" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="fastfood" id="116">
|
||||
<resourceStyle x="161" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="116" name="railway-station">
|
||||
<resourceStyle height="23" x="184" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="equestrian" id="117">
|
||||
<resourceStyle x="184" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="117" name="recycling">
|
||||
<resourceStyle height="23" x="207" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="equestrian-borderless" id="118">
|
||||
<resourceStyle x="207" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="118" name="religion">
|
||||
<resourceStyle height="23" x="230" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="earthquake-camp" id="119">
|
||||
<resourceStyle x="230" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="119" name="restaurant">
|
||||
<resourceStyle height="23" x="253" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="dog_park" id="120">
|
||||
<resourceStyle x="253" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="120" name="soccer">
|
||||
<resourceStyle height="23" x="276" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="diving" id="121">
|
||||
<resourceStyle x="276" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="121" name="soccer-borderless">
|
||||
<resourceStyle height="23" x="299" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="diving-borderless" id="122">
|
||||
<resourceStyle x="299" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="122" name="ruins">
|
||||
<resourceStyle height="23" x="322" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="curling" id="123">
|
||||
<resourceStyle x="322" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="123" name="school">
|
||||
<resourceStyle height="23" x="345" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="curling-borderless" id="124">
|
||||
<resourceStyle x="345" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="124" name="shelter-fireplace">
|
||||
<resourceStyle height="23" x="368" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cricket" id="125">
|
||||
<resourceStyle x="368" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="125" name="shelter">
|
||||
<resourceStyle height="23" x="391" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cricket-borderless" id="126">
|
||||
<resourceStyle x="391" y="163" height="23" width="23"/>
|
||||
<symbolStyle id="126" name="shooting-borderless">
|
||||
<resourceStyle height="23" x="414" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="basketball-borderless" id="127">
|
||||
<resourceStyle x="414" y="163" height="22" width="23"/>
|
||||
<symbolStyle id="127" name="basketball-borderless">
|
||||
<resourceStyle height="22" x="437" width="23" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="khanda" id="128">
|
||||
<resourceStyle x="437" y="163" height="21" width="21"/>
|
||||
<symbolStyle id="128" name="khanda">
|
||||
<resourceStyle height="21" x="460" width="21" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking-permissive" id="129">
|
||||
<resourceStyle x="458" y="163" height="20" width="20"/>
|
||||
<symbolStyle id="129" name="parking-permissive">
|
||||
<resourceStyle height="20" x="481" width="20" y="163"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking-private" id="130">
|
||||
<resourceStyle x="478" y="163" height="20" width="20"/>
|
||||
<symbolStyle id="130" name="parking-private">
|
||||
<resourceStyle height="20" x="0" width="20" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bank" id="131">
|
||||
<resourceStyle x="0" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="131" name="speed_trap">
|
||||
<resourceStyle height="18" x="20" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="church" id="132">
|
||||
<resourceStyle x="18" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="132" name="bank">
|
||||
<resourceStyle height="18" x="38" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="doctor" id="133">
|
||||
<resourceStyle x="36" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="133" name="church">
|
||||
<resourceStyle height="18" x="56" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="drinking_water" id="134">
|
||||
<resourceStyle x="54" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="134" name="doctor">
|
||||
<resourceStyle height="18" x="74" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="embassy" id="135">
|
||||
<resourceStyle x="72" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="135" name="drinking_water">
|
||||
<resourceStyle height="18" x="92" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="current-position" id="136">
|
||||
<resourceStyle x="90" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="136" name="embassy">
|
||||
<resourceStyle height="18" x="110" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="housenumber" id="137">
|
||||
<resourceStyle x="108" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="137" name="roundabout_left">
|
||||
<resourceStyle height="18" x="128" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="windmill" id="138">
|
||||
<resourceStyle x="126" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="138" name="housenumber">
|
||||
<resourceStyle height="18" x="146" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="mosque" id="139">
|
||||
<resourceStyle x="144" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="139" name="windmill">
|
||||
<resourceStyle height="18" x="164" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="traffic_signal" id="140">
|
||||
<resourceStyle x="162" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="140" name="mosque">
|
||||
<resourceStyle height="18" x="182" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_roof-permissive" id="141">
|
||||
<resourceStyle x="180" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="141" name="traffic_signal">
|
||||
<resourceStyle height="18" x="200" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="roundabout_right" id="142">
|
||||
<resourceStyle x="198" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="142" name="parking_roof-permissive">
|
||||
<resourceStyle height="18" x="218" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="roundabout_left" id="143">
|
||||
<resourceStyle x="216" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="143" name="roundabout_right">
|
||||
<resourceStyle height="18" x="236" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="speed_trap" id="144">
|
||||
<resourceStyle x="234" y="186" height="18" width="18"/>
|
||||
<symbolStyle id="144" name="current-position">
|
||||
<resourceStyle height="18" x="254" width="18" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bureau_de_change" id="145">
|
||||
<resourceStyle x="252" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="145" name="viewpoint">
|
||||
<resourceStyle height="17" x="272" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="cave_entrance" id="146">
|
||||
<resourceStyle x="269" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="146" name="power_photovoltaic">
|
||||
<resourceStyle height="17" x="289" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power_wind" id="147">
|
||||
<resourceStyle x="286" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="147" name="power_wind">
|
||||
<resourceStyle height="17" x="306" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power_photovoltaic" id="148">
|
||||
<resourceStyle x="303" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="148" name="power_hydro">
|
||||
<resourceStyle height="17" x="323" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="viewpoint" id="149">
|
||||
<resourceStyle x="320" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="149" name="lighthouse">
|
||||
<resourceStyle height="17" x="340" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power_hydro" id="150">
|
||||
<resourceStyle x="337" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="150" name="bureau_de_change">
|
||||
<resourceStyle height="17" x="357" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="wastewater" id="151">
|
||||
<resourceStyle x="354" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="151" name="waterfall">
|
||||
<resourceStyle height="17" x="374" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="waterfall" id="152">
|
||||
<resourceStyle x="371" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="152" name="cave_entrance">
|
||||
<resourceStyle height="17" x="391" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power_generic" id="153">
|
||||
<resourceStyle x="388" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="153" name="power_generic">
|
||||
<resourceStyle height="17" x="408" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="lighthouse" id="154">
|
||||
<resourceStyle x="405" y="186" height="17" width="17"/>
|
||||
<symbolStyle id="154" name="wastewater">
|
||||
<resourceStyle height="17" x="425" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="route_from" id="155">
|
||||
<resourceStyle x="422" y="186" height="16" width="16"/>
|
||||
<symbolStyle id="155" name="car_sharing">
|
||||
<resourceStyle height="16" x="442" width="17" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="car_sharing" id="156">
|
||||
<resourceStyle x="438" y="186" height="16" width="17"/>
|
||||
<symbolStyle id="156" name="route_from">
|
||||
<resourceStyle height="16" x="459" width="16" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="search-result" id="157">
|
||||
<resourceStyle x="455" y="186" height="15" width="15"/>
|
||||
<symbolStyle id="157" name="api-result">
|
||||
<resourceStyle height="15" x="475" width="15" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="api-result" id="158">
|
||||
<resourceStyle x="470" y="186" height="15" width="15"/>
|
||||
<symbolStyle id="158" name="search-result">
|
||||
<resourceStyle height="15" x="490" width="15" y="186"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="picnic" id="159">
|
||||
<resourceStyle x="485" y="186" height="14" width="14"/>
|
||||
<symbolStyle id="159" name="picnic">
|
||||
<resourceStyle height="14" x="0" width="14" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="bench" id="160">
|
||||
<resourceStyle x="0" y="204" height="14" width="14"/>
|
||||
<symbolStyle id="160" name="bench">
|
||||
<resourceStyle height="14" x="14" width="14" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="park_and_ride-permissive" id="161">
|
||||
<resourceStyle x="14" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="161" name="parking_fee">
|
||||
<resourceStyle height="13" x="28" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="park_and_ride" id="162">
|
||||
<resourceStyle x="37" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="162" name="parking_fee-permissive">
|
||||
<resourceStyle height="13" x="51" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_roof_fee" id="163">
|
||||
<resourceStyle x="60" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="163" name="parking_roof_fee-permissive">
|
||||
<resourceStyle height="13" x="74" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_fee-permissive" id="164">
|
||||
<resourceStyle x="83" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="164" name="park_and_ride">
|
||||
<resourceStyle height="13" x="97" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_fee" id="165">
|
||||
<resourceStyle x="106" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="165" name="parking_roof_fee">
|
||||
<resourceStyle height="13" x="120" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="parking_roof_fee-permissive" id="166">
|
||||
<resourceStyle x="129" y="204" height="13" width="23"/>
|
||||
<symbolStyle id="166" name="park_and_ride-permissive">
|
||||
<resourceStyle height="13" x="143" width="23" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power-tower" id="167">
|
||||
<resourceStyle x="152" y="204" height="11" width="11"/>
|
||||
<symbolStyle id="167" name="vulcan">
|
||||
<resourceStyle height="11" x="166" width="11" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="vulcan" id="168">
|
||||
<resourceStyle x="163" y="204" height="11" width="11"/>
|
||||
<symbolStyle id="168" name="disused">
|
||||
<resourceStyle height="11" x="177" width="11" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="disused" id="169">
|
||||
<resourceStyle x="174" y="204" height="11" width="11"/>
|
||||
<symbolStyle id="169" name="building">
|
||||
<resourceStyle height="11" x="188" width="11" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="building" id="170">
|
||||
<resourceStyle x="185" y="204" height="11" width="11"/>
|
||||
<symbolStyle id="170" name="power-tower">
|
||||
<resourceStyle height="11" x="199" width="11" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="survey_point" id="171">
|
||||
<resourceStyle x="196" y="204" height="10" width="10"/>
|
||||
<symbolStyle id="171" name="survey_point">
|
||||
<resourceStyle height="10" x="210" width="10" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="power-pole" id="172">
|
||||
<resourceStyle x="206" y="204" height="8" width="8"/>
|
||||
<symbolStyle id="172" name="power-pole">
|
||||
<resourceStyle height="8" x="220" width="8" y="206"/>
|
||||
</symbolStyle>
|
||||
<symbolStyle name="tree" id="173">
|
||||
<resourceStyle x="214" y="204" height="7" width="7"/>
|
||||
<symbolStyle id="173" name="tree">
|
||||
<resourceStyle height="7" x="228" width="7" y="206"/>
|
||||
</symbolStyle>
|
||||
</page>
|
||||
</skin>
|
||||
|
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
|
@ -2,177 +2,177 @@
|
|||
<root>
|
||||
<file height="256" width="512">
|
||||
<symbol minX="0" maxX="71" minY="0" maxY="71" name="route_to"/>
|
||||
<symbol minX="71" maxX="102" minY="0" maxY="39" name="current-position-compas"/>
|
||||
<symbol minX="102" maxX="133" minY="0" maxY="39" name="current-routing-compas"/>
|
||||
<symbol minX="133" maxX="168" minY="0" maxY="35" name="search-result-active"/>
|
||||
<symbol minX="168" maxX="201" minY="0" maxY="33" name="compass-image"/>
|
||||
<symbol minX="201" maxX="218" minY="0" maxY="31" name="placemark-yellow"/>
|
||||
<symbol minX="218" maxX="235" minY="0" maxY="31" name="placemark-red"/>
|
||||
<symbol minX="235" maxX="252" minY="0" maxY="31" name="placemark-orange"/>
|
||||
<symbol minX="252" maxX="269" minY="0" maxY="31" name="placemark-pink"/>
|
||||
<symbol minX="269" maxX="286" minY="0" maxY="31" name="placemark-green"/>
|
||||
<symbol minX="286" maxX="303" minY="0" maxY="31" name="placemark-purple"/>
|
||||
<symbol minX="303" maxX="320" minY="0" maxY="31" name="placemark-brown"/>
|
||||
<symbol minX="320" maxX="337" minY="0" maxY="31" name="placemark-blue"/>
|
||||
<symbol minX="337" maxX="360" minY="0" maxY="23" name="tennis"/>
|
||||
<symbol minX="360" maxX="383" minY="0" maxY="23" name="tennis-borderless"/>
|
||||
<symbol minX="383" maxX="406" minY="0" maxY="23" name="telephone"/>
|
||||
<symbol minX="406" maxX="429" minY="0" maxY="23" name="parking_roof"/>
|
||||
<symbol minX="429" maxX="452" minY="0" maxY="23" name="taxi"/>
|
||||
<symbol minX="452" maxX="475" minY="0" maxY="23" name="synagogue"/>
|
||||
<symbol minX="475" maxX="498" minY="0" maxY="23" name="peak-mini"/>
|
||||
<symbol minX="0" maxX="23" minY="71" maxY="94" name="peak"/>
|
||||
<symbol minX="23" maxX="46" minY="71" maxY="94" name="information-office"/>
|
||||
<symbol minX="46" maxX="69" minY="71" maxY="94" name="information"/>
|
||||
<symbol minX="69" maxX="92" minY="71" maxY="94" name="kindergarten"/>
|
||||
<symbol minX="92" maxX="115" minY="71" maxY="94" name="kindergarten2"/>
|
||||
<symbol minX="115" maxX="138" minY="71" maxY="94" name="kiosk"/>
|
||||
<symbol minX="138" maxX="161" minY="71" maxY="94" name="library"/>
|
||||
<symbol minX="161" maxX="184" minY="71" maxY="94" name="man-made-halfpipe"/>
|
||||
<symbol minX="184" maxX="207" minY="71" maxY="94" name="memorial"/>
|
||||
<symbol minX="207" maxX="230" minY="71" maxY="94" name="university"/>
|
||||
<symbol minX="230" maxX="253" minY="71" maxY="94" name="mountain_pass"/>
|
||||
<symbol minX="253" maxX="276" minY="71" maxY="94" name="museum"/>
|
||||
<symbol minX="276" maxX="299" minY="71" maxY="94" name="tramway"/>
|
||||
<symbol minX="299" maxX="322" minY="71" maxY="94" name="tramway-mini"/>
|
||||
<symbol minX="322" maxX="345" minY="71" maxY="94" name="parking-mini"/>
|
||||
<symbol minX="345" maxX="368" minY="71" maxY="94" name="toilets"/>
|
||||
<symbol minX="368" maxX="391" minY="71" maxY="94" name="theatre"/>
|
||||
<symbol minX="391" maxX="414" minY="71" maxY="94" name="parking"/>
|
||||
<symbol minX="414" maxX="437" minY="71" maxY="94" name="slipway"/>
|
||||
<symbol minX="437" maxX="460" minY="71" maxY="94" name="shooting"/>
|
||||
<symbol minX="460" maxX="483" minY="71" maxY="94" name="shooting-borderless"/>
|
||||
<symbol minX="483" maxX="506" minY="71" maxY="94" name="shelter"/>
|
||||
<symbol minX="0" maxX="23" minY="94" maxY="117" name="shelter-fireplace"/>
|
||||
<symbol minX="23" maxX="46" minY="94" maxY="117" name="school"/>
|
||||
<symbol minX="46" maxX="69" minY="94" maxY="117" name="ruins"/>
|
||||
<symbol minX="69" maxX="92" minY="94" maxY="117" name="soccer-borderless"/>
|
||||
<symbol minX="92" maxX="115" minY="94" maxY="117" name="soccer"/>
|
||||
<symbol minX="115" maxX="138" minY="94" maxY="117" name="restaurant"/>
|
||||
<symbol minX="138" maxX="161" minY="94" maxY="117" name="religion"/>
|
||||
<symbol minX="161" maxX="184" minY="94" maxY="117" name="recycling"/>
|
||||
<symbol minX="184" maxX="207" minY="94" maxY="117" name="railway-station"/>
|
||||
<symbol minX="207" maxX="230" minY="94" maxY="117" name="railway-station-mini"/>
|
||||
<symbol minX="230" maxX="253" minY="94" maxY="117" name="railway-crossing"/>
|
||||
<symbol minX="253" maxX="276" minY="94" maxY="117" name="railway-crossing-small"/>
|
||||
<symbol minX="276" maxX="299" minY="94" maxY="117" name="pubx"/>
|
||||
<symbol minX="299" maxX="322" minY="94" maxY="117" name="pub"/>
|
||||
<symbol minX="322" maxX="345" minY="94" maxY="117" name="subway-station-l"/>
|
||||
<symbol minX="345" maxX="368" minY="94" maxY="117" name="subway-station-m"/>
|
||||
<symbol minX="368" maxX="391" minY="94" maxY="117" name="subway-station-s"/>
|
||||
<symbol minX="391" maxX="414" minY="94" maxY="117" name="subway"/>
|
||||
<symbol minX="414" maxX="437" minY="94" maxY="117" name="supermarket"/>
|
||||
<symbol minX="437" maxX="460" minY="94" maxY="117" name="swimming-borderless"/>
|
||||
<symbol minX="460" maxX="483" minY="94" maxY="117" name="postoffice"/>
|
||||
<symbol minX="483" maxX="506" minY="94" maxY="117" name="postbox"/>
|
||||
<symbol minX="0" maxX="23" minY="117" maxY="140" name="police"/>
|
||||
<symbol minX="23" maxX="46" minY="117" maxY="140" name="playground"/>
|
||||
<symbol minX="46" maxX="69" minY="117" maxY="140" name="swimming"/>
|
||||
<symbol minX="69" maxX="92" minY="117" maxY="140" name="pharmacy"/>
|
||||
<symbol minX="92" maxX="115" minY="117" maxY="140" name="petrolstation"/>
|
||||
<symbol minX="115" maxX="138" minY="117" maxY="140" name="clothes"/>
|
||||
<symbol minX="138" maxX="161" minY="117" maxY="140" name="cinema"/>
|
||||
<symbol minX="161" maxX="184" minY="117" maxY="140" name="castle"/>
|
||||
<symbol minX="184" maxX="207" minY="117" maxY="140" name="car_repair"/>
|
||||
<symbol minX="207" maxX="230" minY="117" maxY="140" name="car_rental"/>
|
||||
<symbol minX="230" maxX="253" minY="117" maxY="140" name="cannon"/>
|
||||
<symbol minX="253" maxX="276" minY="117" maxY="140" name="campsite"/>
|
||||
<symbol minX="276" maxX="299" minY="117" maxY="140" name="cafe"/>
|
||||
<symbol minX="299" maxX="322" minY="117" maxY="140" name="bus_sta"/>
|
||||
<symbol minX="322" maxX="345" minY="117" maxY="140" name="bus"/>
|
||||
<symbol minX="345" maxX="368" minY="117" maxY="140" name="bus-mini"/>
|
||||
<symbol minX="368" maxX="391" minY="117" maxY="140" name="bowls"/>
|
||||
<symbol minX="391" maxX="414" minY="117" maxY="140" name="bowls-borderless"/>
|
||||
<symbol minX="414" maxX="437" minY="117" maxY="140" name="bird"/>
|
||||
<symbol minX="437" maxX="460" minY="117" maxY="140" name="bicycle_rental"/>
|
||||
<symbol minX="460" maxX="483" minY="117" maxY="140" name="basketball"/>
|
||||
<symbol minX="483" maxX="506" minY="117" maxY="140" name="baseball"/>
|
||||
<symbol minX="0" maxX="23" minY="140" maxY="163" name="baseball-borderless"/>
|
||||
<symbol minX="23" maxX="46" minY="140" maxY="163" name="barrier"/>
|
||||
<symbol minX="46" maxX="69" minY="140" maxY="163" name="bar"/>
|
||||
<symbol minX="69" maxX="92" minY="140" maxY="163" name="bakery"/>
|
||||
<symbol minX="92" maxX="115" minY="140" maxY="163" name="atm"/>
|
||||
<symbol minX="115" maxX="138" minY="140" maxY="163" name="athletics"/>
|
||||
<symbol minX="138" maxX="161" minY="140" maxY="163" name="athletics-borderless"/>
|
||||
<symbol minX="161" maxX="184" minY="140" maxY="163" name="arrow"/>
|
||||
<symbol minX="184" maxX="207" minY="140" maxY="163" name="archery"/>
|
||||
<symbol minX="207" maxX="230" minY="140" maxY="163" name="archery-borderless"/>
|
||||
<symbol minX="230" maxX="253" minY="140" maxY="163" name="alpine_hut"/>
|
||||
<symbol minX="253" maxX="276" minY="140" maxY="163" name="airport"/>
|
||||
<symbol minX="276" maxX="299" minY="140" maxY="163" name="information-guidepost"/>
|
||||
<symbol minX="299" maxX="322" minY="140" maxY="163" name="hunting_closed_high"/>
|
||||
<symbol minX="322" maxX="345" minY="140" maxY="163" name="hotel"/>
|
||||
<symbol minX="345" maxX="368" minY="140" maxY="163" name="hostel"/>
|
||||
<symbol minX="368" maxX="391" minY="140" maxY="163" name="hospital"/>
|
||||
<symbol minX="391" maxX="414" minY="140" maxY="163" name="helipad"/>
|
||||
<symbol minX="414" maxX="437" minY="140" maxY="163" name="handball"/>
|
||||
<symbol minX="437" maxX="460" minY="140" maxY="163" name="handball-borderless"/>
|
||||
<symbol minX="460" maxX="483" minY="140" maxY="163" name="hairdresser"/>
|
||||
<symbol minX="483" maxX="506" minY="140" maxY="163" name="gymnastics"/>
|
||||
<symbol minX="0" maxX="23" minY="163" maxY="186" name="gymnastics-borderless"/>
|
||||
<symbol minX="23" maxX="46" minY="163" maxY="186" name="golf-course"/>
|
||||
<symbol minX="46" maxX="69" minY="163" maxY="186" name="gate"/>
|
||||
<symbol minX="69" maxX="92" minY="163" maxY="186" name="fountain"/>
|
||||
<symbol minX="92" maxX="115" minY="163" maxY="186" name="football"/>
|
||||
<symbol minX="115" maxX="138" minY="163" maxY="186" name="football-borderless"/>
|
||||
<symbol minX="138" maxX="161" minY="163" maxY="186" name="firebrigade"/>
|
||||
<symbol minX="161" maxX="184" minY="163" maxY="186" name="fastfood"/>
|
||||
<symbol minX="184" maxX="207" minY="163" maxY="186" name="equestrian"/>
|
||||
<symbol minX="207" maxX="230" minY="163" maxY="186" name="equestrian-borderless"/>
|
||||
<symbol minX="230" maxX="253" minY="163" maxY="186" name="earthquake-camp"/>
|
||||
<symbol minX="253" maxX="276" minY="163" maxY="186" name="dog_park"/>
|
||||
<symbol minX="276" maxX="299" minY="163" maxY="186" name="diving"/>
|
||||
<symbol minX="299" maxX="322" minY="163" maxY="186" name="diving-borderless"/>
|
||||
<symbol minX="322" maxX="345" minY="163" maxY="186" name="curling"/>
|
||||
<symbol minX="345" maxX="368" minY="163" maxY="186" name="curling-borderless"/>
|
||||
<symbol minX="368" maxX="391" minY="163" maxY="186" name="cricket"/>
|
||||
<symbol minX="391" maxX="414" minY="163" maxY="186" name="cricket-borderless"/>
|
||||
<symbol minX="414" maxX="437" minY="163" maxY="185" name="basketball-borderless"/>
|
||||
<symbol minX="437" maxX="458" minY="163" maxY="184" name="khanda"/>
|
||||
<symbol minX="458" maxX="478" minY="163" maxY="183" name="parking-permissive"/>
|
||||
<symbol minX="478" maxX="498" minY="163" maxY="183" name="parking-private"/>
|
||||
<symbol minX="0" maxX="18" minY="186" maxY="204" name="bank"/>
|
||||
<symbol minX="18" maxX="36" minY="186" maxY="204" name="church"/>
|
||||
<symbol minX="36" maxX="54" minY="186" maxY="204" name="doctor"/>
|
||||
<symbol minX="54" maxX="72" minY="186" maxY="204" name="drinking_water"/>
|
||||
<symbol minX="72" maxX="90" minY="186" maxY="204" name="embassy"/>
|
||||
<symbol minX="90" maxX="108" minY="186" maxY="204" name="current-position"/>
|
||||
<symbol minX="108" maxX="126" minY="186" maxY="204" name="housenumber"/>
|
||||
<symbol minX="126" maxX="144" minY="186" maxY="204" name="windmill"/>
|
||||
<symbol minX="144" maxX="162" minY="186" maxY="204" name="mosque"/>
|
||||
<symbol minX="162" maxX="180" minY="186" maxY="204" name="traffic_signal"/>
|
||||
<symbol minX="180" maxX="198" minY="186" maxY="204" name="parking_roof-permissive"/>
|
||||
<symbol minX="198" maxX="216" minY="186" maxY="204" name="roundabout_right"/>
|
||||
<symbol minX="216" maxX="234" minY="186" maxY="204" name="roundabout_left"/>
|
||||
<symbol minX="234" maxX="252" minY="186" maxY="204" name="speed_trap"/>
|
||||
<symbol minX="252" maxX="269" minY="186" maxY="203" name="bureau_de_change"/>
|
||||
<symbol minX="269" maxX="286" minY="186" maxY="203" name="cave_entrance"/>
|
||||
<symbol minX="286" maxX="303" minY="186" maxY="203" name="power_wind"/>
|
||||
<symbol minX="303" maxX="320" minY="186" maxY="203" name="power_photovoltaic"/>
|
||||
<symbol minX="320" maxX="337" minY="186" maxY="203" name="viewpoint"/>
|
||||
<symbol minX="337" maxX="354" minY="186" maxY="203" name="power_hydro"/>
|
||||
<symbol minX="354" maxX="371" minY="186" maxY="203" name="wastewater"/>
|
||||
<symbol minX="371" maxX="388" minY="186" maxY="203" name="waterfall"/>
|
||||
<symbol minX="388" maxX="405" minY="186" maxY="203" name="power_generic"/>
|
||||
<symbol minX="405" maxX="422" minY="186" maxY="203" name="lighthouse"/>
|
||||
<symbol minX="422" maxX="438" minY="186" maxY="202" name="route_from"/>
|
||||
<symbol minX="438" maxX="455" minY="186" maxY="202" name="car_sharing"/>
|
||||
<symbol minX="455" maxX="470" minY="186" maxY="201" name="search-result"/>
|
||||
<symbol minX="470" maxX="485" minY="186" maxY="201" name="api-result"/>
|
||||
<symbol minX="485" maxX="499" minY="186" maxY="200" name="picnic"/>
|
||||
<symbol minX="0" maxX="14" minY="204" maxY="218" name="bench"/>
|
||||
<symbol minX="14" maxX="37" minY="204" maxY="217" name="park_and_ride-permissive"/>
|
||||
<symbol minX="37" maxX="60" minY="204" maxY="217" name="park_and_ride"/>
|
||||
<symbol minX="60" maxX="83" minY="204" maxY="217" name="parking_roof_fee"/>
|
||||
<symbol minX="83" maxX="106" minY="204" maxY="217" name="parking_fee-permissive"/>
|
||||
<symbol minX="106" maxX="129" minY="204" maxY="217" name="parking_fee"/>
|
||||
<symbol minX="129" maxX="152" minY="204" maxY="217" name="parking_roof_fee-permissive"/>
|
||||
<symbol minX="152" maxX="163" minY="204" maxY="215" name="power-tower"/>
|
||||
<symbol minX="163" maxX="174" minY="204" maxY="215" name="vulcan"/>
|
||||
<symbol minX="174" maxX="185" minY="204" maxY="215" name="disused"/>
|
||||
<symbol minX="185" maxX="196" minY="204" maxY="215" name="building"/>
|
||||
<symbol minX="196" maxX="206" minY="204" maxY="214" name="survey_point"/>
|
||||
<symbol minX="206" maxX="214" minY="204" maxY="212" name="power-pole"/>
|
||||
<symbol minX="214" maxX="221" minY="204" maxY="211" name="tree"/>
|
||||
<symbol minX="71" maxX="131" minY="0" maxY="60" name="compass-image"/>
|
||||
<symbol minX="131" maxX="162" minY="0" maxY="39" name="current-routing-compas"/>
|
||||
<symbol minX="162" maxX="193" minY="0" maxY="39" name="current-position-compas"/>
|
||||
<symbol minX="193" maxX="228" minY="0" maxY="35" name="search-result-active"/>
|
||||
<symbol minX="228" maxX="245" minY="0" maxY="31" name="placemark-green"/>
|
||||
<symbol minX="245" maxX="262" minY="0" maxY="31" name="placemark-brown"/>
|
||||
<symbol minX="262" maxX="279" minY="0" maxY="31" name="placemark-pink"/>
|
||||
<symbol minX="279" maxX="296" minY="0" maxY="31" name="placemark-purple"/>
|
||||
<symbol minX="296" maxX="313" minY="0" maxY="31" name="placemark-blue"/>
|
||||
<symbol minX="313" maxX="330" minY="0" maxY="31" name="placemark-red"/>
|
||||
<symbol minX="330" maxX="347" minY="0" maxY="31" name="placemark-yellow"/>
|
||||
<symbol minX="347" maxX="364" minY="0" maxY="31" name="placemark-orange"/>
|
||||
<symbol minX="364" maxX="387" minY="0" maxY="23" name="baseball"/>
|
||||
<symbol minX="387" maxX="410" minY="0" maxY="23" name="information"/>
|
||||
<symbol minX="410" maxX="433" minY="0" maxY="23" name="basketball"/>
|
||||
<symbol minX="433" maxX="456" minY="0" maxY="23" name="baseball-borderless"/>
|
||||
<symbol minX="456" maxX="479" minY="0" maxY="23" name="bicycle_rental"/>
|
||||
<symbol minX="479" maxX="502" minY="0" maxY="23" name="bird"/>
|
||||
<symbol minX="0" maxX="23" minY="71" maxY="94" name="bowls-borderless"/>
|
||||
<symbol minX="23" maxX="46" minY="71" maxY="94" name="bowls"/>
|
||||
<symbol minX="46" maxX="69" minY="71" maxY="94" name="barrier"/>
|
||||
<symbol minX="69" maxX="92" minY="71" maxY="94" name="bar"/>
|
||||
<symbol minX="92" maxX="115" minY="71" maxY="94" name="bus-mini"/>
|
||||
<symbol minX="115" maxX="138" minY="71" maxY="94" name="bus"/>
|
||||
<symbol minX="138" maxX="161" minY="71" maxY="94" name="bus_sta"/>
|
||||
<symbol minX="161" maxX="184" minY="71" maxY="94" name="cafe"/>
|
||||
<symbol minX="184" maxX="207" minY="71" maxY="94" name="campsite"/>
|
||||
<symbol minX="207" maxX="230" minY="71" maxY="94" name="cannon"/>
|
||||
<symbol minX="230" maxX="253" minY="71" maxY="94" name="car_rental"/>
|
||||
<symbol minX="253" maxX="276" minY="71" maxY="94" name="car_repair"/>
|
||||
<symbol minX="276" maxX="299" minY="71" maxY="94" name="bakery"/>
|
||||
<symbol minX="299" maxX="322" minY="71" maxY="94" name="castle"/>
|
||||
<symbol minX="322" maxX="345" minY="71" maxY="94" name="atm"/>
|
||||
<symbol minX="345" maxX="368" minY="71" maxY="94" name="athletics"/>
|
||||
<symbol minX="368" maxX="391" minY="71" maxY="94" name="cinema"/>
|
||||
<symbol minX="391" maxX="414" minY="71" maxY="94" name="clothes"/>
|
||||
<symbol minX="414" maxX="437" minY="71" maxY="94" name="cricket-borderless"/>
|
||||
<symbol minX="437" maxX="460" minY="71" maxY="94" name="cricket"/>
|
||||
<symbol minX="460" maxX="483" minY="71" maxY="94" name="curling-borderless"/>
|
||||
<symbol minX="483" maxX="506" minY="71" maxY="94" name="curling"/>
|
||||
<symbol minX="0" maxX="23" minY="94" maxY="117" name="athletics-borderless"/>
|
||||
<symbol minX="23" maxX="46" minY="94" maxY="117" name="diving-borderless"/>
|
||||
<symbol minX="46" maxX="69" minY="94" maxY="117" name="diving"/>
|
||||
<symbol minX="69" maxX="92" minY="94" maxY="117" name="arrow"/>
|
||||
<symbol minX="92" maxX="115" minY="94" maxY="117" name="dog_park"/>
|
||||
<symbol minX="115" maxX="138" minY="94" maxY="117" name="archery"/>
|
||||
<symbol minX="138" maxX="161" minY="94" maxY="117" name="earthquake-camp"/>
|
||||
<symbol minX="161" maxX="184" minY="94" maxY="117" name="archery-borderless"/>
|
||||
<symbol minX="184" maxX="207" minY="94" maxY="117" name="equestrian-borderless"/>
|
||||
<symbol minX="207" maxX="230" minY="94" maxY="117" name="equestrian"/>
|
||||
<symbol minX="230" maxX="253" minY="94" maxY="117" name="fastfood"/>
|
||||
<symbol minX="253" maxX="276" minY="94" maxY="117" name="firebrigade"/>
|
||||
<symbol minX="276" maxX="299" minY="94" maxY="117" name="football-borderless"/>
|
||||
<symbol minX="299" maxX="322" minY="94" maxY="117" name="football"/>
|
||||
<symbol minX="322" maxX="345" minY="94" maxY="117" name="fountain"/>
|
||||
<symbol minX="345" maxX="368" minY="94" maxY="117" name="gate"/>
|
||||
<symbol minX="368" maxX="391" minY="94" maxY="117" name="golf-course"/>
|
||||
<symbol minX="391" maxX="414" minY="94" maxY="117" name="gymnastics-borderless"/>
|
||||
<symbol minX="414" maxX="437" minY="94" maxY="117" name="gymnastics"/>
|
||||
<symbol minX="437" maxX="460" minY="94" maxY="117" name="hairdresser"/>
|
||||
<symbol minX="460" maxX="483" minY="94" maxY="117" name="handball-borderless"/>
|
||||
<symbol minX="483" maxX="506" minY="94" maxY="117" name="handball"/>
|
||||
<symbol minX="0" maxX="23" minY="117" maxY="140" name="helipad"/>
|
||||
<symbol minX="23" maxX="46" minY="117" maxY="140" name="hospital"/>
|
||||
<symbol minX="46" maxX="69" minY="117" maxY="140" name="hostel"/>
|
||||
<symbol minX="69" maxX="92" minY="117" maxY="140" name="hotel"/>
|
||||
<symbol minX="92" maxX="115" minY="117" maxY="140" name="alpine_hut"/>
|
||||
<symbol minX="115" maxX="138" minY="117" maxY="140" name="hunting_closed_high"/>
|
||||
<symbol minX="138" maxX="161" minY="117" maxY="140" name="information-guidepost"/>
|
||||
<symbol minX="161" maxX="184" minY="117" maxY="140" name="information-office"/>
|
||||
<symbol minX="184" maxX="207" minY="117" maxY="140" name="slipway"/>
|
||||
<symbol minX="207" maxX="230" minY="117" maxY="140" name="shooting"/>
|
||||
<symbol minX="230" maxX="253" minY="117" maxY="140" name="kindergarten"/>
|
||||
<symbol minX="253" maxX="276" minY="117" maxY="140" name="kindergarten2"/>
|
||||
<symbol minX="276" maxX="299" minY="117" maxY="140" name="kiosk"/>
|
||||
<symbol minX="299" maxX="322" minY="117" maxY="140" name="library"/>
|
||||
<symbol minX="322" maxX="345" minY="117" maxY="140" name="airport"/>
|
||||
<symbol minX="345" maxX="368" minY="117" maxY="140" name="man-made-halfpipe"/>
|
||||
<symbol minX="368" maxX="391" minY="117" maxY="140" name="memorial"/>
|
||||
<symbol minX="391" maxX="414" minY="117" maxY="140" name="university"/>
|
||||
<symbol minX="414" maxX="437" minY="117" maxY="140" name="mountain_pass"/>
|
||||
<symbol minX="437" maxX="460" minY="117" maxY="140" name="museum"/>
|
||||
<symbol minX="460" maxX="483" minY="117" maxY="140" name="tramway"/>
|
||||
<symbol minX="483" maxX="506" minY="117" maxY="140" name="tramway-mini"/>
|
||||
<symbol minX="0" maxX="23" minY="140" maxY="163" name="parking-mini"/>
|
||||
<symbol minX="23" maxX="46" minY="140" maxY="163" name="toilets"/>
|
||||
<symbol minX="46" maxX="69" minY="140" maxY="163" name="theatre"/>
|
||||
<symbol minX="69" maxX="92" minY="140" maxY="163" name="parking"/>
|
||||
<symbol minX="92" maxX="115" minY="140" maxY="163" name="tennis"/>
|
||||
<symbol minX="115" maxX="138" minY="140" maxY="163" name="tennis-borderless"/>
|
||||
<symbol minX="138" maxX="161" minY="140" maxY="163" name="telephone"/>
|
||||
<symbol minX="161" maxX="184" minY="140" maxY="163" name="parking_roof"/>
|
||||
<symbol minX="184" maxX="207" minY="140" maxY="163" name="taxi"/>
|
||||
<symbol minX="207" maxX="230" minY="140" maxY="163" name="synagogue"/>
|
||||
<symbol minX="230" maxX="253" minY="140" maxY="163" name="peak-mini"/>
|
||||
<symbol minX="253" maxX="276" minY="140" maxY="163" name="peak"/>
|
||||
<symbol minX="276" maxX="299" minY="140" maxY="163" name="petrolstation"/>
|
||||
<symbol minX="299" maxX="322" minY="140" maxY="163" name="pharmacy"/>
|
||||
<symbol minX="322" maxX="345" minY="140" maxY="163" name="swimming"/>
|
||||
<symbol minX="345" maxX="368" minY="140" maxY="163" name="playground"/>
|
||||
<symbol minX="368" maxX="391" minY="140" maxY="163" name="police"/>
|
||||
<symbol minX="391" maxX="414" minY="140" maxY="163" name="postbox"/>
|
||||
<symbol minX="414" maxX="437" minY="140" maxY="163" name="postoffice"/>
|
||||
<symbol minX="437" maxX="460" minY="140" maxY="163" name="swimming-borderless"/>
|
||||
<symbol minX="460" maxX="483" minY="140" maxY="163" name="supermarket"/>
|
||||
<symbol minX="483" maxX="506" minY="140" maxY="163" name="subway"/>
|
||||
<symbol minX="0" maxX="23" minY="163" maxY="186" name="subway-station-s"/>
|
||||
<symbol minX="23" maxX="46" minY="163" maxY="186" name="subway-station-m"/>
|
||||
<symbol minX="46" maxX="69" minY="163" maxY="186" name="subway-station-l"/>
|
||||
<symbol minX="69" maxX="92" minY="163" maxY="186" name="pub"/>
|
||||
<symbol minX="92" maxX="115" minY="163" maxY="186" name="pubx"/>
|
||||
<symbol minX="115" maxX="138" minY="163" maxY="186" name="railway-crossing-small"/>
|
||||
<symbol minX="138" maxX="161" minY="163" maxY="186" name="railway-crossing"/>
|
||||
<symbol minX="161" maxX="184" minY="163" maxY="186" name="railway-station-mini"/>
|
||||
<symbol minX="184" maxX="207" minY="163" maxY="186" name="railway-station"/>
|
||||
<symbol minX="207" maxX="230" minY="163" maxY="186" name="recycling"/>
|
||||
<symbol minX="230" maxX="253" minY="163" maxY="186" name="religion"/>
|
||||
<symbol minX="253" maxX="276" minY="163" maxY="186" name="restaurant"/>
|
||||
<symbol minX="276" maxX="299" minY="163" maxY="186" name="soccer"/>
|
||||
<symbol minX="299" maxX="322" minY="163" maxY="186" name="soccer-borderless"/>
|
||||
<symbol minX="322" maxX="345" minY="163" maxY="186" name="ruins"/>
|
||||
<symbol minX="345" maxX="368" minY="163" maxY="186" name="school"/>
|
||||
<symbol minX="368" maxX="391" minY="163" maxY="186" name="shelter-fireplace"/>
|
||||
<symbol minX="391" maxX="414" minY="163" maxY="186" name="shelter"/>
|
||||
<symbol minX="414" maxX="437" minY="163" maxY="186" name="shooting-borderless"/>
|
||||
<symbol minX="437" maxX="460" minY="163" maxY="185" name="basketball-borderless"/>
|
||||
<symbol minX="460" maxX="481" minY="163" maxY="184" name="khanda"/>
|
||||
<symbol minX="481" maxX="501" minY="163" maxY="183" name="parking-permissive"/>
|
||||
<symbol minX="0" maxX="20" minY="186" maxY="206" name="parking-private"/>
|
||||
<symbol minX="20" maxX="38" minY="186" maxY="204" name="speed_trap"/>
|
||||
<symbol minX="38" maxX="56" minY="186" maxY="204" name="bank"/>
|
||||
<symbol minX="56" maxX="74" minY="186" maxY="204" name="church"/>
|
||||
<symbol minX="74" maxX="92" minY="186" maxY="204" name="doctor"/>
|
||||
<symbol minX="92" maxX="110" minY="186" maxY="204" name="drinking_water"/>
|
||||
<symbol minX="110" maxX="128" minY="186" maxY="204" name="embassy"/>
|
||||
<symbol minX="128" maxX="146" minY="186" maxY="204" name="roundabout_left"/>
|
||||
<symbol minX="146" maxX="164" minY="186" maxY="204" name="housenumber"/>
|
||||
<symbol minX="164" maxX="182" minY="186" maxY="204" name="windmill"/>
|
||||
<symbol minX="182" maxX="200" minY="186" maxY="204" name="mosque"/>
|
||||
<symbol minX="200" maxX="218" minY="186" maxY="204" name="traffic_signal"/>
|
||||
<symbol minX="218" maxX="236" minY="186" maxY="204" name="parking_roof-permissive"/>
|
||||
<symbol minX="236" maxX="254" minY="186" maxY="204" name="roundabout_right"/>
|
||||
<symbol minX="254" maxX="272" minY="186" maxY="204" name="current-position"/>
|
||||
<symbol minX="272" maxX="289" minY="186" maxY="203" name="viewpoint"/>
|
||||
<symbol minX="289" maxX="306" minY="186" maxY="203" name="power_photovoltaic"/>
|
||||
<symbol minX="306" maxX="323" minY="186" maxY="203" name="power_wind"/>
|
||||
<symbol minX="323" maxX="340" minY="186" maxY="203" name="power_hydro"/>
|
||||
<symbol minX="340" maxX="357" minY="186" maxY="203" name="lighthouse"/>
|
||||
<symbol minX="357" maxX="374" minY="186" maxY="203" name="bureau_de_change"/>
|
||||
<symbol minX="374" maxX="391" minY="186" maxY="203" name="waterfall"/>
|
||||
<symbol minX="391" maxX="408" minY="186" maxY="203" name="cave_entrance"/>
|
||||
<symbol minX="408" maxX="425" minY="186" maxY="203" name="power_generic"/>
|
||||
<symbol minX="425" maxX="442" minY="186" maxY="203" name="wastewater"/>
|
||||
<symbol minX="442" maxX="459" minY="186" maxY="202" name="car_sharing"/>
|
||||
<symbol minX="459" maxX="475" minY="186" maxY="202" name="route_from"/>
|
||||
<symbol minX="475" maxX="490" minY="186" maxY="201" name="api-result"/>
|
||||
<symbol minX="490" maxX="505" minY="186" maxY="201" name="search-result"/>
|
||||
<symbol minX="0" maxX="14" minY="206" maxY="220" name="picnic"/>
|
||||
<symbol minX="14" maxX="28" minY="206" maxY="220" name="bench"/>
|
||||
<symbol minX="28" maxX="51" minY="206" maxY="219" name="parking_fee"/>
|
||||
<symbol minX="51" maxX="74" minY="206" maxY="219" name="parking_fee-permissive"/>
|
||||
<symbol minX="74" maxX="97" minY="206" maxY="219" name="parking_roof_fee-permissive"/>
|
||||
<symbol minX="97" maxX="120" minY="206" maxY="219" name="park_and_ride"/>
|
||||
<symbol minX="120" maxX="143" minY="206" maxY="219" name="parking_roof_fee"/>
|
||||
<symbol minX="143" maxX="166" minY="206" maxY="219" name="park_and_ride-permissive"/>
|
||||
<symbol minX="166" maxX="177" minY="206" maxY="217" name="vulcan"/>
|
||||
<symbol minX="177" maxX="188" minY="206" maxY="217" name="disused"/>
|
||||
<symbol minX="188" maxX="199" minY="206" maxY="217" name="building"/>
|
||||
<symbol minX="199" maxX="210" minY="206" maxY="217" name="power-tower"/>
|
||||
<symbol minX="210" maxX="220" minY="206" maxY="216" name="survey_point"/>
|
||||
<symbol minX="220" maxX="228" minY="206" maxY="214" name="power-pole"/>
|
||||
<symbol minX="228" maxX="235" minY="206" maxY="213" name="tree"/>
|
||||
</file>
|
||||
</root>
|
||||
|
|
Before Width: | Height: | Size: 853 B After Width: | Height: | Size: 1.4 KiB |
|
@ -1,18 +0,0 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class BottomMenu;
|
||||
@protocol BottomMenuDelegate <NSObject>
|
||||
|
||||
- (void)bottomMenu:(BottomMenu *)menu didPressItemWithName:(NSString *)itemName appURL:(NSString *)appURL webURL:(NSString *)webURL;
|
||||
|
||||
@end
|
||||
|
||||
@interface BottomMenu : UIView
|
||||
|
||||
@property (weak) id <BottomMenuDelegate> delegate;
|
||||
|
||||
- (void)setMenuHidden:(BOOL)hidden animated:(BOOL)animated;
|
||||
@property (readonly, nonatomic) BOOL menuHidden;
|
||||
|
||||
@end
|
|
@ -1,283 +0,0 @@
|
|||
|
||||
#import "BottomMenu.h"
|
||||
#import "BottomMenuCell.h"
|
||||
#import "UIKitCategories.h"
|
||||
#include "../../../platform/platform.hpp"
|
||||
#include "../../../platform/settings.hpp"
|
||||
#import "AppInfo.h"
|
||||
#import "ImageDownloader.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "Framework.h"
|
||||
|
||||
@interface BottomMenu () <UITableViewDataSource, UITableViewDelegate, ImageDownloaderDelegate>
|
||||
|
||||
@property (nonatomic) UITableView * tableView;
|
||||
@property (nonatomic) SolidTouchView * fadeView;
|
||||
@property (nonatomic) NSArray * items;
|
||||
@property (nonatomic) NSMutableDictionary * imageDownloaders;
|
||||
|
||||
@end
|
||||
|
||||
@implementation BottomMenu
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
|
||||
[self addSubview:self.fadeView];
|
||||
[self addSubview:self.tableView];
|
||||
|
||||
_menuHidden = YES;
|
||||
|
||||
self.imageDownloaders = [[NSMutableDictionary alloc] init];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appInfoSynced:) name:AppInfoSyncedNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(outOfDateCountriesCountChanged:) name:MapsStatusChangedNotification object:nil];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)outOfDateCountriesCountChanged:(NSNotification *)notification
|
||||
{
|
||||
NSInteger const row = [self.items indexOfObjectPassingTest:^(id obj, NSUInteger i, BOOL *stop){
|
||||
return [obj[@"Id"] isEqualToString:@"Maps"];
|
||||
}];
|
||||
BottomMenuCell * cell = (BottomMenuCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]];
|
||||
cell.badgeView.value = [[notification userInfo][@"OutOfDate"] integerValue];
|
||||
}
|
||||
|
||||
- (NSArray *)generateItems
|
||||
{
|
||||
NSMutableArray * items = [[NSMutableArray alloc] init];
|
||||
bool adsEnabled = true;
|
||||
(void)Settings::Get("MenuLinksEnabled", adsEnabled);
|
||||
if (adsEnabled)
|
||||
{
|
||||
NSArray * serverItems = [[AppInfo sharedInfo] featureValue:AppFeatureBottomMenuItems forKey:@"Items"];
|
||||
if ([serverItems count])
|
||||
[items addObjectsFromArray:serverItems];
|
||||
}
|
||||
|
||||
NSArray * standardItems = @[@{@"Id" : @"Maps", @"Title" : L(@"download_maps"), @"Icon" : @"IconMap"},
|
||||
@{@"Id" : @"Settings", @"Title" : L(@"settings_and_more"), @"Icon" : @"IconSettings"},
|
||||
@{@"Id" : @"Share", @"Title" : L(@"share_my_location"), @"Icon" : @"IconShare"}];
|
||||
[items addObjectsFromArray:standardItems];
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
- (void)appInfoSynced:(NSNotification *)notification
|
||||
{
|
||||
[self reload];
|
||||
}
|
||||
|
||||
- (void)didMoveToSuperview
|
||||
{
|
||||
[self reload];
|
||||
}
|
||||
|
||||
- (void)reload
|
||||
{
|
||||
self.items = [self generateItems];
|
||||
[self.tableView reloadData];
|
||||
[self align];
|
||||
}
|
||||
|
||||
- (void)align
|
||||
{
|
||||
CGFloat menuHeight = [self.items count] * [BottomMenuCell cellHeight];
|
||||
if (self.superview.width > self.superview.height)
|
||||
menuHeight = MIN(menuHeight, IPAD ? menuHeight : self.superview.height - 92);
|
||||
|
||||
self.tableView.frame = CGRectMake(self.tableView.minX, self.tableView.minY, self.width, menuHeight);
|
||||
|
||||
[self setMenuHidden:self.menuHidden animated:NO];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[self align];
|
||||
}
|
||||
|
||||
#pragma mark - TableView
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
return [self.items count];
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
NSDictionary * item = self.items[indexPath.row];
|
||||
|
||||
BottomMenuCell * cell = (BottomMenuCell *)[tableView dequeueReusableCellWithIdentifier:[BottomMenuCell className]];
|
||||
if (!cell)
|
||||
cell = [[BottomMenuCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[BottomMenuCell className]];
|
||||
|
||||
if (item[@"Icon"])
|
||||
{
|
||||
cell.iconImageView.image = [UIImage imageNamed:item[@"Icon"]];
|
||||
}
|
||||
else if (item[@"IconURLs"])
|
||||
{
|
||||
NSString * itemId = item[@"Id"];
|
||||
NSString * imageName = itemId;
|
||||
NSString * imagePath = [[self imagesPath] stringByAppendingPathComponent:imageName];
|
||||
NSData * imageData = [NSData dataWithContentsOfFile:imagePath];
|
||||
UIImage * image;
|
||||
if (imageData)
|
||||
image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale];
|
||||
if (image)
|
||||
cell.iconImageView.image = image;
|
||||
else if (!self.imageDownloaders[itemId])
|
||||
{
|
||||
ImageDownloader * downloader = [[ImageDownloader alloc] init];
|
||||
downloader.delegate = self;
|
||||
downloader.objectId = itemId;
|
||||
self.imageDownloaders[itemId] = downloader;
|
||||
|
||||
NSDictionary * links = item[@"IconURLs"];
|
||||
NSString * key = [NSString stringWithFormat:@"%lix", (long)[UIScreen mainScreen].scale];
|
||||
NSString * link = links[key];
|
||||
[downloader startDownloadingWithURL:[NSURL URLWithString:link]];
|
||||
}
|
||||
}
|
||||
|
||||
cell.titleLabel.textColor = item[@"Color"] ? [UIColor colorWithColorCode:item[@"Color"]] : [UIColor whiteColor];
|
||||
|
||||
if (item[@"Title"])
|
||||
{
|
||||
cell.titleLabel.text = item[@"Title"];
|
||||
}
|
||||
else if (item[@"Titles"])
|
||||
{
|
||||
NSDictionary * titles = item[@"Titles"];
|
||||
NSString * title = titles[[[NSLocale preferredLanguages] firstObject]];
|
||||
if (!title)
|
||||
title = titles[@"*"];
|
||||
|
||||
cell.titleLabel.text = title;
|
||||
}
|
||||
|
||||
if ([item[@"Id"] isEqualToString:@"Maps"])
|
||||
cell.badgeView.value = GetFramework().GetCountryTree().GetActiveMapLayout().GetOutOfDateCount();
|
||||
else
|
||||
cell.badgeView.value = 0;
|
||||
|
||||
if (indexPath.row == [self.items count] - 1)
|
||||
cell.separator.hidden = YES;
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (void)imageDownloaderDidFinishLoading:(ImageDownloader *)downloader
|
||||
{
|
||||
NSInteger row = 0;
|
||||
for (NSInteger i = 0; i < [self.items count]; i++)
|
||||
{
|
||||
if ([self.items[i][@"Id"] isEqualToString:downloader.objectId])
|
||||
{
|
||||
row = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
BottomMenuCell * cell = (BottomMenuCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0]];
|
||||
cell.iconImageView.image = downloader.image;
|
||||
|
||||
NSString * imageName = downloader.objectId;
|
||||
NSString * imagePath = [[self imagesPath] stringByAppendingPathComponent:imageName];
|
||||
[UIImagePNGRepresentation(downloader.image) writeToFile:imagePath atomically:YES];
|
||||
|
||||
[self.imageDownloaders removeObjectForKey:downloader.objectId];
|
||||
}
|
||||
|
||||
- (NSString *)imagesPath
|
||||
{
|
||||
NSString * libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
|
||||
NSString * path = [libraryPath stringByAppendingPathComponent:@"bottom_menu_images/"];
|
||||
if (![[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:nil])
|
||||
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
|
||||
return path;
|
||||
}
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
return [BottomMenuCell cellHeight];
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
|
||||
{
|
||||
NSDictionary * item = self.items[indexPath.row];
|
||||
NSDictionary * urls = item[@"WebURLs"];
|
||||
NSString * url = urls[[[NSLocale preferredLanguages] firstObject]];
|
||||
if (!url)
|
||||
url = urls[@"*"];
|
||||
[self.delegate bottomMenu:self didPressItemWithName:item[@"Id"] appURL:item[@"AppURL"] webURL:url];
|
||||
[self.tableView deselectRowAtIndexPath:self.tableView.indexPathForSelectedRow animated:YES];
|
||||
}
|
||||
|
||||
- (void)setMenuHidden:(BOOL)hidden animated:(BOOL)animated
|
||||
{
|
||||
_menuHidden = hidden;
|
||||
[UIView animateWithDuration:(animated ? 0.25 : 0) delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
|
||||
if (hidden)
|
||||
{
|
||||
self.userInteractionEnabled = NO;
|
||||
self.tableView.minY = self.tableView.superview.height;
|
||||
self.fadeView.alpha = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.userInteractionEnabled = YES;
|
||||
self.tableView.maxY = self.tableView.superview.height;
|
||||
self.fadeView.alpha = 1;
|
||||
}
|
||||
} completion:^(BOOL finished) {}];
|
||||
}
|
||||
|
||||
- (void)tap:(UITapGestureRecognizer *)sender
|
||||
{
|
||||
[self setMenuHidden:YES animated:YES];
|
||||
}
|
||||
|
||||
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
|
||||
{
|
||||
return !self.menuHidden;
|
||||
}
|
||||
|
||||
- (UITableView *)tableView
|
||||
{
|
||||
if (!_tableView)
|
||||
{
|
||||
_tableView = [[UITableView alloc] initWithFrame:CGRectZero];
|
||||
_tableView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
|
||||
_tableView.delegate = self;
|
||||
_tableView.dataSource = self;
|
||||
_tableView.alwaysBounceVertical = NO;
|
||||
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||
_tableView.backgroundColor = [UIColor colorWithColorCode:@"1D1F29"];
|
||||
}
|
||||
return _tableView;
|
||||
}
|
||||
|
||||
- (SolidTouchView *)fadeView
|
||||
{
|
||||
if (!_fadeView)
|
||||
{
|
||||
_fadeView = [[SolidTouchView alloc] initWithFrame:self.bounds];
|
||||
_fadeView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5];
|
||||
_fadeView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
|
||||
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
|
||||
[_fadeView addGestureRecognizer:tap];
|
||||
}
|
||||
return _fadeView;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
@end
|
|
@ -1,14 +0,0 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "BadgeView.h"
|
||||
|
||||
@interface BottomMenuCell : UITableViewCell
|
||||
|
||||
@property (nonatomic, readonly) UIImageView * iconImageView;
|
||||
@property (nonatomic, readonly) UILabel * titleLabel;
|
||||
@property (nonatomic, readonly) BadgeView * badgeView;
|
||||
@property (nonatomic, readonly) UIImageView * separator;
|
||||
|
||||
+ (CGFloat)cellHeight;
|
||||
|
||||
@end
|
|
@ -1,103 +0,0 @@
|
|||
|
||||
#import "BottomMenuCell.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
@interface BottomMenuCell ()
|
||||
|
||||
@property (nonatomic) UIImageView * separator;
|
||||
@property (nonatomic) UIImageView * iconImageView;
|
||||
@property (nonatomic) UILabel * titleLabel;
|
||||
@property (nonatomic) BadgeView * badgeView;
|
||||
|
||||
@end
|
||||
|
||||
@implementation BottomMenuCell
|
||||
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
|
||||
{
|
||||
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
|
||||
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
|
||||
UIView * highlightView = [[UIView alloc] initWithFrame:self.bounds];
|
||||
highlightView.backgroundColor = [UIColor colorWithColorCode:@"15d081"];
|
||||
self.selectedBackgroundView = highlightView;
|
||||
|
||||
[self.contentView addSubview:self.titleLabel];
|
||||
[self.contentView addSubview:self.iconImageView];
|
||||
[self.contentView addSubview:self.separator];
|
||||
[self.contentView addSubview:self.badgeView];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
+ (CGFloat)cellHeight
|
||||
{
|
||||
return 50;
|
||||
}
|
||||
|
||||
- (void)prepareForReuse
|
||||
{
|
||||
self.separator.hidden = NO;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
self.selectedBackgroundView.frame = self.bounds;
|
||||
|
||||
CGFloat shift = 19;
|
||||
self.separator.minX = shift;
|
||||
self.separator.width = self.width - 2 * shift;
|
||||
self.separator.maxY = self.height;
|
||||
|
||||
self.titleLabel.size = CGSizeMake(self.width - 70, self.height);
|
||||
[self.titleLabel sizeToIntegralFit];
|
||||
self.titleLabel.minX = 53;
|
||||
self.titleLabel.midY = self.height / 2 - 2;
|
||||
|
||||
self.badgeView.minX = self.titleLabel.maxX + 3;
|
||||
self.badgeView.minY = self.titleLabel.minY - 5;
|
||||
|
||||
self.iconImageView.origin = CGPointMake(19, INTEGRAL(4.5));
|
||||
}
|
||||
|
||||
- (UIImageView *)separator
|
||||
{
|
||||
if (!_separator)
|
||||
{
|
||||
UIImage * separatorImage = [[UIImage imageNamed:@"SearchCellSeparator"] resizableImageWithCapInsets:UIEdgeInsetsZero];
|
||||
_separator = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.width, 1)];
|
||||
_separator.image = separatorImage;
|
||||
}
|
||||
return _separator;
|
||||
}
|
||||
|
||||
- (UIImageView *)iconImageView
|
||||
{
|
||||
if (!_iconImageView)
|
||||
{
|
||||
_iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 23, 41)];
|
||||
_iconImageView.contentMode = UIViewContentModeCenter;
|
||||
}
|
||||
return _iconImageView;
|
||||
}
|
||||
|
||||
- (UILabel *)titleLabel
|
||||
{
|
||||
if (!_titleLabel)
|
||||
{
|
||||
_titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
|
||||
_titleLabel.backgroundColor = [UIColor clearColor];
|
||||
_titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:17.5];
|
||||
}
|
||||
return _titleLabel;
|
||||
}
|
||||
|
||||
- (BadgeView *)badgeView
|
||||
{
|
||||
if (!_badgeView)
|
||||
_badgeView = [[BadgeView alloc] init];
|
||||
return _badgeView;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,17 @@
|
|||
//
|
||||
// MWMLocationButton.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface MWMLocationButton : NSObject
|
||||
|
||||
@property (nonatomic) BOOL hidden;
|
||||
|
||||
- (instancetype)initWithParentView:(UIView *)view;
|
||||
|
||||
@end
|
|
@ -0,0 +1,67 @@
|
|||
//
|
||||
// MWMLocationButton.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMLocationButton.h"
|
||||
#import "MWMLocationButtonView.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
static NSString * const kMWMLocationButtonViewNibName = @"MWMLocationButtonView";
|
||||
|
||||
@interface MWMLocationButton()
|
||||
|
||||
@property (nonatomic) IBOutlet MWMLocationButtonView * button;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMLocationButton
|
||||
|
||||
- (instancetype)initWithParentView:(UIView *)view
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
[[NSBundle mainBundle] loadNibNamed:kMWMLocationButtonViewNibName owner:self options:nil];
|
||||
[view addSubview:self.button];
|
||||
[self configLocationListener];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)configLocationListener
|
||||
{
|
||||
typedef void (*LocationStateModeFnT)(id, SEL, location::State::Mode);
|
||||
SEL locationStateModeSelector = @selector(onLocationStateModeChanged:);
|
||||
LocationStateModeFnT locationStateModeFn = (LocationStateModeFnT)[self methodForSelector:locationStateModeSelector];
|
||||
|
||||
GetFramework().GetLocationState()->AddStateModeListener(bind(locationStateModeFn, self, locationStateModeSelector, _1));
|
||||
}
|
||||
|
||||
- (void)onLocationStateModeChanged:(location::State::Mode)state
|
||||
{
|
||||
self.button.locationState = state;
|
||||
}
|
||||
|
||||
- (IBAction)buttonPressed:(id)sender
|
||||
{
|
||||
GetFramework().GetLocationState()->SwitchToNextMode();
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (BOOL)hidden
|
||||
{
|
||||
return self.button.hidden;
|
||||
}
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
self.button.hidden = hidden;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,20 @@
|
|||
//
|
||||
// MWMLocationButtonView.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#include "map/location_state.hpp"
|
||||
|
||||
@interface MWMLocationButtonView : UIButton
|
||||
|
||||
@property (nonatomic) location::State::Mode locationState;
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
|
||||
- (instancetype)init __attribute__((unavailable("init is not available")));
|
||||
|
||||
@end
|
|
@ -0,0 +1,145 @@
|
|||
//
|
||||
// MWMLocationButtonView.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMLocationButtonView.h"
|
||||
#import "MWMMapViewControlsCommon.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
@interface MWMLocationButtonView()
|
||||
|
||||
@property (nonatomic) CGRect defaultBounds;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMLocationButtonView
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self)
|
||||
{
|
||||
self.defaultBounds = self.bounds;
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
self.locationState = location::State::UnknownPosition;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
self.bounds = self.defaultBounds;
|
||||
[self layoutXPosition:self.hidden];
|
||||
self.maxY = self.superview.height - 2.0 * kViewControlsOffsetToBounds;
|
||||
}
|
||||
|
||||
- (void)layoutXPosition:(BOOL)hidden
|
||||
{
|
||||
if (hidden)
|
||||
self.maxX = 0.0;
|
||||
else
|
||||
self.minX = 2.0 * kViewControlsOffsetToBounds;
|
||||
}
|
||||
|
||||
- (void)setImageNamed:(location::State::Mode)state
|
||||
{
|
||||
if (state == location::State::PendingPosition)
|
||||
[self setPendingPositionAnimation];
|
||||
else
|
||||
{
|
||||
static NSDictionary const * const stateMap = @{@(location::State::UnknownPosition).stringValue : @"btn_white_unknow_position",
|
||||
@(location::State::NotFollow).stringValue : @"btn_white_target_off_1",
|
||||
@(location::State::Follow).stringValue : @"btn_white_target_on",
|
||||
@(location::State::RotateAndFollow).stringValue : @"btn_white_direction"};
|
||||
[self.imageView stopAnimating];
|
||||
NSString * const imageName = stateMap[@(state).stringValue];
|
||||
self.highlighted = NO;
|
||||
[self setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
|
||||
[self setImage:[UIImage imageNamed:[imageName stringByAppendingString:@"_pressed"]] forState:UIControlStateHighlighted];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setAnimation:(NSArray *)animationImages once:(BOOL)once
|
||||
{
|
||||
UIImageView const * const animationIV = self.imageView;
|
||||
animationIV.animationImages = animationImages;
|
||||
animationIV.animationDuration = framesDuration(animationImages.count);
|
||||
animationIV.animationRepeatCount = once ? 1 : 0;
|
||||
[animationIV startAnimating];
|
||||
}
|
||||
|
||||
- (void)setPendingPositionAnimation
|
||||
{
|
||||
NSString const * const imageName = @"btn_white_loading_";
|
||||
[self setImage:[UIImage imageNamed:[imageName stringByAppendingString:@"1"]] forState:UIControlStateNormal];
|
||||
static NSUInteger const animationImagesCount = 18;
|
||||
NSMutableArray * const animationImages = [NSMutableArray arrayWithCapacity:animationImagesCount];
|
||||
for (NSUInteger i = 0; i < animationImagesCount; ++i)
|
||||
animationImages[i] = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", imageName, @(i+1)]];
|
||||
[self setAnimation:animationImages once:NO];
|
||||
}
|
||||
|
||||
- (void)changeButtonFromState:(location::State::Mode)beginState toState:(location::State::Mode)endState
|
||||
{
|
||||
[self setImageNamed:endState];
|
||||
static NSDictionary const * const stateMap = @{@(location::State::UnknownPosition).stringValue : @"noposition",
|
||||
@(location::State::PendingPosition).stringValue : @"pending",
|
||||
@(location::State::NotFollow).stringValue : @"notfollow",
|
||||
@(location::State::Follow).stringValue : @"follow",
|
||||
@(location::State::RotateAndFollow).stringValue : @"followandrotate"};
|
||||
NSString const * const changeAnimation = [NSString stringWithFormat:@"%@_to_%@_", stateMap[@(beginState).stringValue], stateMap[@(endState).stringValue]];
|
||||
NSLog(@"changeAnimation: %@", changeAnimation);
|
||||
static NSUInteger const animationImagesCount = 6;
|
||||
NSMutableArray * const animationImages = [NSMutableArray arrayWithCapacity:animationImagesCount];
|
||||
for (NSUInteger i = 0; i < animationImagesCount; ++i)
|
||||
animationImages[i] = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", changeAnimation, @(i+1)]];
|
||||
[self setAnimation:animationImages once:YES];
|
||||
[self changeStateFinish];
|
||||
}
|
||||
|
||||
- (void)changeStateFinish
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(), ^
|
||||
{
|
||||
if (self.imageView.isAnimating)
|
||||
[self changeStateFinish];
|
||||
else
|
||||
[self setImageNamed:self.locationState];
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setLocationState:(location::State::Mode)locationState
|
||||
{
|
||||
if (_locationState == locationState)
|
||||
[self setImageNamed:locationState];
|
||||
else
|
||||
{
|
||||
[self changeButtonFromState:_locationState toState:locationState];
|
||||
_locationState = locationState;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
if (!hidden)
|
||||
super.hidden = NO;
|
||||
[self layoutXPosition:!hidden];
|
||||
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
|
||||
{
|
||||
[self layoutXPosition:hidden];
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
if (hidden)
|
||||
super.hidden = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMLocationButton">
|
||||
<connections>
|
||||
<outlet property="button" destination="5qS-Qi-k1g" id="YgC-Eq-sz4"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="5qS-Qi-k1g" customClass="MWMLocationButtonView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<state key="normal" image="btn_white_target_off_1">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_white_target_off_1_pressed"/>
|
||||
<connections>
|
||||
<action selector="buttonPressed:" destination="-1" eventType="touchUpInside" id="qeG-JS-5c9"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="267.5" y="254"/>
|
||||
</button>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="btn_white_target_off_1" width="56" height="56"/>
|
||||
<image name="btn_white_target_off_1_pressed" width="56" height="56"/>
|
||||
</resources>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
|
@ -0,0 +1,23 @@
|
|||
//
|
||||
// MWMMapViewControlsManager.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class MapViewController;
|
||||
|
||||
@interface MWMMapViewControlsManager : NSObject
|
||||
|
||||
@property (nonatomic) BOOL hidden;
|
||||
@property (nonatomic) BOOL zoomHidden;
|
||||
@property (nonatomic) BOOL menuHidden;
|
||||
@property (nonatomic) BOOL locationHidden;
|
||||
|
||||
- (instancetype)initWithParentController:(MapViewController *)controller;
|
||||
- (void)resetZoomButtonsVisibility;
|
||||
|
||||
@end
|
|
@ -0,0 +1,76 @@
|
|||
//
|
||||
// MWMMapViewControlsManager.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 14.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
#import "MWMSideMenuManager.h"
|
||||
#import "MWMZoomButtons.h"
|
||||
#import "MWMLocationButton.h"
|
||||
#import "MapViewController.h"
|
||||
|
||||
@interface MWMMapViewControlsManager()
|
||||
|
||||
@property (nonatomic) MWMSideMenuManager * menuManager;
|
||||
@property (nonatomic) MWMZoomButtons * zoomButtons;
|
||||
@property (nonatomic) MWMLocationButton * locationButton;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMMapViewControlsManager
|
||||
|
||||
- (instancetype)initWithParentController:(MapViewController *)controller
|
||||
{
|
||||
self = [super init];
|
||||
if (self && controller)
|
||||
{
|
||||
self.menuManager = [[MWMSideMenuManager alloc] initWithParentController:controller];
|
||||
self.zoomButtons = [[MWMZoomButtons alloc] initWithParentView:controller.view];
|
||||
self.locationButton = [[MWMLocationButton alloc] initWithParentView:controller.view];
|
||||
self.hidden = NO;
|
||||
self.zoomHidden = NO;
|
||||
self.menuHidden = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)resetZoomButtonsVisibility
|
||||
{
|
||||
[self.zoomButtons resetVisibility];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
if (_hidden != hidden)
|
||||
{
|
||||
_hidden = hidden;
|
||||
self.zoomHidden = _zoomHidden;
|
||||
self.menuHidden = _menuHidden;
|
||||
self.locationHidden = _locationHidden;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setZoomHidden:(BOOL)zoomHidden
|
||||
{
|
||||
_zoomHidden = zoomHidden;
|
||||
self.zoomButtons.hidden = self.hidden || zoomHidden;
|
||||
}
|
||||
|
||||
- (void)setMenuHidden:(BOOL)menuHidden
|
||||
{
|
||||
_menuHidden = menuHidden;
|
||||
self.menuManager.state = (self.hidden || menuHidden) ? MWMSideMenuStateHidden : MWMSideMenuStateInactive;
|
||||
}
|
||||
|
||||
- (void)setLocationHidden:(BOOL)locationHidden
|
||||
{
|
||||
_locationHidden = locationHidden;
|
||||
self.locationButton.hidden = self.hidden || locationHidden;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,18 @@
|
|||
//
|
||||
// MWMSideMenuCommon.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 24.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
static NSTimeInterval const kMenuViewHideFramesCount = 7.0;
|
||||
|
||||
static inline NSTimeInterval framesDuration(NSTimeInterval const framesCount)
|
||||
{
|
||||
static NSTimeInterval const kFPS = 30.0;
|
||||
static NSTimeInterval const kFrameDuration = 1.0 / kFPS;
|
||||
return kFrameDuration * framesCount;
|
||||
}
|
||||
|
||||
static CGFloat const kViewControlsOffsetToBounds = 4.0;
|
|
@ -0,0 +1,19 @@
|
|||
//
|
||||
// MWMSideMenuButton.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 24.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface MWMSideMenuButton : UIButton
|
||||
|
||||
- (void)addSelfToView:(UIView *)parentView;
|
||||
- (void)addSelfHiddenToView:(UIView *)parentView;
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
|
||||
- (instancetype)init __attribute__((unavailable("init is not available")));
|
||||
|
||||
@end
|
|
@ -0,0 +1,103 @@
|
|||
//
|
||||
// MWMSideMenuButton.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 24.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMSideMenuButton.h"
|
||||
#import "MWMMapViewControlsCommon.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
@interface MWMSideMenuButton()
|
||||
|
||||
@property (nonatomic) CGRect defaultBounds;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSideMenuButton
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self)
|
||||
{
|
||||
self.defaultBounds = self.bounds;
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setup
|
||||
{
|
||||
UIImageView const * const animationIV = self.imageView;
|
||||
NSString const * const imageName = @"btn_green_menu_";
|
||||
[self setImage:[UIImage imageNamed:[imageName stringByAppendingString:@"1"]] forState:UIControlStateNormal];
|
||||
static NSUInteger const animationImagesCount = 4;
|
||||
NSMutableArray * const animationImages = [NSMutableArray arrayWithCapacity:animationImagesCount];
|
||||
for (NSUInteger i = 0; i < animationImagesCount; ++i)
|
||||
animationImages[i] = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", imageName, @(animationImagesCount - i)]];
|
||||
animationIV.animationImages = animationImages;
|
||||
animationIV.animationDuration = framesDuration(animationIV.animationImages.count);
|
||||
animationIV.animationRepeatCount = 1;
|
||||
[animationIV startAnimating];
|
||||
}
|
||||
|
||||
- (void)addSelfToView:(UIView *)parentView
|
||||
{
|
||||
self.hidden = NO;
|
||||
if (self.superview == parentView)
|
||||
return;
|
||||
[self setup];
|
||||
[parentView addSubview:self];
|
||||
self.alpha = 0.0;
|
||||
[UIView animateWithDuration:framesDuration(3) animations:^
|
||||
{
|
||||
self.alpha = 1.0;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)addSelfHiddenToView:(UIView *)parentView
|
||||
{
|
||||
super.hidden = YES;
|
||||
[parentView addSubview:self];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
self.bounds = self.defaultBounds;
|
||||
[self layoutXPosition:self.hidden];
|
||||
self.maxY = self.superview.height - 2.0 * kViewControlsOffsetToBounds;
|
||||
}
|
||||
|
||||
- (void)layoutXPosition:(BOOL)hidden
|
||||
{
|
||||
if (hidden)
|
||||
self.minX = self.superview.width;
|
||||
else
|
||||
self.maxX = self.superview.width - 2.0 * kViewControlsOffsetToBounds;
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
if (super.hidden == hidden)
|
||||
return;
|
||||
if (!hidden)
|
||||
super.hidden = NO;
|
||||
[self layoutXPosition:!hidden];
|
||||
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
|
||||
{
|
||||
[self layoutXPosition:hidden];
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
if (hidden)
|
||||
super.hidden = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,26 @@
|
|||
//
|
||||
// MWMSideMenuManager.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 24.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@class MapViewController;
|
||||
|
||||
typedef NS_ENUM(NSUInteger, MWMSideMenuState)
|
||||
{
|
||||
MWMSideMenuStateHidden,
|
||||
MWMSideMenuStateInactive,
|
||||
MWMSideMenuStateActive
|
||||
};
|
||||
|
||||
@interface MWMSideMenuManager : NSObject
|
||||
|
||||
@property (nonatomic) MWMSideMenuState state;
|
||||
|
||||
- (instancetype)initWithParentController:(MapViewController *)controller;
|
||||
|
||||
@end
|
|
@ -0,0 +1,138 @@
|
|||
//
|
||||
// MWMSideMenuManager.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 24.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMSideMenuManager.h"
|
||||
#import "MWMSideMenuButton.h"
|
||||
#import "MWMSideMenuView.h"
|
||||
#import "BookmarksRootVC.h"
|
||||
#import "CountryTreeVC.h"
|
||||
#import "SettingsAndMoreVC.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "LocationManager.h"
|
||||
#import "ShareActionSheet.h"
|
||||
#import "MapViewController.h"
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
#import "3party/Alohalytics/src/alohalytics_objc.h"
|
||||
|
||||
static NSString * const kMWMSideMenuViewsNibName = @"MWMSideMenuViews";
|
||||
|
||||
extern NSString * const kAlohalyticsTapEventKey;
|
||||
|
||||
@interface MWMSideMenuManager()
|
||||
|
||||
@property (weak, nonatomic) MapViewController * parentController;
|
||||
@property (nonatomic) IBOutlet MWMSideMenuButton * menuButton;
|
||||
@property (nonatomic) IBOutlet MWMSideMenuView * sideMenu;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSideMenuManager
|
||||
|
||||
- (instancetype)initWithParentController:(MapViewController *)controller
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
self.parentController = controller;
|
||||
[[NSBundle mainBundle] loadNibNamed:kMWMSideMenuViewsNibName owner:self options:nil];
|
||||
[self addCloseMenuWithTap];
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)addCloseMenuWithTap
|
||||
{
|
||||
UITapGestureRecognizer * const tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleMenu)];
|
||||
[self.sideMenu.dimBackground addGestureRecognizer:tap];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)menuActionOpenBookmarks
|
||||
{
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"bookmarks"];
|
||||
BookmarksRootVC * const vc = [[BookmarksRootVC alloc] init];
|
||||
[self.parentController.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)menuActionDownloadMaps
|
||||
{
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"downloader"];
|
||||
CountryTreeVC * const vc = [[CountryTreeVC alloc] initWithNodePosition:-1];
|
||||
[self.parentController.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)menuActionOpenSettings
|
||||
{
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"settingsAndMore"];
|
||||
SettingsAndMoreVC * const vc = [[SettingsAndMoreVC alloc] initWithStyle:UITableViewStyleGrouped];
|
||||
[self.parentController.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
|
||||
- (IBAction)menuActionShareLocation
|
||||
{
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"share@"];
|
||||
CLLocation const * const location = [MapsAppDelegate theApp].m_locationManager.lastLocation;
|
||||
if (!location)
|
||||
{
|
||||
[[[UIAlertView alloc] initWithTitle:L(@"unknown_current_position") message:nil delegate:nil cancelButtonTitle:L(@"ok") otherButtonTitles:nil] show];
|
||||
return;
|
||||
}
|
||||
CLLocationCoordinate2D const coord = location.coordinate;
|
||||
double const gX = MercatorBounds::LonToX(coord.longitude);
|
||||
double const gY = MercatorBounds::LatToY(coord.latitude);
|
||||
ShareInfo * const info = [[ShareInfo alloc] initWithText:nil gX:gX gY:gY myPosition:YES];
|
||||
self.parentController.shareActionSheet = [[ShareActionSheet alloc] initWithInfo:info viewController:self.parentController];
|
||||
UIView const * const parentView = self.parentController.view;
|
||||
[self.parentController.shareActionSheet showFromRect:CGRectMake(parentView.midX, parentView.height - 40.0, 0.0, 0.0)];
|
||||
}
|
||||
|
||||
- (IBAction)menuActionOpenSearch
|
||||
{
|
||||
self.parentController.controlsManager.hidden = YES;
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"search"];
|
||||
[self.parentController.searchView setState:SearchViewStateFullscreen animated:YES withCallback:YES];
|
||||
}
|
||||
|
||||
- (IBAction)toggleMenu
|
||||
{
|
||||
if (self.state == MWMSideMenuStateActive)
|
||||
self.state = MWMSideMenuStateInactive;
|
||||
else if (self.state == MWMSideMenuStateInactive)
|
||||
self.state = MWMSideMenuStateActive;
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setState:(MWMSideMenuState)state
|
||||
{
|
||||
_state = state;
|
||||
switch (state)
|
||||
{
|
||||
case MWMSideMenuStateActive:
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"menu"];
|
||||
[self.sideMenu addSelfToView:self.parentController.view];
|
||||
[self.menuButton removeFromSuperview];
|
||||
break;
|
||||
case MWMSideMenuStateInactive:
|
||||
[self.menuButton addSelfToView:self.parentController.view];
|
||||
[self.sideMenu removeFromSuperviewAnimated];
|
||||
break;
|
||||
case MWMSideMenuStateHidden:
|
||||
[self.menuButton addSelfHiddenToView:self.parentController.view];
|
||||
[self.sideMenu removeFromSuperview];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,21 @@
|
|||
//
|
||||
// MWMSideMenuView.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 23.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface MWMSideMenuView : UIView
|
||||
|
||||
@property (weak, nonatomic, readonly) IBOutlet UIView * dimBackground;
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
|
||||
- (instancetype)init __attribute__((unavailable("init is not available")));
|
||||
|
||||
- (void)addSelfToView:(UIView *)parentView;
|
||||
- (void)removeFromSuperviewAnimated;
|
||||
|
||||
@end
|
|
@ -0,0 +1,218 @@
|
|||
//
|
||||
// MWMSideMenuView.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 23.04.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMSideMenuView.h"
|
||||
#import "UIKitCategories.h"
|
||||
#import "MWMMapViewControlsCommon.h"
|
||||
#import "Framework.h"
|
||||
|
||||
static CGSize const kBadgeSize = CGSizeMake(24.0, 24.0);
|
||||
|
||||
@interface MWMSideMenuView()
|
||||
|
||||
@property (weak, nonatomic, readwrite) IBOutlet UIView * dimBackground;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIButton * bookmarksButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * downloadMapsButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * settingsButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * shareLocationButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * searchButton;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIButton * bookmarksLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * downloadMapsLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * settingsLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * shareLocationLabel;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * searchLabel;
|
||||
|
||||
@property (weak, nonatomic) IBOutlet UIImageView * downloadBadge;
|
||||
@property (weak, nonatomic) IBOutlet UILabel * downloadCount;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMSideMenuView
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self)
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
// Prevent super call to stop event propagation
|
||||
// [super touchesBegan:touches withEvent:event];
|
||||
}
|
||||
|
||||
- (void)setup
|
||||
{
|
||||
UIImageView const * const animationIV = self.searchButton.imageView;
|
||||
NSString const * const imageName = @"btn_green_menu_";
|
||||
static NSUInteger const animationImagesCount = 4;
|
||||
NSMutableArray * const animationImages = [NSMutableArray arrayWithCapacity:animationImagesCount];
|
||||
for (NSUInteger i = 0; i < animationImagesCount; ++i)
|
||||
animationImages[i] = [UIImage imageNamed:[NSString stringWithFormat:@"%@%@", imageName, @(i+1)]];
|
||||
animationIV.animationImages = animationImages;
|
||||
animationIV.animationDuration = framesDuration(animationIV.animationImages.count);
|
||||
animationIV.animationRepeatCount = 1;
|
||||
[animationIV startAnimating];
|
||||
[self setNeedsLayout];
|
||||
}
|
||||
|
||||
- (void)addSelfToView:(UIView *)parentView
|
||||
{
|
||||
if (self.superview == parentView)
|
||||
return;
|
||||
[self setup];
|
||||
[parentView addSubview:self];
|
||||
self.frame = parentView.bounds;
|
||||
self.alpha = 1.0;
|
||||
self.downloadBadge.hidden = YES;
|
||||
self.downloadCount.hidden = YES;
|
||||
[self updateMenuBackground];
|
||||
[self updateMenuUI];
|
||||
}
|
||||
|
||||
- (void)removeFromSuperviewAnimated
|
||||
{
|
||||
[UIView animateWithDuration:framesDuration(3) animations:^
|
||||
{
|
||||
self.alpha = 0.0;
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
[super removeFromSuperview];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
self.frame = self.superview.frame;
|
||||
self.dimBackground.frame = self.frame;
|
||||
|
||||
CGSize const boundsSize = self.size;
|
||||
NSUInteger const buttonsCount = 5;
|
||||
CGFloat offsetBetweenButtons = 66.0;
|
||||
CGFloat const offsetLabelToButton = 10.0;
|
||||
CGFloat const buttonCenterOffsetToBounds = 0.5 * self.searchButton.height + 2.0 * kViewControlsOffsetToBounds;
|
||||
|
||||
if (boundsSize.width > boundsSize.height)
|
||||
{
|
||||
CGFloat const buttonHeight = boundsSize.height;
|
||||
offsetBetweenButtons = MIN(offsetBetweenButtons, (boundsSize.height - 2.0 * (buttonCenterOffsetToBounds - 0.5 * buttonHeight) - buttonsCount*buttonHeight) / (buttonsCount - 1) + buttonHeight);
|
||||
}
|
||||
|
||||
CGPoint buttonCenter = CGPointMake(boundsSize.width - buttonCenterOffsetToBounds, boundsSize.height - buttonCenterOffsetToBounds);
|
||||
|
||||
self.searchButton.center = buttonCenter;
|
||||
self.searchLabel.center = buttonCenter;
|
||||
buttonCenter.y -= offsetBetweenButtons;
|
||||
self.shareLocationButton.center = buttonCenter;
|
||||
self.shareLocationLabel.center = buttonCenter;
|
||||
buttonCenter.y -= offsetBetweenButtons;
|
||||
self.settingsButton.center = buttonCenter;
|
||||
self.settingsLabel.center = buttonCenter;
|
||||
buttonCenter.y -= offsetBetweenButtons;
|
||||
self.downloadMapsButton.center = buttonCenter;
|
||||
self.downloadMapsLabel.center = buttonCenter;
|
||||
buttonCenter.y -= offsetBetweenButtons;
|
||||
self.bookmarksButton.center = buttonCenter;
|
||||
self.bookmarksLabel.center = buttonCenter;
|
||||
|
||||
CGFloat const labelWidth = 0.5 * boundsSize.width;
|
||||
self.shareLocationLabel.width = labelWidth;
|
||||
self.settingsLabel.width = labelWidth;
|
||||
self.downloadMapsLabel.width = labelWidth;
|
||||
self.bookmarksLabel.width = labelWidth;
|
||||
|
||||
CGFloat const rightBound = self.shareLocationButton.minX - offsetLabelToButton;
|
||||
self.shareLocationLabel.maxX = rightBound;
|
||||
self.settingsLabel.maxX = rightBound;
|
||||
self.downloadMapsLabel.maxX = rightBound;
|
||||
self.bookmarksLabel.maxX = rightBound;
|
||||
self.searchLabel.maxX = rightBound;
|
||||
|
||||
self.downloadBadge.maxX = self.downloadMapsButton.maxX;
|
||||
self.downloadCount.maxX = self.downloadMapsButton.maxX;
|
||||
self.downloadBadge.minY = self.downloadMapsButton.minY;
|
||||
self.downloadCount.minY = self.downloadMapsButton.minY;
|
||||
}
|
||||
|
||||
#pragma mark - Animations
|
||||
|
||||
- (void)updateMenuBackground
|
||||
{
|
||||
self.dimBackground.hidden = NO;
|
||||
self.dimBackground.alpha = 0.0;
|
||||
[UIView animateWithDuration:framesDuration(2) animations:^
|
||||
{
|
||||
self.dimBackground.alpha = 0.8;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)updateMenuUI
|
||||
{
|
||||
[self showItem:self.searchLabel button:nil delay:framesDuration(0)];
|
||||
[self showItem:self.shareLocationLabel button:self.shareLocationButton delay:framesDuration(1.5)];
|
||||
[self showItem:self.settingsLabel button:self.settingsButton delay:framesDuration(3)];
|
||||
[self showItem:self.downloadMapsLabel button:self.downloadMapsButton delay:framesDuration(4.5)];
|
||||
[self showItem:self.bookmarksLabel button:self.bookmarksButton delay:framesDuration(6)];
|
||||
|
||||
[self performSelector:@selector(updateMenuOutOfDateBadge) withObject:nil afterDelay:framesDuration(10)];
|
||||
}
|
||||
|
||||
- (void)updateMenuOutOfDateBadge
|
||||
{
|
||||
int const outOfDateCount = GetFramework().GetCountryTree().GetActiveMapLayout().GetOutOfDateCount();
|
||||
if (outOfDateCount == 0)
|
||||
return;
|
||||
CATransform3D const zeroScale = CATransform3DScale(CATransform3DIdentity, 0.0, 0.0, 1.0);
|
||||
self.downloadBadge.layer.transform = zeroScale;
|
||||
self.downloadCount.layer.transform = zeroScale;
|
||||
self.downloadBadge.alpha = 0.0;
|
||||
self.downloadCount.alpha = 0.0;
|
||||
self.downloadBadge.hidden = NO;
|
||||
self.downloadCount.hidden = NO;
|
||||
self.downloadCount.text = @(outOfDateCount).stringValue;
|
||||
[UIView animateWithDuration:framesDuration(4) animations:^
|
||||
{
|
||||
self.downloadBadge.layer.transform = CATransform3DIdentity;
|
||||
self.downloadCount.layer.transform = CATransform3DIdentity;
|
||||
self.downloadBadge.alpha = 1.0;
|
||||
self.downloadCount.alpha = 1.0;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)showItem:(UIButton *)label button:(UIButton *)button delay:(NSTimeInterval)delay
|
||||
{
|
||||
label.alpha = 0.0;
|
||||
[UIView animateWithDuration:framesDuration(5) delay:framesDuration(3) + delay options:UIViewAnimationOptionCurveLinear animations:^
|
||||
{
|
||||
label.alpha = 1.0;
|
||||
} completion:nil];
|
||||
|
||||
if (button == nil)
|
||||
return;
|
||||
|
||||
button.alpha = 0.0;
|
||||
[UIView animateWithDuration:framesDuration(6) delay:framesDuration(3) + delay options:UIViewAnimationOptionCurveLinear animations:^
|
||||
{
|
||||
button.alpha = 1.0;
|
||||
} completion:nil];
|
||||
|
||||
CABasicAnimation * translationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.translation.x"];
|
||||
translationAnimation.timingFunction = [CAMediaTimingFunction functionWithControlPoints:0.55 :0.0 :0.4 :1.4];
|
||||
translationAnimation.duration = framesDuration(7);
|
||||
translationAnimation.beginTime = CACurrentMediaTime() + delay;
|
||||
translationAnimation.fromValue = @(2.0 * kViewControlsOffsetToBounds + button.size.width);
|
||||
translationAnimation.toValue = @0.0;
|
||||
[button.layer addAnimation:translationAnimation forKey:@"translationAnimation"];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,242 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMSideMenuManager">
|
||||
<connections>
|
||||
<outlet property="menuButton" destination="cTK-Dt-qgQ" id="g1C-K4-dov"/>
|
||||
<outlet property="sideMenu" destination="i5M-Pr-FkT" id="p49-Bn-Hkx"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<view opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT" customClass="MWMSideMenuView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<view alpha="0.80000000000000004" contentMode="scaleToFill" id="4iS-Dh-FAa" userLabel="DimBackground">
|
||||
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" lineBreakMode="wordWrap" id="mWD-fB-THv" userLabel="Bookmarks Label">
|
||||
<rect key="frame" x="8" y="248" width="240" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" title="Bookmarks">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="bookmarks"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="titleLabel.numberOfLines">
|
||||
<integer key="value" value="0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="menuActionOpenBookmarks" destination="-1" eventType="touchUpInside" id="Qch-Bf-Cpx"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="ZEc-sk-zsN" userLabel="Bookmarks">
|
||||
<rect key="frame" x="256" y="248" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_bookmarks">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_bookmarks_pressed"/>
|
||||
<connections>
|
||||
<action selector="menuActionOpenBookmarks" destination="-1" eventType="touchUpInside" id="R4f-dp-nOX"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" lineBreakMode="wordWrap" id="joI-Q5-Iyo" userLabel="Download Label">
|
||||
<rect key="frame" x="8" y="312" width="240" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" title="Download Maps">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="download_maps"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="titleLabel.numberOfLines">
|
||||
<integer key="value" value="0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="menuActionDownloadMaps" destination="-1" eventType="touchUpInside" id="TLT-ce-6yF"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="pLL-6e-i3i" userLabel="Download">
|
||||
<rect key="frame" x="256" y="312" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_download">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_download_pressed"/>
|
||||
<connections>
|
||||
<action selector="menuActionDownloadMaps" destination="-1" eventType="touchUpInside" id="mRz-aq-RBf"/>
|
||||
</connections>
|
||||
</button>
|
||||
<imageView hidden="YES" userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="img_counter" id="AIs-PS-5d2" userLabel="Download Badge">
|
||||
<rect key="frame" x="288" y="312" width="24" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</imageView>
|
||||
<label hidden="YES" opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="99" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="yPG-HI-11x" userLabel="Download Count">
|
||||
<rect key="frame" x="288" y="312" width="24" height="24"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||
<color key="textColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
|
||||
<nil key="highlightedColor"/>
|
||||
</label>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" lineBreakMode="wordWrap" id="pUg-T0-gDk" userLabel="Settings Label">
|
||||
<rect key="frame" x="8" y="376" width="240" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" title="Settings">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="settings"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="titleLabel.numberOfLines">
|
||||
<integer key="value" value="0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="menuActionOpenSettings" destination="-1" eventType="touchUpInside" id="Ufq-ga-qXm"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="78h-K2-K78" userLabel="Settings">
|
||||
<rect key="frame" x="256" y="376" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_settings">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_settings_pressed"/>
|
||||
<connections>
|
||||
<action selector="menuActionOpenSettings" destination="-1" eventType="touchUpInside" id="kgP-17-hux"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" lineBreakMode="wordWrap" id="vKQ-Xm-fC0" userLabel="Share Label">
|
||||
<rect key="frame" x="8" y="440" width="240" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" title="Share Location">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="share_my_location"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="titleLabel.numberOfLines">
|
||||
<integer key="value" value="0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="menuActionShareLocation" destination="-1" eventType="touchUpInside" id="EPD-lw-MI7"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="U6a-I5-v5p" userLabel="Share">
|
||||
<rect key="frame" x="256" y="440" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_share">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_share_pressed"/>
|
||||
<connections>
|
||||
<action selector="menuActionShareLocation" destination="-1" eventType="touchUpInside" id="87x-er-hhP"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="right" contentVerticalAlignment="center" lineBreakMode="wordWrap" id="06v-Es-Du1" userLabel="Search Label">
|
||||
<rect key="frame" x="8" y="504" width="240" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" title="Search">
|
||||
<color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="menu_search"/>
|
||||
<userDefinedRuntimeAttribute type="number" keyPath="titleLabel.numberOfLines">
|
||||
<integer key="value" value="0"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
<connections>
|
||||
<action selector="menuActionOpenSearch" destination="-1" eventType="touchUpInside" id="hJu-NG-VJR"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="rpT-xg-5E2" userLabel="Search">
|
||||
<rect key="frame" x="256" y="504" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_search">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_search_pressed"/>
|
||||
<connections>
|
||||
<action selector="menuActionOpenSearch" destination="-1" eventType="touchUpInside" id="AQD-SE-Ikf"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<nil key="simulatedTopBarMetrics"/>
|
||||
<nil key="simulatedBottomBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<connections>
|
||||
<outlet property="bookmarksButton" destination="ZEc-sk-zsN" id="KjM-Yb-Jus"/>
|
||||
<outlet property="bookmarksLabel" destination="mWD-fB-THv" id="gIu-lT-I05"/>
|
||||
<outlet property="dimBackground" destination="4iS-Dh-FAa" id="ww7-Md-QuY"/>
|
||||
<outlet property="downloadBadge" destination="AIs-PS-5d2" id="lUs-mB-j7R"/>
|
||||
<outlet property="downloadCount" destination="yPG-HI-11x" id="HX1-3s-fpq"/>
|
||||
<outlet property="downloadMapsButton" destination="pLL-6e-i3i" id="Wd7-aB-nMt"/>
|
||||
<outlet property="downloadMapsLabel" destination="joI-Q5-Iyo" id="hzF-K0-klD"/>
|
||||
<outlet property="searchButton" destination="rpT-xg-5E2" id="uAa-2k-Vdf"/>
|
||||
<outlet property="searchLabel" destination="06v-Es-Du1" id="KEx-ZM-6Er"/>
|
||||
<outlet property="settingsButton" destination="78h-K2-K78" id="zBJ-iH-06h"/>
|
||||
<outlet property="settingsLabel" destination="pUg-T0-gDk" id="cHU-te-fCy"/>
|
||||
<outlet property="shareLocationButton" destination="U6a-I5-v5p" id="Rak-JL-2M7"/>
|
||||
<outlet property="shareLocationLabel" destination="vKQ-Xm-fC0" id="Rrl-IA-sCp"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="301" y="305"/>
|
||||
</view>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" showsTouchWhenHighlighted="YES" adjustsImageWhenDisabled="NO" lineBreakMode="middleTruncation" id="cTK-Dt-qgQ" userLabel="Show Menu Button" customClass="MWMSideMenuButton">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<state key="normal" image="btn_green_menu_1">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_green_menu_pressed"/>
|
||||
<connections>
|
||||
<action selector="toggleMenu" destination="-1" eventType="touchUpInside" id="XvK-dK-beZ"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="48" y="561"/>
|
||||
</button>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="btn_green_bookmarks" width="56" height="56"/>
|
||||
<image name="btn_green_bookmarks_pressed" width="56" height="56"/>
|
||||
<image name="btn_green_download" width="56" height="56"/>
|
||||
<image name="btn_green_download_pressed" width="56" height="56"/>
|
||||
<image name="btn_green_menu_1" width="56" height="56"/>
|
||||
<image name="btn_green_menu_pressed" width="56" height="56"/>
|
||||
<image name="btn_green_search" width="56" height="56"/>
|
||||
<image name="btn_green_search_pressed" width="56" height="56"/>
|
||||
<image name="btn_green_settings" width="56" height="56"/>
|
||||
<image name="btn_green_settings_pressed" width="56" height="56"/>
|
||||
<image name="btn_green_share" width="56" height="56"/>
|
||||
<image name="btn_green_share_pressed" width="56" height="56"/>
|
||||
<image name="img_counter" width="24" height="24"/>
|
||||
</resources>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
|
@ -0,0 +1,18 @@
|
|||
//
|
||||
// MWMZoomButtons.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 12.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface MWMZoomButtons : NSObject
|
||||
|
||||
@property (nonatomic) BOOL hidden;
|
||||
|
||||
- (instancetype)initWithParentView:(UIView *)view;
|
||||
- (void)resetVisibility;
|
||||
|
||||
@end
|
|
@ -0,0 +1,115 @@
|
|||
//
|
||||
// MWMZoomButtons.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 12.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMZoomButtons.h"
|
||||
#import "MWMZoomButtonsView.h"
|
||||
#import "3party/Alohalytics/src/alohalytics_objc.h"
|
||||
|
||||
#include "Framework.h"
|
||||
#include "platform/settings.hpp"
|
||||
#include "indexer/scales.hpp"
|
||||
|
||||
static NSString * const kMWMZoomButtonsViewNibName = @"MWMZoomButtonsView";
|
||||
|
||||
extern NSString * const kAlohalyticsTapEventKey;
|
||||
|
||||
@interface MWMZoomButtons()
|
||||
|
||||
@property (nonatomic) IBOutlet MWMZoomButtonsView * zoomView;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * zoomInButton;
|
||||
@property (weak, nonatomic) IBOutlet UIButton * zoomOutButton;
|
||||
|
||||
@property (nonatomic) BOOL zoomSwipeEnabled;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMZoomButtons
|
||||
|
||||
- (instancetype)initWithParentView:(UIView *)view
|
||||
{
|
||||
self = [super init];
|
||||
if (self)
|
||||
{
|
||||
[[NSBundle mainBundle] loadNibNamed:kMWMZoomButtonsViewNibName owner:self options:nil];
|
||||
[view addSubview:self.zoomView];
|
||||
[self resetVisibility];
|
||||
self.zoomSwipeEnabled = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)resetVisibility
|
||||
{
|
||||
bool zoomButtonsEnabled;
|
||||
if (!Settings::Get("ZoomButtonsEnabled", zoomButtonsEnabled))
|
||||
zoomButtonsEnabled = false;
|
||||
self.zoomView.hidden = !zoomButtonsEnabled;
|
||||
}
|
||||
|
||||
- (void)zoom:(CGFloat)scale
|
||||
{
|
||||
GetFramework().Scale(scale);
|
||||
}
|
||||
|
||||
- (void)zoomIn
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"+"];
|
||||
[self zoom:2.0];
|
||||
}
|
||||
|
||||
- (void)zoomOut
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"-"];
|
||||
[self zoom:0.5];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (IBAction)zoomTouchDown:(UIButton *)sender
|
||||
{
|
||||
self.zoomSwipeEnabled = YES;
|
||||
}
|
||||
|
||||
- (IBAction)zoomTouchUpInside:(UIButton *)sender
|
||||
{
|
||||
self.zoomSwipeEnabled = NO;
|
||||
if ([sender isEqual:self.zoomInButton])
|
||||
[self zoomIn];
|
||||
else
|
||||
[self zoomOut];
|
||||
}
|
||||
|
||||
- (IBAction)zoomTouchUpOutside:(UIButton *)sender
|
||||
{
|
||||
self.zoomSwipeEnabled = NO;
|
||||
}
|
||||
|
||||
- (IBAction)zoomSwipe:(UIPanGestureRecognizer *)sender
|
||||
{
|
||||
if (!self.zoomSwipeEnabled)
|
||||
return;
|
||||
UIView * const superview = self.zoomView.superview;
|
||||
CGFloat const translation = -[sender translationInView:superview].y / superview.bounds.size.height;
|
||||
|
||||
CGFloat const scale = pow(2, translation);
|
||||
[self zoom:scale];
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (BOOL)hidden
|
||||
{
|
||||
return self.zoomView.hidden;
|
||||
}
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
self.zoomView.hidden = hidden;
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,16 @@
|
|||
//
|
||||
// MWMZoomButtonsView.h
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 12.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
@interface MWMZoomButtonsView : UIView
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
|
||||
- (instancetype)init __attribute__((unavailable("init is not available")));
|
||||
|
||||
@end
|
|
@ -0,0 +1,70 @@
|
|||
//
|
||||
// MWMZoomButtonsView.m
|
||||
// Maps
|
||||
//
|
||||
// Created by Ilya Grechuhin on 12.05.15.
|
||||
// Copyright (c) 2015 MapsWithMe. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MWMZoomButtonsView.h"
|
||||
#import "MWMMapViewControlsCommon.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
static CGFloat const kZoomViewOffsetToTopBound = 12.0;
|
||||
static CGFloat const kZoomViewOffsetToBottomBound = 294.0;
|
||||
|
||||
@interface MWMZoomButtonsView()
|
||||
|
||||
@property (nonatomic) CGRect defaultBounds;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MWMZoomButtonsView
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
self = [super initWithCoder:aDecoder];
|
||||
if (self)
|
||||
{
|
||||
self.defaultBounds = self.bounds;
|
||||
self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
self.bounds = self.defaultBounds;
|
||||
[self layoutXPosition:self.hidden];
|
||||
self.maxY = self.superview.height - kZoomViewOffsetToBottomBound;
|
||||
self.minY = MAX(self.minY, kZoomViewOffsetToTopBound);
|
||||
}
|
||||
|
||||
- (void)layoutXPosition:(BOOL)hidden
|
||||
{
|
||||
if (hidden)
|
||||
self.minX = self.superview.width;
|
||||
else
|
||||
self.maxX = self.superview.width - kViewControlsOffsetToBounds;
|
||||
}
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
- (void)setHidden:(BOOL)hidden
|
||||
{
|
||||
if (!hidden)
|
||||
super.hidden = NO;
|
||||
[self layoutXPosition:!hidden];
|
||||
[UIView animateWithDuration:framesDuration(kMenuViewHideFramesCount) animations:^
|
||||
{
|
||||
[self layoutXPosition:hidden];
|
||||
}
|
||||
completion:^(BOOL finished)
|
||||
{
|
||||
if (hidden)
|
||||
super.hidden = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
|
@ -0,0 +1,75 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMZoomButtons">
|
||||
<connections>
|
||||
<outlet property="zoomInButton" destination="NO3-Xl-Oka" id="ePH-BR-gfW"/>
|
||||
<outlet property="zoomOutButton" destination="hwn-8L-cFX" id="fYk-mf-gUY"/>
|
||||
<outlet property="zoomView" destination="ek2-ZW-pCm" id="N0e-Rh-Unp"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
<view contentMode="scaleToFill" id="ek2-ZW-pCm" customClass="MWMZoomButtonsView">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="116"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<subviews>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="NO3-Xl-Oka" userLabel="ZoomIn">
|
||||
<rect key="frame" x="0.0" y="0.0" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<state key="normal" image="btn_white_zoom_in">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_white_zoom_in_pressed"/>
|
||||
<connections>
|
||||
<action selector="zoomTouchDown:" destination="-1" eventType="touchDown" id="5VF-m8-Lwc"/>
|
||||
<action selector="zoomTouchUpInside:" destination="-1" eventType="touchUpInside" id="wbL-zf-fH8"/>
|
||||
<action selector="zoomTouchUpOutside:" destination="-1" eventType="touchUpOutside" id="w6V-A2-cZM"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="hwn-8L-cFX" userLabel="ZoomOut">
|
||||
<rect key="frame" x="0.0" y="60" width="56" height="56"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
<state key="normal" image="btn_white_zoom_out">
|
||||
<color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</state>
|
||||
<state key="highlighted" image="btn_white_zoom_out_pressed"/>
|
||||
<connections>
|
||||
<action selector="zoomTouchDown:" destination="-1" eventType="touchDown" id="o4X-Kp-9ka"/>
|
||||
<action selector="zoomTouchUpInside:" destination="-1" eventType="touchUpInside" id="Gcq-hm-Nk8"/>
|
||||
<action selector="zoomTouchUpOutside:" destination="-1" eventType="touchUpOutside" id="cX7-sp-3L3"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
<gestureRecognizers/>
|
||||
<nil key="simulatedStatusBarMetrics"/>
|
||||
<nil key="simulatedTopBarMetrics"/>
|
||||
<nil key="simulatedBottomBarMetrics"/>
|
||||
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||
<connections>
|
||||
<outletCollection property="gestureRecognizers" destination="6qU-Ff-Ae5" appends="YES" id="jeT-Jr-P7T"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="165" y="-6"/>
|
||||
</view>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||
<panGestureRecognizer minimumNumberOfTouches="1" id="6qU-Ff-Ae5">
|
||||
<connections>
|
||||
<action selector="zoomSwipe:" destination="-1" id="jq1-Qs-vUJ"/>
|
||||
</connections>
|
||||
</panGestureRecognizer>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="btn_white_zoom_in" width="56" height="56"/>
|
||||
<image name="btn_white_zoom_in_pressed" width="56" height="56"/>
|
||||
<image name="btn_white_zoom_out" width="56" height="56"/>
|
||||
<image name="btn_white_zoom_out_pressed" width="56" height="56"/>
|
||||
</resources>
|
||||
<simulatedMetricsContainer key="defaultSimulatedMetrics">
|
||||
<simulatedStatusBarMetrics key="statusBar"/>
|
||||
<simulatedOrientationMetrics key="orientation"/>
|
||||
<simulatedScreenMetrics key="destination" type="retina4"/>
|
||||
</simulatedMetricsContainer>
|
||||
</document>
|
|
@ -1,19 +0,0 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class ImageDownloader;
|
||||
@protocol ImageDownloaderDelegate <NSObject>
|
||||
|
||||
- (void)imageDownloaderDidFinishLoading:(ImageDownloader *)downloader;
|
||||
|
||||
@end
|
||||
|
||||
@interface ImageDownloader : NSObject
|
||||
|
||||
@property (nonatomic, weak) id <ImageDownloaderDelegate> delegate;
|
||||
@property (nonatomic) UIImage * image;
|
||||
@property (nonatomic) NSString * objectId;
|
||||
|
||||
- (void)startDownloadingWithURL:(NSURL *)URL;
|
||||
|
||||
@end
|
|
@ -1,18 +0,0 @@
|
|||
|
||||
#import "ImageDownloader.h"
|
||||
|
||||
@implementation ImageDownloader
|
||||
|
||||
- (void)startDownloadingWithURL:(NSURL *)URL
|
||||
{
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
|
||||
NSURLRequest * request = [NSURLRequest requestWithURL:URL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:20];
|
||||
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
|
||||
self.image = [UIImage imageWithData:data scale:[UIScreen mainScreen].scale];
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
[self.delegate imageDownloaderDidFinishLoading:self];
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
|
@ -3,7 +3,6 @@
|
|||
#import "ViewController.h"
|
||||
#import "LocationManager.h"
|
||||
#import "LocationButton.h"
|
||||
#import "BottomMenu.h"
|
||||
#import "SearchView.h"
|
||||
#import "LocationPredictor.h"
|
||||
|
||||
|
@ -13,6 +12,9 @@
|
|||
|
||||
namespace search { struct AddressInfo; }
|
||||
|
||||
@class MWMMapViewControlsManager;
|
||||
@class ShareActionSheet;
|
||||
|
||||
@interface MapViewController : ViewController <LocationObserver, UIAlertViewDelegate, UIPopoverControllerDelegate>
|
||||
{
|
||||
enum Action
|
||||
|
@ -47,11 +49,11 @@ namespace search { struct AddressInfo; }
|
|||
|
||||
- (void)setMapStyle:(MapStyle)mapStyle;
|
||||
|
||||
@property (nonatomic) UIView * zoomButtonsView;
|
||||
@property (nonatomic, strong) UIPopoverController * popoverVC;
|
||||
@property (nonatomic) BottomMenu * bottomMenu;
|
||||
@property (nonatomic) UIPopoverController * popoverVC;
|
||||
@property (nonatomic, readonly) BOOL apiMode;
|
||||
@property (nonatomic) SearchView * searchView;
|
||||
@property (nonatomic) ShareActionSheet * shareActionSheet;
|
||||
- (void)setApiMode:(BOOL)apiMode animated:(BOOL)animated;
|
||||
@property (nonatomic, readonly) MWMMapViewControlsManager * controlsManager;
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,23 +1,19 @@
|
|||
#import "MapViewController.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "EAGLView.h"
|
||||
#import "BookmarksRootVC.h"
|
||||
#import "UIKitCategories.h"
|
||||
#import "UIViewController+Navigation.h"
|
||||
#import "ShareActionSheet.h"
|
||||
#import "AppInfo.h"
|
||||
#import "ContainerView.h"
|
||||
#import "ToolbarView.h"
|
||||
#import "SelectSetVC.h"
|
||||
#import "BookmarkDescriptionVC.h"
|
||||
#import "BookmarkNameVC.h"
|
||||
#import "SettingsAndMoreVC.h"
|
||||
#import "RouteView.h"
|
||||
#import "CountryTreeVC.h"
|
||||
#import "Reachability.h"
|
||||
#import "MWMAlertViewController.h"
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
#import "../../../3party/Alohalytics/src/alohalytics_objc.h"
|
||||
|
||||
#import "../../Common/CustomAlertView.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
@ -73,19 +69,17 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
|
||||
@end
|
||||
|
||||
@interface MapViewController () <PlacePageViewDelegate, ToolbarViewDelegate, BottomMenuDelegate, SelectSetVCDelegate, BookmarkDescriptionVCDelegate, BookmarkNameVCDelegate, RouteViewDelegate>
|
||||
@interface MapViewController () <PlacePageViewDelegate, SelectSetVCDelegate, BookmarkDescriptionVCDelegate, BookmarkNameVCDelegate, RouteViewDelegate>
|
||||
|
||||
@property (nonatomic) ShareActionSheet * shareActionSheet;
|
||||
@property (nonatomic) ToolbarView * toolbarView;
|
||||
@property (nonatomic) UIView * routeViewWrapper;
|
||||
@property (nonatomic) RouteView * routeView;
|
||||
@property (nonatomic) ContainerView * containerView;
|
||||
@property (nonatomic) UIImageView * apiBar;
|
||||
@property (nonatomic) UILabel * apiTitleLabel;
|
||||
@property (nonatomic, readwrite) MWMMapViewControlsManager * controlsManager;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation MapViewController
|
||||
|
||||
#pragma mark - LocationManager Callbacks
|
||||
|
@ -123,7 +117,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
default:
|
||||
break;
|
||||
}
|
||||
[self.toolbarView.locationButton setImage:[UIImage imageNamed:@"LocationDefault"] forState:UIControlStateSelected];
|
||||
}
|
||||
|
||||
- (void)onLocationUpdate:(location::GpsInfo const &)info
|
||||
|
@ -228,37 +221,19 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[placePage setState:PlacePageStateHidden animated:YES withCallback:YES];
|
||||
else
|
||||
[placePage setState:placePage.state animated:YES withCallback:YES];
|
||||
|
||||
self.toolbarView.locationButton.selected = NO;
|
||||
[self.toolbarView.locationButton setImage:[UIImage imageNamed:@"LocationDefault"] forState:UIControlStateSelected];
|
||||
break;
|
||||
}
|
||||
case location::State::PendingPosition:
|
||||
{
|
||||
self.toolbarView.locationButton.selected = YES;
|
||||
[self.toolbarView.locationButton setImage:[UIImage imageNamed:@"LocationSearch"] forState:UIControlStateSelected];
|
||||
[self.toolbarView.locationButton setSearching];
|
||||
|
||||
[[MapsAppDelegate theApp] disableStandby];
|
||||
[[MapsAppDelegate theApp].m_locationManager start:self];
|
||||
[[NSNotificationCenter defaultCenter] postNotificationName:LOCATION_MANAGER_STARTED_NOTIFICATION object:nil];
|
||||
|
||||
break;
|
||||
}
|
||||
case location::State::NotFollow:
|
||||
case location::State::Follow:
|
||||
{
|
||||
[self.toolbarView.locationButton setImage:[UIImage imageNamed:@"LocationSelected"] forState:UIControlStateSelected];
|
||||
self.toolbarView.locationButton.selected = YES;
|
||||
break;
|
||||
}
|
||||
case location::State::RotateAndFollow:
|
||||
{
|
||||
[self.toolbarView.locationButton setImage:[UIImage imageNamed:@"LocationFollow"] forState:UIControlStateSelected];
|
||||
self.toolbarView.locationButton.selected = YES;
|
||||
[UIApplication sharedApplication].idleTimerDisabled = YES;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -283,25 +258,21 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
GetFramework().GetLocationState()->SwitchToNextMode();
|
||||
}
|
||||
|
||||
- (IBAction)zoomInPressed:(id)sender
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"+"];
|
||||
GetFramework().Scale(2.0);
|
||||
}
|
||||
|
||||
- (IBAction)zoomOutPressed:(id)sender
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"-"];
|
||||
GetFramework().Scale(0.5);
|
||||
}
|
||||
|
||||
- (void)processMapClickAtPoint:(CGPoint)point longClick:(BOOL)isLongClick
|
||||
{
|
||||
CGFloat const scaleFactor = self.view.contentScaleFactor;
|
||||
m2::PointD const pxClicked(point.x * scaleFactor, point.y * scaleFactor);
|
||||
|
||||
Framework & f = GetFramework();
|
||||
f.GetBalloonManager().OnShowMark(f.GetUserMark(pxClicked, isLongClick));
|
||||
UserMark const * userMark = f.GetUserMark(pxClicked, isLongClick);
|
||||
if (f.HasActiveUserMark() == false)
|
||||
{
|
||||
if (userMark == nullptr)
|
||||
self.controlsManager.hidden = !self.controlsManager.hidden;
|
||||
else
|
||||
self.controlsManager.hidden = NO;
|
||||
}
|
||||
f.GetBalloonManager().OnShowMark(userMark);
|
||||
}
|
||||
|
||||
- (void)onSingleTap:(NSValueWrapper *)point
|
||||
|
@ -594,27 +565,16 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
{
|
||||
[super viewDidLoad];
|
||||
|
||||
[self.view addSubview:self.zoomButtonsView];
|
||||
self.zoomButtonsView.minY = IPAD ? 560 : 176;
|
||||
self.zoomButtonsView.maxX = self.zoomButtonsView.superview.width;
|
||||
bool zoomButtonsEnabled;
|
||||
if (!Settings::Get("ZoomButtonsEnabled", zoomButtonsEnabled))
|
||||
zoomButtonsEnabled = false;
|
||||
self.zoomButtonsView.hidden = !zoomButtonsEnabled;
|
||||
|
||||
self.view.clipsToBounds = YES;
|
||||
|
||||
[self.view addSubview:self.toolbarView];
|
||||
self.toolbarView.maxY = self.toolbarView.superview.height;
|
||||
|
||||
self.controlsManager = [[MWMMapViewControlsManager alloc] initWithParentController:self];
|
||||
|
||||
[self.view addSubview:self.routeViewWrapper];
|
||||
|
||||
[self.view addSubview:self.searchView];
|
||||
|
||||
[self.view addSubview:self.containerView];
|
||||
|
||||
[self.view addSubview:self.bottomMenu];
|
||||
|
||||
|
||||
[self showRoutingFeatureDialog];
|
||||
}
|
||||
|
||||
|
@ -636,13 +596,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[super viewWillDisappear:animated];
|
||||
}
|
||||
|
||||
- (void)viewDidDisappear:(BOOL)animated
|
||||
{
|
||||
[super viewDidDisappear:animated];
|
||||
if (!self.bottomMenu.menuHidden)
|
||||
[self.bottomMenu setMenuHidden:YES animated:NO];
|
||||
}
|
||||
|
||||
- (UIStatusBarStyle)preferredStatusBarStyle
|
||||
{
|
||||
if (self.apiMode)
|
||||
|
@ -834,90 +787,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[alert presentAlert:type];
|
||||
}
|
||||
|
||||
#pragma mark - Getters
|
||||
|
||||
- (BottomMenu *)bottomMenu
|
||||
{
|
||||
if (!_bottomMenu)
|
||||
{
|
||||
_bottomMenu = [[BottomMenu alloc] initWithFrame:self.view.bounds];
|
||||
_bottomMenu.delegate = self;
|
||||
}
|
||||
return _bottomMenu;
|
||||
}
|
||||
|
||||
- (ToolbarView *)toolbarView
|
||||
{
|
||||
if (!_toolbarView)
|
||||
{
|
||||
_toolbarView = [[ToolbarView alloc] initWithFrame:CGRectMake(0, 0, self.view.width, 44)];
|
||||
_toolbarView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin;
|
||||
_toolbarView.delegate = self;
|
||||
}
|
||||
return _toolbarView;
|
||||
}
|
||||
|
||||
- (UIView *)zoomButtonsView
|
||||
{
|
||||
if (!_zoomButtonsView)
|
||||
{
|
||||
_zoomButtonsView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 48, 88)];
|
||||
_zoomButtonsView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
|
||||
|
||||
UIButton * zoomIn = [self zoomInButton];
|
||||
[_zoomButtonsView addSubview:zoomIn];
|
||||
zoomIn.midX = zoomIn.superview.width / 2.0;
|
||||
|
||||
UIButton * zoomOut = [self zoomOutButton];
|
||||
[_zoomButtonsView addSubview:zoomOut];
|
||||
zoomOut.midX = zoomOut.superview.width / 2.0;
|
||||
zoomOut.minY = zoomIn.maxY;
|
||||
}
|
||||
return _zoomButtonsView;
|
||||
}
|
||||
|
||||
- (UIButton *)zoomInButton
|
||||
{
|
||||
|
||||
UIFont * font = [UIFont fontWithName:@"HelveticaNeue" size:26];
|
||||
|
||||
UIButton * zoomInButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
|
||||
zoomInButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleBottomMargin;
|
||||
UIImage * backgroundImage = [[UIImage imageNamed:@"RoutingButtonBackground"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
|
||||
[zoomInButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];
|
||||
|
||||
zoomInButton.alpha = 0.65;
|
||||
zoomInButton.titleLabel.font = font;
|
||||
zoomInButton.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 3, 0);
|
||||
[zoomInButton setTitle:@"+" forState:UIControlStateNormal];
|
||||
[zoomInButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
|
||||
|
||||
[zoomInButton addTarget:self action:@selector(zoomInPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
return zoomInButton;
|
||||
}
|
||||
|
||||
- (UIButton *)zoomOutButton
|
||||
{
|
||||
|
||||
UIFont * font = [UIFont fontWithName:@"HelveticaNeue" size:26];
|
||||
|
||||
UIButton * zoomOutButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
|
||||
zoomOutButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
|
||||
UIImage * backgroundImage = [[UIImage imageNamed:@"RoutingButtonBackground"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 5, 5, 5)];
|
||||
[zoomOutButton setBackgroundImage:backgroundImage forState:UIControlStateNormal];
|
||||
|
||||
zoomOutButton.alpha = 0.65;
|
||||
zoomOutButton.titleLabel.font = font;
|
||||
zoomOutButton.titleEdgeInsets = UIEdgeInsetsMake(0, 0, 3, 0);
|
||||
[zoomOutButton setTitle:@"–" forState:UIControlStateNormal];
|
||||
[zoomOutButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
|
||||
|
||||
[zoomOutButton addTarget:self action:@selector(zoomOutPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
return zoomOutButton;
|
||||
}
|
||||
|
||||
- (UIView *)routeViewWrapper
|
||||
{
|
||||
if (!_routeViewWrapper)
|
||||
|
@ -948,6 +817,7 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
_searchView = [[SearchView alloc] initWithFrame:self.view.bounds];
|
||||
_searchView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||
[_searchView addObserver:self forKeyPath:@"state" options:NSKeyValueObservingOptionNew context:nil];
|
||||
_searchView.controlsManager = self.controlsManager;
|
||||
}
|
||||
return _searchView;
|
||||
}
|
||||
|
@ -1029,32 +899,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[[UIApplication sharedApplication] openURL:url];
|
||||
}
|
||||
|
||||
#pragma mark - ToolbarView delegate
|
||||
|
||||
- (void)toolbar:(ToolbarView *)toolbar didPressItemWithName:(NSString *)itemName
|
||||
{
|
||||
if ([itemName isEqualToString:@"Location"])
|
||||
{
|
||||
[self onMyPositionClicked:nil];
|
||||
}
|
||||
else if ([itemName isEqualToString:@"Search"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"search"];
|
||||
[self.searchView setState:SearchViewStateFullscreen animated:YES withCallback:YES];
|
||||
}
|
||||
else if ([itemName isEqualToString:@"Bookmarks"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"bookmarks"];
|
||||
BookmarksRootVC * vc = [[BookmarksRootVC alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
else if ([itemName isEqualToString:@"Menu"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"menu"];
|
||||
[self.bottomMenu setMenuHidden:NO animated:YES];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Routing
|
||||
|
||||
- (void)tryToBuildRoute
|
||||
|
@ -1068,7 +912,7 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
{
|
||||
[UIApplication sharedApplication].idleTimerDisabled = YES;
|
||||
[routeView setState:RouteViewStateTurnInstructions animated:YES];
|
||||
self.zoomButtonsView.hidden = NO;
|
||||
self.controlsManager.zoomHidden = NO;
|
||||
GetFramework().FollowRoute();
|
||||
}
|
||||
|
||||
|
@ -1081,10 +925,7 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
{
|
||||
[UIApplication sharedApplication].idleTimerDisabled = NO;
|
||||
GetFramework().CloseRouting();
|
||||
bool zoomButtonsEnabled;
|
||||
if (!Settings::Get("ZoomButtonsEnabled", zoomButtonsEnabled))
|
||||
zoomButtonsEnabled = false;
|
||||
self.zoomButtonsView.hidden = !zoomButtonsEnabled;
|
||||
[self.controlsManager resetZoomButtonsVisibility];
|
||||
[self.routeView setState:RouteViewStateHidden animated:YES];
|
||||
}
|
||||
|
||||
|
@ -1157,52 +998,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
|
||||
}
|
||||
|
||||
#pragma mark - BottomMenuDelegate
|
||||
|
||||
- (void)bottomMenu:(BottomMenu *)menu didPressItemWithName:(NSString *)itemName appURL:(NSString *)appURL webURL:(NSString *)webURL
|
||||
{
|
||||
if ([itemName isEqualToString:@"Maps"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"downloader"];
|
||||
CountryTreeVC * vc = [[CountryTreeVC alloc] initWithNodePosition:-1];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
else if ([itemName isEqualToString:@"Settings"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"settingsAndMore"];
|
||||
SettingsAndMoreVC * vc = [[SettingsAndMoreVC alloc] initWithStyle:UITableViewStyleGrouped];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
else if ([itemName isEqualToString:@"Share"])
|
||||
{
|
||||
[Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"share@"];
|
||||
CLLocation * location = [MapsAppDelegate theApp].m_locationManager.lastLocation;
|
||||
if (location)
|
||||
{
|
||||
double gX = MercatorBounds::LonToX(location.coordinate.longitude);
|
||||
double gY = MercatorBounds::LatToY(location.coordinate.latitude);
|
||||
ShareInfo * info = [[ShareInfo alloc] initWithText:nil gX:gX gY:gY myPosition:YES];
|
||||
self.shareActionSheet = [[ShareActionSheet alloc] initWithInfo:info viewController:self];
|
||||
[self.shareActionSheet showFromRect:CGRectMake(menu.midX, self.view.height - 40, 0, 0)];
|
||||
}
|
||||
else
|
||||
{
|
||||
[[[UIAlertView alloc] initWithTitle:L(@"unknown_current_position") message:nil delegate:nil cancelButtonTitle:L(@"ok") otherButtonTitles:nil] show];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
[menu setMenuHidden:YES animated:YES];
|
||||
[[Statistics instance] logEvent:@"Bottom menu item clicked" withParameters:@{@"Item" : itemName, @"Country": [AppInfo sharedInfo].countryCode}];
|
||||
UIApplication * application = [UIApplication sharedApplication];
|
||||
NSURL * url = [NSURL URLWithString:appURL];
|
||||
if ([application canOpenURL:url])
|
||||
[application openURL:url];
|
||||
else
|
||||
[application openURL:[NSURL URLWithString:webURL]];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UIKitViews delegates
|
||||
|
||||
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
|
||||
|
@ -1244,7 +1039,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
GetFramework().GetBalloonManager().RemovePin();
|
||||
|
||||
[UIView animateWithDuration:0.3 animations:^{
|
||||
self.toolbarView.maxY = self.view.height;
|
||||
if (GetFramework().IsRoutingActive())
|
||||
{
|
||||
if (self.searchView.state == SearchViewStateResults)
|
||||
|
@ -1270,10 +1064,11 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
|
||||
if (CGRectContainsPoint(self.view.bounds, viewPinPoint))
|
||||
{
|
||||
CGFloat const minOffset = 40;
|
||||
CGFloat const minOffset = 40.0;
|
||||
CGFloat const bottomOffset = 44.0;
|
||||
viewPinPoint.x = MIN(self.view.width - minOffset, viewPinPoint.x);
|
||||
viewPinPoint.x = MAX(minOffset, viewPinPoint.x);
|
||||
viewPinPoint.y = MIN(self.view.height - minOffset - self.toolbarView.height, viewPinPoint.y);
|
||||
viewPinPoint.y = MIN(self.view.height - minOffset - bottomOffset, viewPinPoint.y);
|
||||
viewPinPoint.y = MAX(minOffset + self.containerView.placePage.maxY, viewPinPoint.y);
|
||||
|
||||
CGPoint const center = [(EAGLView *)self.view viewPoint2GlobalPoint:viewPinPoint];
|
||||
|
@ -1283,7 +1078,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
}
|
||||
}
|
||||
[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
|
||||
self.toolbarView.maxY = self.view.height;
|
||||
if (GetFramework().IsRoutingActive())
|
||||
{
|
||||
self.routeView.alpha = 1;
|
||||
|
@ -1295,7 +1089,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
case PlacePageStateOpened:
|
||||
{
|
||||
[UIView animateWithDuration:0.3 animations:^{
|
||||
self.toolbarView.minY = self.view.height;
|
||||
self.routeView.alpha = 0;
|
||||
}];
|
||||
}
|
||||
|
@ -1364,7 +1157,6 @@ extern NSString * const kAlohalyticsTapEventKey = @"$onClick";
|
|||
[self dismissPopover];
|
||||
[self.containerView.placePage setState:self.containerView.placePage.state animated:YES withCallback:YES];
|
||||
[self.searchView setState:SearchViewStateHidden animated:YES withCallback:YES];
|
||||
[self.bottomMenu setMenuHidden:YES animated:YES];
|
||||
|
||||
_apiMode = apiMode;
|
||||
|
||||
|
|
|
@ -9,9 +9,12 @@ typedef NS_ENUM(NSUInteger, SearchViewState) {
|
|||
SearchViewStateFullscreen,
|
||||
};
|
||||
|
||||
@class MWMMapViewControlsManager;
|
||||
|
||||
@interface SearchView : UIView
|
||||
|
||||
@property (nonatomic) SearchBar * searchBar;
|
||||
@property (weak, nonatomic) MWMMapViewControlsManager * controlsManager;
|
||||
|
||||
- (void)setState:(SearchViewState)state animated:(BOOL)animated withCallback:(BOOL)withCallback;
|
||||
@property (readonly, nonatomic) SearchViewState state;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#import "SearchResultCell.h"
|
||||
#import "SearchShowOnMapCell.h"
|
||||
#import "SearchCategoryCell.h"
|
||||
#import "MWMMapViewControlsManager.h"
|
||||
|
||||
#include "Framework.h"
|
||||
|
||||
|
@ -187,6 +188,7 @@ static BOOL keyboardLoaded = NO;
|
|||
|
||||
if (state == SearchViewStateFullscreen)
|
||||
{
|
||||
self.controlsManager.hidden = YES;
|
||||
[[MapsAppDelegate theApp].m_locationManager start:self];
|
||||
|
||||
double latitude;
|
||||
|
@ -242,6 +244,7 @@ static BOOL keyboardLoaded = NO;
|
|||
}
|
||||
else if (state == SearchViewStateHidden)
|
||||
{
|
||||
self.controlsManager.hidden = NO;
|
||||
[self.searchBar.textField resignFirstResponder];
|
||||
[UIView animateWithDuration:duration delay:0 damping:damping initialVelocity:0 options:options animations:^{
|
||||
self.searchBar.cancelButton.alpha = 1;
|
||||
|
|
|
@ -1,18 +0,0 @@
|
|||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "LocationButton.h"
|
||||
#import "UIKitCategories.h"
|
||||
|
||||
@class ToolbarView;
|
||||
@protocol ToolbarViewDelegate <NSObject>
|
||||
|
||||
- (void)toolbar:(ToolbarView *)toolbar didPressItemWithName:(NSString *)itemName;
|
||||
|
||||
@end
|
||||
|
||||
@interface ToolbarView : SolidTouchView
|
||||
|
||||
@property (nonatomic, weak) id <ToolbarViewDelegate> delegate;
|
||||
@property (nonatomic) LocationButton * locationButton;
|
||||
|
||||
@end
|
|
@ -1,139 +0,0 @@
|
|||
|
||||
#import "ToolbarView.h"
|
||||
#import "MapsAppDelegate.h"
|
||||
#import "Framework.h"
|
||||
#import "BadgeView.h"
|
||||
|
||||
@interface ToolbarView ()
|
||||
|
||||
@property (nonatomic) UIButton * searchButton;
|
||||
@property (nonatomic) UIButton * bookmarkButton;
|
||||
@property (nonatomic) UIButton * menuButton;
|
||||
@property (nonatomic) BadgeView * menuBadge;
|
||||
@property (nonatomic) UIImageView * backgroundImageView;
|
||||
|
||||
@end
|
||||
|
||||
@implementation ToolbarView
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame
|
||||
{
|
||||
self = [super initWithFrame:frame];
|
||||
|
||||
[self addSubview:self.backgroundImageView];
|
||||
|
||||
[self.locationButton addTarget:self action:@selector(locationButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
[self addSubview:self.locationButton];
|
||||
|
||||
self.searchButton = [self buttonWithImageName:@"SearchButton"];
|
||||
[self.searchButton addTarget:self action:@selector(searchButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
self.bookmarkButton = [self buttonWithImageName:@"BookmarkButton"];
|
||||
[self.bookmarkButton addTarget:self action:@selector(bookmarkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
self.menuButton = [self buttonWithImageName:@"MenuButton"];
|
||||
[self.menuButton addTarget:self action:@selector(menuButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
|
||||
[self layoutButtons];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(outOfDateCountriesCountChanged:) name:MapsStatusChangedNotification object:nil];
|
||||
[self updateMenuBadgeWithCount:GetFramework().GetCountryTree().GetActiveMapLayout().GetOutOfDateCount()];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)outOfDateCountriesCountChanged:(NSNotification *)notification
|
||||
{
|
||||
[self updateMenuBadgeWithCount:[[notification userInfo][@"OutOfDate"] integerValue]];
|
||||
}
|
||||
|
||||
- (void)updateMenuBadgeWithCount:(NSInteger)count
|
||||
{
|
||||
[self.menuBadge removeFromSuperview];
|
||||
if (count > 0)
|
||||
{
|
||||
BadgeView * badge = [[BadgeView alloc] init];
|
||||
badge.value = count;
|
||||
badge.minY = 4;
|
||||
badge.minX = self.menuButton.width / 2 + 10;
|
||||
[self.menuButton addSubview:badge];
|
||||
self.menuBadge = badge;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)locationButtonPressed:(id)sender
|
||||
{
|
||||
[self.delegate toolbar:self didPressItemWithName:@"Location"];
|
||||
}
|
||||
|
||||
- (void)searchButtonPressed:(id)sender
|
||||
{
|
||||
[self.delegate toolbar:self didPressItemWithName:@"Search"];
|
||||
}
|
||||
|
||||
- (void)bookmarkButtonPressed:(id)sender
|
||||
{
|
||||
[self.delegate toolbar:self didPressItemWithName:@"Bookmarks"];
|
||||
}
|
||||
|
||||
- (void)menuButtonPressed:(id)sender
|
||||
{
|
||||
[self.delegate toolbar:self didPressItemWithName:@"Menu"];
|
||||
}
|
||||
|
||||
- (void)layoutButtons
|
||||
{
|
||||
CGFloat const xOffsetPercent = 1.0 / 8;
|
||||
CGFloat const xBetweenPercent = 1.0 / 4;
|
||||
|
||||
self.locationButton.midX = self.width * xOffsetPercent;
|
||||
self.searchButton.midX = self.locationButton.midX + self.width * xBetweenPercent;
|
||||
self.bookmarkButton.midX = self.searchButton.midX + self.width * xBetweenPercent;
|
||||
self.menuButton.midX = self.bookmarkButton.midX + self.width * xBetweenPercent;
|
||||
}
|
||||
|
||||
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
||||
{
|
||||
UIView * view = [super hitTest:point withEvent:event];
|
||||
return view == self ? nil : view;
|
||||
}
|
||||
|
||||
- (UIButton *)buttonWithImageName:(NSString *)imageName
|
||||
{
|
||||
UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 79, 44)];
|
||||
button.contentMode = UIViewContentModeCenter;
|
||||
button.midY = self.height / 2;
|
||||
button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
|
||||
[button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
|
||||
[self addSubview:button];
|
||||
return button;
|
||||
}
|
||||
|
||||
- (LocationButton *)locationButton
|
||||
{
|
||||
if (!_locationButton)
|
||||
{
|
||||
_locationButton = [[LocationButton alloc] initWithFrame:CGRectMake(0, 0, 79, 44)];
|
||||
_locationButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
|
||||
_locationButton.midY = self.height / 2;
|
||||
[_locationButton addTarget:self action:@selector(locationButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
|
||||
}
|
||||
return _locationButton;
|
||||
}
|
||||
|
||||
- (UIImageView *)backgroundImageView
|
||||
{
|
||||
if (!_backgroundImageView)
|
||||
{
|
||||
_backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"ToolbarGradient"]];
|
||||
_backgroundImageView.frame = self.bounds;
|
||||
_backgroundImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
||||
}
|
||||
return _backgroundImageView;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
@end
|
After Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 190 B |
After Width: | Height: | Size: 431 B |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 477 B |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 477 B |
After Width: | Height: | Size: 477 B |
Before Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 477 B |
After Width: | Height: | Size: 428 B |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 113 B |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 170 B |
BIN
iphone/Maps/Images.xcassets/LaunchImage.launchimage/750x1334.png
Normal file
After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 190 B |
|
@ -4,7 +4,7 @@
|
|||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "736h",
|
||||
"filename" : "ip6+p.png",
|
||||
"filename" : "1242x2208.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "3x"
|
||||
|
@ -13,7 +13,7 @@
|
|||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "736h",
|
||||
"filename" : "ip6+l.png",
|
||||
"filename" : "2208x1242.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "landscape",
|
||||
"scale" : "3x"
|
||||
|
@ -22,7 +22,7 @@
|
|||
"extent" : "full-screen",
|
||||
"idiom" : "iphone",
|
||||
"subtype" : "667h",
|
||||
"filename" : "iOS-Simulator-Screen-Sh-11.59.10.png",
|
||||
"filename" : "750x1334.png",
|
||||
"minimum-system-version" : "8.0",
|
||||
"orientation" : "portrait",
|
||||
"scale" : "2x"
|
||||
|
@ -32,7 +32,7 @@
|
|||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "640x960.png",
|
||||
"filename" : "640x960-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
|
@ -49,7 +49,7 @@
|
|||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "768x1024.png",
|
||||
"filename" : "768x1024-1.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
|
@ -65,7 +65,7 @@
|
|||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"minimum-system-version" : "7.0",
|
||||
"filename" : "1536x2048.png",
|
||||
"filename" : "1536x2048-1.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
|
@ -87,7 +87,7 @@
|
|||
"orientation" : "portrait",
|
||||
"idiom" : "iphone",
|
||||
"extent" : "full-screen",
|
||||
"filename" : "640x960-1.png",
|
||||
"filename" : "640x960.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
|
@ -102,28 +102,28 @@
|
|||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"filename" : "768x1024-1.png",
|
||||
"filename" : "768x1024.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"filename" : "1024x768-2.png",
|
||||
"filename" : "1024x768-1.png",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"orientation" : "portrait",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"filename" : "1536x2048-1.png",
|
||||
"filename" : "1536x2048.png",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"orientation" : "landscape",
|
||||
"idiom" : "ipad",
|
||||
"extent" : "full-screen",
|
||||
"filename" : "2048x1536-2.png",
|
||||
"filename" : "2048x1536-1.png",
|
||||
"scale" : "2x"
|
||||
}
|
||||
],
|
||||
|
|
Before Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 34 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_1.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_1@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_1@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 6 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_2.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_2@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_2@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_3.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_3@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_3@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_4.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_4@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_4@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_5.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_5@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_5@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 6.1 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_followandrotate_6.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_followandrotate_6@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_followandrotate_6@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 6 KiB |
|
@ -3,17 +3,17 @@
|
|||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "MyPositionAutoFollow.png"
|
||||
"filename" : "follow_to_noposition_1.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "MyPositionAutoFollow@2x.png"
|
||||
"filename" : "follow_to_noposition_1@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "my-position-auto-follow_xxhdpi.png"
|
||||
"filename" : "follow_to_noposition_1@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_noposition_2.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_noposition_2@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_noposition_2@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_noposition_3.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_noposition_3@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_noposition_3@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 5.9 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_noposition_4.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_noposition_4@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_noposition_4@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 5.8 KiB |
|
@ -0,0 +1,23 @@
|
|||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x",
|
||||
"filename" : "follow_to_noposition_5.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x",
|
||||
"filename" : "follow_to_noposition_5@2x.png"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x",
|
||||
"filename" : "follow_to_noposition_5@3x.png"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"version" : 1,
|
||||
"author" : "xcode"
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 1.5 KiB |