2016년 4월 14일 목요일

[android] 구글맵(Google Map) 레이아웃으로 구성된 커스텀 마커(이미지 + 텍스트) 생성하기

구글맵에서 제공하는 마커 기능을 사용해 레이아웃으로 구성된 상점 아이콘 이미지 + 상점명 텍스트를 오버레이 해본다.

일단 map_text_marker.xml 라는 띄우고 싶은 마커모양을 디자인 한 xml파일을 만든다.


이런 모양의 마커를 출력하고 싶다. (ImageView + TextView)

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="horizontal" android:layout_width="wrap_content"

    android:layout_height="wrap_content">



    <ImageView

        android:layout_width="30dp"

        android:layout_height="30dp"

        android:id="@+id/iViewCategory"

        android:src="@drawable/ic_test" />



    <TextView

        android:layout_width="wrap_content"

        android:layout_height="match_parent"

        android:text="Store Name"

        android:id="@+id/tViewName"

        android:textColor="#000000"

        android:textSize="13dp"

        android:gravity="center_vertical" />

</LinearLayout>


위 xml을 불러와서 구현하기 위해 LayoutInflater 로  View를 생성하고, ImageView와 TextView를 view.findViewById(R.id.textView) 로 가져와서 원하는데로 수정해준다. 그 후 Google Map 객체의 addMarker 메서드를 이용해서 마커를 추가해주면 된다. 구현한 코드는 아래와 같다.

* facility.getName()은 상점 명이 들어있고, facility.getLatLng()는 위도 경도 LatLng가 들어있다.
* activity 는 Activity 객체

View marker = ((LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.map_text_marker, null);
TextView tViewName = (TextView) marker.findViewById(R.id.tViewName);
tViewName.setText(facility.getName());

Marker m = googleMap.addMarker(new MarkerOptions().visible(false).position(facility.getLatLng()).icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(activity, marker))));


결과는 아래와 같이 표현된다.


위 스크린샷에서 위치 표시 ImageView의 아래 꼭지점 부분을 해당 좌표로 위치하게 하고 싶은데 마커의 기본적인 위치는 Marker의 Center Bottom으로 되어 있어서 위와 같이 제대로 된 위치에 찍히지 않게 되었다.

이를 해결하기 위해서 Anchor 기능을 이용할 예정이다.

2016년 4월 6일 수요일

[ios][objective-c] 접두사 NS가 붙는 이유 (prefix NS)

iOS 개발을 하다보면 클래스 이름에 NSString, NSSet과 같이 접두사(prefix) NS가 붙어있다.

애플 개발자 문서에 이렇게 설명되어 있다.

Historical Note: If you’re wondering why so many of the classes you encounter have an NS prefix, it’s because of the past history of Cocoa and Cocoa Touch. Cocoa began life as the collected frameworks used to build apps for the NeXTStep operating system. When Apple purchased NeXT back in 1996, much of NeXTStep was incorporated into OS X, including the existing class names. Cocoa Touch was introduced as the iOS equivalent of Cocoa; some classes are available in both Cocoa and Cocoa Touch, though there are also a large number of classes unique to each platform. Two-letter prefixes like NS and UI (for User Interface elements on iOS) are reserved for use by Apple.

애플사가 NextStep(NS)사를 인수했는데 이때 클래스 이름들이 중복되지 않아야 해서 NS라는 접두사를 붙였다고 한다.

Source: Programming with Objective-C

2016년 4월 5일 화요일

[ios][swift] AppDelegate에서 UIAlertController 사용

func showAlertWithTitle(title: String, message: String) {

        let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler:
            { action in
                switch action.style
                {
                case .Default:
                    print("default")
                case .Cancel:
                    print("cancel")
                case .Destructive:
                    print("destructive")
                }
        }))

        dispatch_async(dispatch_get_main_queue(), {
            self.window?.rootViewController?.presentViewController(alert, animated: true, completion: nil)
        })
    }



showAlertWithTitle(title, message: message)
로 호출하면 된다.

