2013 이전/iOS개발

[iPad 개발] PopoverController contentSize 문제

hagulu 하구루2017. 2. 25. 16:32

PopoverController 를 사용하다보면 사이즈 때문에 골머리를 썩을 경우가 많을 것이다.

일단 가장 평범한 방법은 해당 PopoverController에 들어갈 해당 UIViewController에
- (CGSize)contentSizeForViewInPopover {
    return CGSizeMake(320, 480);
}
위 처럼 해당 하는 함수를 override 해주면 리턴하는 사이즈로 PopoverController 사이즈를 조절 해준다.
하지만 여기도 문제점이 하나 있다.
navigationController를 사용할때 push나 pop을 하게 되면 늘어나기는 하지만 줄어 들지는 않는다.
구글링을 통해서 얻게된 방법인데, 일종의 꼼수라고 볼수 있겠다.
- (void) forcePopoverSize 
{
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, 
                                          currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
}


- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self forcePopoverSize];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

위 처럼 ViewController에 해당하는 함수에 위 내용을 추가만 해주면 된다.
모두 ViewController 멤버를 사용하는 것이니, 바로 가져다 붙여 써도 잘 적용될것이다.
해당 메소드 이름을 정확히 확인하고 적용 바란다.
처음에 잘못 보고 적용을 해서 삽질을 했엇다. ㅠㅠ

각 viewController에 위사항을 적용하면, 언제 그랫냐는 듯이 pop, push 간에 PopoverController크기가 늘었다 줄었다 한다.

하지만 여기도 문제는 있다.
ViewController 사이의 사이즈 크기가 차이가 많이 나면 정신없이 움직여서 산만한 느낌이 든다.
이 기능이 꼼수를 통해서만 이루어 지는걸 봐서는 정신 없게 움직이는것을 방지하기 위해 그렇지 않을까 싶다.

때문에, 이 소스의 적용은 상황에 따라 잘 적용해야 할 것이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 안정적이고 flexible 한 UITableViewCell UI 구현하기

hagulu 하구루2017. 2. 25. 16:31

UITableView 를 이용할때 Cell을 Customize 하여 사용하는 경우가 많을 것이다.

 이렇게 사용할때  Cell의 크기에 따라 Cell의 구성요소의 위치와 크기가 다르게 구성하는 경우가 많을 것이다.
 하지만 각각의 Cell을 UI사이즈나 위치가 변경할때 마다 각각의 Cell의 위치나 크기를 매번 새로 적용해주게 되면 여러 문제가 발생할 수가 있다.
 이때, 해당 Cell의 frame만 가지고 구성요소의 위치를 지정해 주게 되면 여러 문제에 봉착하게 된다.

 그래서 Cell을 구성할떄 위치와 크기에 변화가 필요한 것들은 모두  각 UIView에 AutoresizingMask를 적용하여 사용해야 한다. 전체 View가 유기적으로 AutoresizingMask를 적용하지 않아서 전체 적으로 static하게 구성하더라도, Cell은 적어도 AutoresizingMask를 통해서 구성해야 한다.
 Cell의 frame을 이용해서 계산하여 UIView의 위치를 배치하면, 최초 구동시나, 회전하여 구동할때 등 문제가 발생하게 된다.

 그리고 한가지 더 중요한 점이 Cell에서 구성되는 UIView를 Cell의 self에 바로 addSubview하는 경우가 많은데, 꼭! self.contentView에 addSubview 를 해주는 것이 좋다. Grouped UITableView에서 는 cell안에 표시되려면 꼭 필요한 부분이고, Plain이라고 하더라도 적용해 주어야한다. 그렇지 않으면 AutoresizingMask하는 부분이 의도한 대로 진행되지 않을 것이다. 따라서 특정한 경우가 아니라면 꼭 contentView에 addSubview를 해주어야 한다.
 어찌보면 당연한 것이지만, 쉽게 생각하고 무시하고 진행하는 경우가 있기때문에, 이 두 부분은 꼭 기억하고 UIView를 관리 하기 바란다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] UIPopoverController 의 EKEventEditViewController 키보드 문제

hagulu 하구루2017. 2. 25. 16:31

iOS5에서 PopoverController위에 EKEventEditViewController를 올려서 사용하다 보면 cancel 버튼이나 done 버튼을 통해서 나왔을때는 문제가 없지만,


