Commonlife's Blog

My daily life

iOS : 키보드 상태에 따른 화면제어

with 2 comments

기존 소스에서 키보드가 올라오면 키보드를 제외한 화면을 터치하면 키보드가 내려가는 걸 구현하려 했다.

* 조건사항 : 키보드를 제외한 화면에 버튼들이 많다. (실제 동작하는 버튼들)

 

* 계획 :

1. 화면을 덮는 UIView를 만든다.

2. 해당 UIView는 setHidden:YES 상태로 초기화

3. 키보드가 올라오면 해당 UIView는 setHidden:NO

4. UIView를 터치하면 키보드를 내린다.

5. 키보드가 내려가면 해당 UIView는 다시 setHidden:YES가 된다.

 

* 진행 중 문제 상황

1. xib 파일이 언어별로 나뉘어 존재하고 있었는데(2개) 상위 xib 파일에서 UIView를 붙였더니 실제 xib파일에 공통으로 적용되지 않는다.

  • 해결 : 각 xib파일 마다 UIView를 붙였음.

2. UIView에 터치 이벤트가 적용되지 않는다. (UIControlEventTouchUpInside)

  • 해결 : 결국 투명한 UIButton으로 바꾸고 이벤트를 적용시켰다.

3. 키보드 레이아웃을 default를 했음에도 줄바꿈이 되지 않는다.

  • 해결 : 아래 메소드에서 @”\n”을 따로 처리하고 있었다.
  • (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

 

* 부가적으로 키보드 상태를 알수 있는 메소드들

  • (BOOL)textViewShouldBeginEditing:(UITextView *)textView : 말그대로 키보드가 나오는 시점. 여기서 UIButton을 setHidden:NO
  • (BOOL)textViewShouldEndEditing:(UITextView *)textView : 키보드가 들어가는 시점. 여기서 UIButton을 setHidden:YES
  • (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
Advertisements

Written by tocommonlife

2012/09/25 at 02:54

iOS : 갤러리를 통해 가져오는 이미지 crop하기

leave a comment »

기본 갤러리 혹은 카메라를 통해 이미지를 가져올 때 crop하여 가져오게 하고 싶었는데 기존 소스를 수정해야 했다. 문제는 기존의 ViewController들을 거쳐야 한다는 점.

AviewController에서 ActionSheet를 통해서 갤러리 혹은 카메라를 선택하게 한 후 이미지를 선택하면 선택한 이미지를 BviewController에서 띄우고 여기서 NavigationBar를 이용해 서버에 등록한다.

이 과정에서 crop 단계를 추가한 것이다. 그런데 문제가 BviewController에서 NavigationBar가 나오지 않는 문제점이 발생되는 것이다.

– 앨범에서 사진 가져오기 : UIImagePickerControllerSourceTypePhotoLibrary

– 필요한 것들 :

  • UIImagePickerControllerDelegate : image를 가져오기 위한 delegate.
  • UINavigationControllerDelegate : image를 가져온 후 navigation bar에서 ok, cancel을 위한 delegate.
  • UIImagePickerController : Image Picker를 가져오기 위한 변수

 

– source : 호출하려는 화면의 AviewController에서

UIImagePickerController *imgPickerController = [[UIImagePickerControlleralloc] init];
[imgPickerControllersetDelegate:self];
imgPickerController.allowsEditing = YES;     //편집모드(crop)
[imgPickerControllersetSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
// 갤러리에서 이미지를 가져옴.

//[imgPickerControllersetSourceType:UIImagePickerControllerSourceTypeCamera];
// 카메라를 통해 이미지를 가져옴.

[selfpresentModalViewController:imgPickerControlleranimated:YES];                     // 화면전환.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // 이미지를 가져온 후 처리작업.
    UIImage *cameraImage = [info objectForKey:UIImagePickerControllerEditedImage];

    // 카메라에서 가져온 경우 : 카메라로 사진을 찍고 바로 사용하기 때문에 ViewController를 만들 필요는 없음.
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
        UIImageWriteToSavedPhotosAlbum(UIImage *image, id completionTarget, SEL completionSelector, void *contextInfo);
        [self dismissModalViewControllerAnimated:YES];
    }

    // 갤러리에서 가져온 경우 : 이미지를 가지고 새로운 ViewController를 만들어줘야 함.
    else if (picker.sourceType == UIImagePickerControllerSourceTypePhotoLibrary) {
        // crop한 이미지를 가지고 새로운 ViewController 만들기
        [picker pushViewController:newViewController animated:YES];
    }
}

– 새로운 ViewController에서 닥친 문제점은 기존에 사진을 바로 보여줄 때 NavigationBar가 잘 보이고 버튼들도 잘 보였음. 그런데 crop한 이미지로 대체하자 NavigationBar가 검은색으로만 나옴. 버튼들도 보이지 않아 작동하지 못함.

– BviewController에서 추가한 코드(원인은 찾지 못했지만 아래 코드를 넣어야만 navigationbar가 나타남.)

  • self.navigationController.navigationBarHidden=NO;

Written by tocommonlife

2012/09/14 at 02:29

NSLog 출력 내용

leave a comment »

2012-09-06 10:46:05.714 CMLSampleFoundation[575:403] The new date lives at 2012-09-06 01:46:05 +0000

  • 날짜 : 2012-09-06
  • 시간 : 10:46:05.714
  • 프로그램이름 : CMLSampleFoundation
  • 프로세스 ID : [575:403]
  • 출력내용 : The new date lives at 2012-09-06 01:46:05 +0000

Written by tocommonlife

2012/09/06 at 01:48

iOS에 게시됨

Tagged with ,

MacBook에 Ubuntu 설치 후 다시 되돌아오기

leave a comment »

맥북에 리눅스를 설치하려한 이유

  1. 지금 맥북의 성능이 조금씩 힘들어지기 시작한다.
  2. 애플 노트북이 비싸다.
  3. 다음 노트북을 살 때엔 비 애플 노트북을 구입하여 리눅스를 설치해서 사용하겠다는 계획을 세우게 됨.

 

맥북에서 우분투를 설치한 후의 불편한 점

  1. 스크롤 방향의 반대.
  2. Mac OS와 달리 GUI 환경에서 Root 환경은 Root 계정으로 따로 생성된다. (user A가 환경설정을 다 마친 후 gui상에서 root의 권한이 필요한 경우(terminal 제외) root로 다시 로그인을 하고 환경설정을 다시 해야 한다.)
  3. 재부팅 시 멈춘다.(종료 후 시작은 정상작동)
  4. Mac OS의 경우 /Applications 가 존재하여 응용프로그램 관리가 수월하지만 리눅스의 경우 없다.
  5. 리눅스에서 Mac OS의 영역에 GUI 환경에서 진입할 수가 없었다.(2번의 이유, 이건 나의 부족일 확률이 높음)

 

리눅스를 떠나며…

  1. 어차피 맥북이라 성능향상 효과를 기대할 수가 없다.
  2. 그럴거라면 굳이 지금 우분투를 할 필요가 없다는 생각.
  3. 더불어 리눅스에서 Mac OS X 영역에 접근이 안되니(GUI – 일반계정) 데이터를 중복할 수 밖에 없었다.

 

결국 나의 부족과 맥북의 사양으로 인하여 다시 Mac OS X으로 돌아가기로 했다.

  1. 문제는 리눅스의 swap영역이 Mac OS X의 디스크 유틸리티로 삭제 되지 않는다.
  2. 해결은 리눅스 설치 CD로 부팅 후 다시 리눅스를 설치하면서 swap영역을 지워버렸다.
  3. 이 후 Mac OS X으로 부팅 후 디스크 유틸리티로 리눅스 영역의 파티션을 삭제.

 

그래도 다음 노트북은 비 애플 노트북에 리눅스의 조합이 괜찮을 듯 싶다.

 

Written by tocommonlife

2012/08/17 at 11:01

mac os에 게시됨

Tagged with , ,

2개 이상의, 복수개의 레이아웃을 가진 ListView에서 ViewHolder 사용하기

leave a comment »

ListView를 활용하다 보면 거의 대부분이 두 개이상의 아이템 레이아웃을 활용할 때가 많다.

그럴 때면 ViewHolder를 활용하기가 참 난감하다. 하지만 메모리를 생각하면 ViewHolder를 활용해야 할텐데, 그게 잘 되지 않으니 고민이 깊어진다.

하지만 아래와 같이 활용하면 가능하다.

if (type == LIST_TYPE_01) {
    if (convertView == null) {
        separatorHolder = new SeparatorViewHolder();
        convertView = mInflater.inflate(R.layout.layout_01, null);
        separatorHolder.text = (TextView) convertView.findViewById(R.id.header_name);
        convertView.setTag(separatorHolder);
    } else {
        if (convertView.getTag() instanceof SeparatorViewHolder) {
            separatorHolder = (SeparatorViewHolder) convertView.getTag();
        } else {
            separatorHolder = new SeparatorViewHolder();
            convertView = mInflater.inflate(R.layout.layout_01, null);
            separatorHolder.text = (TextView) convertView.findViewById(R.id.header_name);
            convertView.setTag(separatorHolder);
        }
    }
    // layout 구현
} else {
    if (convertView == null) {
        secondViewHolder = new SecondViewHolder();
        convertView = mInflater.inflate(R.layout.layout_2, null);
        secondViewHolder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_layout);
        secondViewHolder.text = (TextView) convertView.findViewById(R.id.text_view);
        secondViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.check_box);
        convertView.setTag(secondViewHolder);
    } else {
        if (convertView.getTag() instanceof SecondViewHolder) {
            secondViewHolder = (SecondViewHolder) convertView.getTag();
        } else {
            secondViewHolder = new SecondViewHolder();
            convertView = mInflater.inflate(R.layout.layout_2, null);
            secondViewHolder.frameLayout = (FrameLayout) convertView.findViewById(R.id.frame_layout);
            secondViewHolder.text = (TextView) convertView.findViewById(R.id.text_view);
            secondViewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.check_box);
            convertView.setTag(secondViewHolder);
        }
    }
    // layout 구현
}