만약 코드 끝부분에 Alert 출력하는 부분에서 dispatch_async(dispatch_get_main_queue(), {} 로 감싸주지 않으면

Warning: Attempt to present <uialertcontroller: 0x125d424d0=""> on <reco_swift_sample .viewcontroller:="" 0x125e4aad0=""> whose view is not in the window hierarchy!

위와 같은 경고가 표시되면서 Alert이 뜨지 않는다.

2015년 1월 28일 수요일

[blog] SyntaxHighlighter 설정

<pre class="brush: 언어; 옵션이름 : ;"> 으로 사용

이 름초기값내  용
auto-linkstrueURL입력시 자동으로 링크시킬지 여부 설정 데모 보기
class-name''SyntaxHighlighter에 CSS를 적용시킬 때 데모 보기
collapsefalse내용 숨기기 여부 설정 (클릭시 보여지게 하는 기능). 데모 보기
first-line1첫번째 라인 번호를 변경 할 때 데모 보기
guttertrue왼쪽  넘버링(숫자) 표시 여부 설정 데모 보기
highlightnull특정 라인의 내용을 강조하고자 할 때 데모 보기
html-scriptfalseHTML/XML 코드를 강조하여 표시 데모 보기
smart-tabstrue탭 사용 설성. 데모 보기
tab-size4텝 사용시 뛰울 간격 설정 데모 보기
toolbartrue툴바 표기 설정. 데모 보기

여러가지 옵션을 동시에 지정하고 싶을 경우 세미콜론(;)으로 구분하여 연속으로 지정.
?
1
<pre class="brush: js; ruler: true; first-line: 10; highlight: [2, 4, 6]">...</pre>
(예)언어명:자바스크립트; 첫째라인 10번 부터; 강조라인 2,4,6 번 라인

그런데 위의 옵션을 항상 변경시킨 값으로 사용하고 싶을때는
SyntaxHighlighter 설정 과 마찬가지로 스킨-HTML/CSS-skin.html 의 </body></s_t3> 위에 다음과 같이 사용

?
1
2
3
4
SyntaxHighlighter.defaults['gutter'] = false;
SyntaxHighlighter.defaults['smart-tabs'] = false;
...
SyntaxHighlighter.all();
(예)넘버링과 탭 설정을 항상 사용하지 않을 경우

[Android][Error 해결] you need to use a theme.appcompat theme (or descendant) with this activity. 해결

android api v11 부터는 action bar 를 지원하지만 그 이전 버전에서 사용하기 위해서 v7-appcompat 을 사용해야 한다.

v7-appcompat을 사용했을 때

you need to use a theme.appcompat theme (or descendant) with this activity.

이와 같이 Theme.AppCompat 을 사용하지 않아서라고 나오는 에러를 볼 수 있다.
이때 아래와 같이 Theme를 설정하면 된다. (17번 줄만 추가)

res / values / styles.xml



    
    

    
    


2015년 1월 27일 화요일

[Android][java] Private Libraries, Android Dependencies, libs 알아보기


인터넷에서 예제 소스를 다운받아보다 이런 라이브러리 폴더(?)들을 많이 접하게 되었다.
라이브러리에 관련된 것이라는 것은 알고 있었지만, 정확히 어떤 것인지 몰라 많이 헤맬때가 많았다. 그래서 정리해봤다.


1. Android 4.4W.2 (안드로이드 버전마다 다름)
  • android.jar
Android 4.4W.2 버전의 기본 API library이다. 지정한 안드로이드 버전의 android.jar 라이브러리가 들어있다. 그러므로 이 library는 새로운 프로젝트를 생성할 때, 선택한 Android API level에 맞춰서 자동으로 생성된다.


2. Android Private Libraries
  • android-support-v7-appcompat.jar
  • android_support-v4
Android 버전이 낮은 디바이스에서 실행하기 위해 필요한 support library이다. 예를들어 Android API 19를 타겟으로 컴파일 했을 때, 이것을 낮은 API 버전의 디바이스에서 실행하기 위해서 android_support-v4 library가 필요하다.

v7과 v4의 차이점은 v7은 안드로이드 버전 3.0이상, v4는 안드로이드 버전 2.0이상의 디바이스에서의 실행을 지원한다.


3. Android Dependencies

Android Dependencies와 2번의 Android Private Libraries는 사실 '폴더'가 아니다. 이것들은 이클립스에서 사용자의 편의를 위해 만들어 놓은 것이다.

프로젝트를 생성하면, support library인 v4와 v7이 appcompat_v7_x/libs 폴더에 생성된다.

이것들을 Android Private Libraries는 단지 참조하는 것이다. 

그리고 Android Dependencies는 어떤 appcompat_v7_x 가 참조되고 사용되는지 알려준다.

libs와 Android Private Libraries는 이클립스 내에서 이름 옆에 표시되는 아이콘 부터 다른 모양이다. libs는 폴더이지만 Android Private Libraries는 실제 폴더가 아니기 때문이다. 그렇기 때문에 당연히 디스크에서 찾을수도 없다.

처음에 공부할 때, libs 에도 android_support-v4가 있고, Android Private Libraries에도 android_support-v4가 있어서 중복으로 충돌이 일어나는게 아닐까 하는 걱정이 있었는데, 중복이 아니었던 것이다!


4. Referenced Libraries

당연히 참조된 Library들을 표시해주는, 사용자의 편의를 위해 이클립스에서 만들어 준 실존하지 않는 폴더이다.