UIPopoverController의 바깥 공간을 선택했을때는 UIPopoverController가 사라져도 키보드가 내려가지 않는 문제가 발생한다.

해당 viewController의 view에 endEditing: 을 이용해 보아도 변화가 없다.

구글링을 통해서 일본사이트에서 해결 방법을 찾았다.

일본어는 번역기로도 꽤 읽을 만한 내용이 나온다.

해당 내용은 참고한 사이트에서 문제점을 수정하고 정리한 소스이다.
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {

    EKEventEditViewController *ev = (EKEventEditViewController *)self.popoverController.contentViewController;
    for (UIView* view in [[ev navigationBar] subviews])
    {
        if ([NSStringFromClass([view class]) isEqualToString: @"UINavigationButton"])
        {
            UIButton* btn = (UIButton*)view;
            
            for (UIBarButtonItem* buttonItem in [btn allTargets])
            {
                id target = [buttonItem target];
                SEL sel = @selector(cancel:);
                
                if ([target respondsToSelector: sel])
                {
                    [target performSelector:sel];
                    
                    NSLog(@"target = %@", NSStringFromClass([target class]));
                    NSLog(@"action = %@", NSStringFromSelector(sel));
                    
                }
            }
        }
    }
    
    return YES;   
}

위 소스 처럼 UIPopoverController의 delegate인 "popoverControllerShouldDismissPopover:" 에 추가해주면 된다.

위 소스 내용은 UIPopoverController가 바깥쪽을 선택하여 사라지기 직전에 EKEventEditViewController의 navigation item중에서 selector가 cancel:인 item을 찾아서 cancel: 를 실행해주는 방식이다.

어찌보면 꼼수라고 할 수 있어서 정답이라고는 말할 수 없을것 같다.

혹시 좀더 깔끔한 답을 알게 된다면 다시 포스팅 해보도록 하겠다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 현재 view의 모든 text editing 중단하기

hagulu 하구루2017. 2. 25. 16:30

textfeild 나 textView 등 text를 editing 하는 view를 만들다 보면

키보드등 여러 문제로 골머리를 썩은 경험이 있을것이다.

특히, resignFirstResponder를 통해서 해당 editing을 그만 두려고 해야할때,

cell위에 사용하거나 여러 view가 중첩되어 해당 view의 객체를 컨트롤 하기 힘든경우가 발생할 수 있다.

이때 해당하는 뷰의 모든 subview들의 editing을 그만 두도록 한번에 처리 할수 있는 메소드가 있다.

[targetView endEditing:YES];

위 처럼 해당 뷰의 메소드를 호출하게되면 모든 subview들에 있는 editing이 멈추게 된다.

editing 때문에 올라와 있던 키보드들도 내려가게 된다.


댓글

댓글쓰기 폼

2013 이전/node.js

[node.js] npm을 이용한 module 설치

hagulu 하구루2017. 2. 25. 16:30

node.js 가 최근 많은 각광을 받는 이유 중 가장 큰 이유가 바로 강력한 추가 module들 때문이다.

 

 위 주소 공식사이트를 가보면 알겟지만 현재 18,333개의 모듈들이 들록되어 있다. 게다가 빠른속도록 추가되고 있고, 업데이트도 활발이 이루어 지고 있다. 모듈을 설치하고 사용하는 법은 매우 간단하다.
 node.js 를 설치할때 같이 설치된 npm을 이용하면 간단히 사용 할 수 있다. npm 은 간단한 명령으로 등록된 module을 쉽게 install 하고 update 할 수 있다.
 Mac 의 Mac port 나 Linux 의 apt-get 등의 package 관리 툴들을 이용해 보았다면 낯설지 않게 이용할수 있을것이다.

$npm install socket.io

 위와 같은 명령으로 간단하게 socket.io 를 설치 할 수 있다.
 기본 설치 위치가 /usr/local 으로 되어 permission 문제 때문에 설치가 제대로 이루어 지지 않을 수도 있으니 sudo 를 통해서 하기를 권장한다.

이외에 해당 module을 최신화를 위해 아래와 같이 update 명령을 이용하면 된다.

$npm update socket.io

이외에도 여러 명렁을 통해서 npm을 컨트롤 할 수있다  이들에 대해서는

$npm

위 처럼 command 없이 입력하면 이용가능한 명령어들을 볼 수 있다.
//socket_io.js
var socket = require("socket.io");

socket.listen(8005);