convertView.getTag()를 호출하기 전에 getTag()에 의해 return되는 객체가 사용하려는 ViewHolder가 맞는 지 체크하고 아닌 경우엔 새롭게 ViewHolder를 만드는 것이다.

Written by tocommonlife

2012/08/03 at 09:16

Android에 게시됨

Tagged with ,

물건 이야기

leave a comment »

  • 글쓴이 : 애니 레너드(Annie Leonard)
  • 옮긴이 : 김승진
  • 출판사 : 김영사
  • 1판1쇄 : 2011. 04. 27
  • 가 격 : 16,000원

추출, 생산, 유통, 소비, 폐기 등 물건의 라이프 사이클을 5개로 나누어 이야기한다. 콩고의 콜탄이 부른 내전과 학살, 시에라리온의 블러드 다이아몬드 등과 같이 평이한(?) 이야기, 뉴스에 나오는 이야기, 미국식 소비 이야기도 있지만 우리에게도 생각할 무언가는 이야기 해준다. 보통 저렴한 가격의 물건은 우리에게 ‘좋은’ 물건이다. 그럼 그 중에서 우리가 주위에서 쉽게 보는 저렴한 면 소재 옷은 과연 좋은 물건일까? 면은 물을 많이 필요로 하는 작물이다. 면을 재배해서 생산하는 국가에 면 가격이 적당하게 책정될까? 우리가 이런 면 소재의 옷을 수입해서 쓰는 것에 면을 재배할 때 들어간 물의 가격은 포함되어 있지 않다. 결국 우린 저렴하게 구매하지만 면을 재배하는 국가는 지속적인 물 부족에 시다릴 것이다. 게다가 저산업개발국가의 특성상 실질적으로 일하는 사람들은 가난한 사람들일 테고 물이 부족하면 이 들이 그 피해를 고스란히 뒤집어 써야한다. 저렴한 옷은 정말 ‘좋은’ 물건일까? 여기엔 내가 좋아하는 커피도 포함된다.

기업이 생산을 함에 있어 정당하게 그 원가를 계산하고 있을까? 만들 때 환경을 오염 시키는 비용, 그리고 무단 폐기에 따른 비용은? 기업은 이윤추구를 함에 정당한 것이 아니라 원가절감을 공공에게 떠 넘기고 부당이득을 취하고 있는 것이다. 우리가 흔히 생각하기에 기업의 이윤 추구 활동은 정당하다고 하지만 그 이면의 비용을 자세히 검토하면 그 들이 공기 중에 뿌리는 오염물질, 하천에 버리는 오염물질, 그리고 그 생산물이 버려지면서 발생되는 오염물질은 우리 주위를 돌고 돌아 우리 몸에 정착한다. 그리고 그로 인한 비용은 우리가 부담한다. 그러면서 기업은 자신들의 이윤이 정당하다 말한다. 기업의 이윤이 정당하려면 생산에서 발생되는 오염과 생산물을 수거하는 등의 자원의 채취, 생산, 폐기까지 전담해야 할 것이다.

그리고 국가간의 관계를 보면 부자국가가 오염이 심한 공장을 가난한 국가에 경제개발이라는 허울좋은 포장으로 옮기고 고농도오염물질을 버린다. 물론 정부 대 정부의 거래는 아니지만 그들은 민간기업끼리의 거래라고 눈 감아버린다. 가난한 자들은 자연을 누릴 권리가 없는 것이다. 그 어느 곳에도 정의는 없다. 개인과 개인에선 가난한 자가, 기업 대 노동자에선 노동자가, 기업 대 기업에는 중소기업이, 국가 대 국가에서는 가난한 국가가… 그게 정당하다 말하지 말자. 당신이 그 반대편에 설 일은 절대 없다.