socket.sockets.on('connections', function(socket) {

        socket.emit('news', {hello:'world'});

});

socket.sockets.on('my event', function(data) {
        console.log(data);
});
설치한 module 은 위처럼 require 를 통해서 사용할 수 있다.
위 예제에서는 나중에 socket.io에 대해서 다룰때 다시한번 언급 해보도록 하겠다.

하지만 이대로 소스를 실행하명 다음과 같은 에러를 보게 될것이다.

module.js:337
    throw new Error("Cannot find module '" + request + "'");
          ^
Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:337:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:359:17)
    at require (module.js:375:17)
    at Object.<anonymous> (/Users/gwanlija/socket_io/socket_io.js:1:76)
    at Module._compile (module.js:446:26)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:31)
    at Function._load (module.js:311:12)
    at Array.0 (module.js:484:10)

 해당 module 이 없다는 것인데, 방금 설치 했는데 없다니.. 무슨일일까? 바로 디렉토리 문제이다.
 해당 module이 설치된 디렉토리에서 소스를 저장하고 실행해야 해당 module 못찾는다는 위와 같은 에러가 나타나지 않는다. 일반적인 경우라면 /usr/local/lib 의 하위 디렉토리에서 가능하다.
 그런데.. 이렇게만 가능하다면 찝찝할 수 밖에 없다. 내가 원하는 디렉토리에서 실행이 불가능 한걸까?
 방법은 있다 해당하는 module 들을 소스가 들어 있는 디렉토리에 포함시켜야 한다. 이를 간단하게 해주는 것이 바로 package.json 파일이다. 해당 파일은 module 패키지에 대한 여러 정보를 정리 한 파일이다.

자세한 사항은 아래 링크를 확인 하기 바란다.


일단 여기서는 위에서 발생하는 문제의 해결에 필요한 것만 초점을 맞추도록 하겠다.
//package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "socket.io": "0.9.11"
  }
}
위와 같은  구조로 되어 있다. 윗부분은 보는것처럼 간단한 application 에 대한 정보를 기록한다.

그리고 주목하야 할것이 "dependencies" 항목이다.

socket.io 에 의존하고 있다고 명시하고 있다.
json 문법대로 키 벨류 쌍으로 이용하는 module을 필요하다면 추가로 명시해주면 된다.
이 파일을 소스가 들어 있는 디렉토리에 저장하면 된다.

그리고 해당 디렉토리에서

$npm install

위 처럼 입력하고 수행하면 package.json 의 "dependencies" 에 명시되어 있는 module을 해당 디렉토리에 설치가 되어 진다.
설치가 끝나고 다시한번 소스를 수행해 보면 문제 없이 수행되는것을 확인 할 수 있을 것이다.


댓글

댓글쓰기 폼

2013 이전/node.js

[node.js] mac에서 node.js 설치 하기

hagulu 하구루2017. 2. 25. 16:29

최근 많은 관심을 받고 있는 node.js 에 관해서 하나씩 포스팅 해보려고 한다. 현재 내가 구동하고 있는 서버가 mac이므로 mac 위주로 진행될 것이다.



일단 node.js를 정말 간단히 소개하면, javascript 엔진위에 돌아가는 프레임워크로 기존의 웹 클라이언트에서 이용되는 것이 아니라,  서버 사이드에서 python, perl, rudy 와 비슷한 방식으로 이용할 수 있다고 보면 될 것이다.

자세한 사항은 아래 위키 페이지와 다른 정보를 더 얻어 보기 바란다.



설치 방법은 매우 간단하다.
아래 공식 사이트를 가서 각 플랫폼에 맞는 파일을 받아서 설치하면된다.


mac pkg 로 배포하기 때문에 매우 설치가 간단하다.





node.js 를 설치하면 위에 보는것 같이 npm 도 같이 설치되고, 기본 설치 경로가 위와 같다.
npm 이란 node packaged modules 의 약자로 node.js에 쓰이는 각종 module들을 설치하고 update 할수 있는
 tool 이다.

npm 사용법은 앞으로 포스팅될 여러 모듈들 예제에서 사용법을 설명하겠다.
npm의 공식 사이트는 https://npmjs.org/ 이다.
그리고 $PATH 설정도 추가 되어 node 라는 명령으로 어디서든 사용이 가능하다.

여기 까지 완료되면 아주 간단하게 node.js 의 기본 설정이 완료 되었다.
사용법은 기존 python이나 perl등의 언어를 사용해 봤다면 익숙할 것이다.  
아래와 같이 node 명령어로 인터프리터를 바로 사용할 수 있다 (나가려면 ^c 를 두번 해주면 된다)



그리고 .js 파일을 작성하여 실행할 수도 있다.
아래는  wiki에 나와 있는 간단한 웹서버 구현 예제이다.
//nodeHttp.js

var http = require('http');
 
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);
 
console.log('Server running at https://localhost:8000/');
위와 같이 작성하고 아래처럼 실행하면 웹서버가 수행되고




다음과 같은 결과를 얻을 수 있다.
보는 것처럼 기본적인 설치와 사용법은 매우 간단하고 직관적이다.
문법이 javascript라는 점도 매우 매력 적이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 유용한 각종 UI controller open source 정리 사이트

hagulu 하구루2017. 2. 25. 16:26

iOS에서 쓰이는 기본적인 UI 컨트롤러 외에 좀더 편리한 Custom controller 를 구현하고자 한다면 다음 사이트를 먼저 찾아보고 해보기 바란다.



해당 사이트는 custom으로 만들어 놓은 각종 컨트롤들이 open source로 공개되어 정리되어 있다.
iOS 뿐아니라 Max OSX까지도 올려져 있다. 꽤나 많은 자료가 있고, 최근 유행하는 Custom controller들이 많이 올라와 있어서 아주 유용할것이다. 그리고 라이센스 별로 나누어져 있어서 이부분에서도 사용이 편리할 것이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 지역에 맞게 날짜 표기 하기

hagulu 하구루2017. 2. 25. 16:26

글로벌하게 앱을 배포하려 하다 보면 날짜 형식을 표시하는데 문제가 생긴다.


일반적으로 우리나라의 표기 방식은

"2012년 10월 5일 금요일" 이런식으로 표시 된다.

하지만 미국의 경우는

"Friday October 5, 2012" 로 표기 순서와 방식이 다르다

그외에 또 다른 나라는 그 나라만의 표기 방식이 있다.

하지만 이를 지원하기 위해 모든 지역의 표기 방식을 찾아서 따로 처리 할 수는 없는 노릇이다.


다행이도 이를 쉽게 적용할 수 있는 method가 존재한다.

위와 같이 날짜를 표기 할때 NSDateFomatter를 사용하게 될 것이다.

기본적인 사용법은 따로 언급하지 않겠다.

한국의 표기 법대로 위의 경우라면

"yyyy MMMM d EEEE" 정도가 될 것이다.
이것을 현재 디바이스에 설정된 지역의 표기 방식으로 한방에 변환 시켜주는 함수가 있다.

간단한 예제를 보여 주겠다.
   NSString *dateFormatString = @"yyyy MMMM d EEEE";
    dateFormatString = [NSDateFormatter dateFormatFromTemplate:dateFormatString options:0 locale:[NSLocale currentLocale]];
    
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:dateFormatString];
    
    NSLog(@"%@", [dateFormat stringFromDate:[NSDate date]]);
위 예제를 수행하게 되면 위에 언급했던 방식으로

한국은 "2012년 10월 5일 금요일" 미국은 "Friday October 5, 2012"로 표시 된다.

위에서 보는것처럼 우리나라의 표시 방식으로 포멧을 스트링으로 만들고 이것을 아래 메소드를 통해서

만든 포멧 스트링과 현재 로케일 정보를 넣어 주면 해당 지역에 맞는 포멧 스트링을 리턴해 준다

dateFormatFromTemplate:dateFormatString:options:locale:

미국의 경우 "EEEE, MMMM d, yyyy"로 변환이 되고한국의 경우 "yyyy년 MMMM d일 EEEE"으로 변환이 된다.

미국의 경우 순서가 바뀌었고,

한국의 경우 "년" "일" 이라는 포멧을 넣지 않았지만 우리나라에 맞춰서 들어가는것을 알 수 있다.
("월"은 EEEE포멧일경우 자동으로 들어 간다)

이것을 이용하면 글로벌하게 배포될 앱의 날짜 포멧의 문제는 한방에 해결되게 된다.

참고로 위 메소드에 현재 로케일은 아래 그림에 표시된 부분의 설정에 따르게 된다. 


 .     


댓글

댓글쓰기 폼

2013 이전/기타