Written by tocommonlife

2011/08/02 at 12:10

Books에 게시됨

지식의 쇠퇴

leave a comment »

  • 글쓴이 : 오마에 겐이치
  • 가격 : 15,000원

누구를 위한 지식인가

책을 보다 덮었다. 사람의 행복을 경제적인 가치로만 판단할 수 없다면서 철저하게 경제적인 가치로만 판단한다. 그것도 부도덕한 부도 행복의 기준이 된채로…

내가 읽던 도중의 몇 가지 이야기들을 보면 기업 사냥에 대한 외국 투기 자본과 그걸 지키려는 (일본)국내 판결을 보면서 외국 자본은 ‘악’이고, 국내 자본은 ‘선’인 이분법적인 자세를 갖지 말자고 했지만, 이건 표면적으론 맞는 말이고 내부적인 말을 본다면 틀린 말이다. 외국자본이 ‘선’의 동기로 들오는 경우가 과연 몇이나 될까? 내가 보기엔 외국 투기 자본이나 국내 무능한 경영인이나 둘 다 같지만 선거와 같이 차악을 선택하는 길 밖에 없는 것이다. 적어도 수술용 매스를 들이대는 것은 ‘우리’여야만 하는 것이다.

그리고 제로 금리에서도 돈을 은행에 맡기는 무능한 (일본)국민들 이야기를 했는데 물론 일본 속사정이야 내가 알 길이 없는 것이고, 만약 국내에 적용시킨다면 부산저축은행 사건이 떠오른다. 제2금융권의 신뢰가 땅에 떨어진 지금, 사람들은 안정적으로 금융거래를 하기 위해선 제1금융권으로 갈 수 밖에 없고, 몇 안되는 제1금융권의 은행들 덕분에 금리를 쳐다볼 수 없는 것이다. 그렇다고 주식으로 돌리자니 개미투자자들은 기관과 대규모 펀드, 외국 자본에 돈을 퍼주는 사람들이 되버렸고, 부동산에 투자하자니 이미 치솟은 부동산에 몇천만원은 그저 푼돈에 지나지 않는다. 결국 다시 제1금융권으로 돌아올 수 밖에 없는 것이다.

이 책을 보면서 느끼는 것은 이 사람은 뭐랄까 자신의 생각과 판단에 결점이 없다고 여기는 사람인 것 같다. 책장을 넘길 수록 이렇게 닫힌 사고가 글에 묻어나니 결국 책을 덮을 수 밖에 없다. 이건 시간 낭비다.

집단지성을 높여 부도덕한 부가 팽배해져 신뢰가 없는 사회보다는 신뢰를 기반으로 무언가 도전하더라도 사회적 안정망이 받쳐주기 때문에 빠르고, 다양하게 움직일 수 있도록 집단도덕이 높은 사회가 더 발전적일 것이다.

Written by tocommonlife

2011/05/02 at 14:42

Books에 게시됨