손쉽게 개발서버 구축하기

hagulu 하구루2017. 2. 25. 16:24

예전에 우분투 환경에서 웹서버를 구축하고 이용을 하였었다.


그때 당시 필요에 의해서 ruby on rails 와 redmine을 셋팅하려고 하였는데.. 몇일을 삽질하다가 포기한적이 있다.

리눅스 셋팅에 아직 서투른가보다 하고 고배를 마셨다가,

최근 다시 필요로 해서 Mac환경에서 Redmine을 설치하려고 하였다.

Mac은 더 어려우면 어쩌지하고 찾아 보고 있다가 엄청난 것을 발견하였다.

바로 Bitnami 라는 프로그램이었다.


위 링크를 보면 알겠지만 redmine을 비롯해서 서버 개발자들이 좋아하는 툴들이 모아져 있다.

해당 툴들을 이용하기위한 모든 설치와 셋팅을을 간단한 설치 하나로 해결해 준다.  

더욱 엄청난 것은 윈도우, 리눅스, 맥OS 등의 os에 설치 파일을 제공할 뿐 아니라 vmware을 위한 이미지와 cloud Amazone machine 에서 사용할 수 있는 Amazon AMI 또한 제공해준다.

게다가 일부 메뉴는 설명에 한국어까지 지원되니.. 감격일 따름이다.

본인의 경우 redmine에 mysql, php, svn 등 패키지로 설치가 되어, redmine만 사용하려다가 svn 까지 적용해서 사용하게 되었다.

그외에도 많은 서비스와 툴들이 숨어 있으니 한번 훑어 보는것도 좋을것 같다.



댓글

댓글쓰기 폼

2013 이전/기타

내 도메인을 활용한 무료 ddns 설정 dnsEver

hagulu 하구루2017. 2. 25. 16:23

유동 ip를 사용하는 집에서 서버를 이용하려면 언제 바뀔지 모르는 ip 때문에 힘든점이 많다.


이떄 사용하는 것이 ddns 라는 방법이다.

ddns에 대해서는

http://terms.co.kr/DDNS.htm 를 참조해 보기 바란다.

일반적으로 공유기에서 제공해주는 기능을 이용하는 것이 간편하다.

ipTime의 경우 아래의 링크를 확인해 보기 바란다.


하지만 자신의 도메인을 이용할 수 없어서 그닥 땡기지가 않는다.

일반적으로 호스팅을 사용하는 사용자는 dns를 이용해서 ddns를 활용할 수 있는 방법이 없기때문에 한계가 있다.

그러던 중 알게된 무료! 서비스를 하나 소개하려고 한다.

dnsEver 라는 곳인데, 간단히 이야기 하면 간단한 dns를 제공하고 웹으로 손쉽게 셋팅을 할 수 있게 해주는 서비스다.

주소는 http://dnsever.com 이다

무엇보다 좋은것은 ddns를 제공하고, 해당 ip를 http 리퀘스르를 통해서 쉽게 변경 할 수 있다.

즉, ddns를 자동화 하기가 쉽다는 것이다.

심지어는 윈도우에서는 자동화 프로그램까지 배포 하고 있다.

기본적인 사용 방법은 아래 링크에 너무나도 잘 설명되어 있다.



나같은 경우 지금 보고 있는 블로그는 cafe24의 호스팅을 hagulu.com으로 유지하고

ddns로 mini.hagulu.com을 추가하여 이용하도록 설정하였다.


이를 위해서는 먼저 도메인의 네임 서버를 dnsEver에서 제공해주는것으로 교체를 하고,





메뉴 중에서 호스트 ip 관리를 통해서 메인 ip를 등록하고(본인의 경우 cafe24 내 ip),

다이나믹 dns 관리를 통해 위에 링크에서 설명하는데로 설정해주면 된다.

기존에 메일을 다른쪽으로 돌려서 쓰고 있더라도 메일서버(MX)도 가능해서 걱정할 필요가 없다.

이외에도 위에 보이듯이 여러 작업을 할 수 있으며

 현재, 웹 포워딩 외에는 모두 무료로 사용 할수 있다.


네임서버를 변경하면 몇일은 안정적이게 도메인이 작동하지 못하니 이점은 고려하고 작업을 진행해야 할것이다.


댓글

댓글쓰기 폼

hagulu.com

.....

VISITED

Today : 0

Total : 182,640

Lately Comment