iOS2012. 9. 13. 23:49

I just want to enable/disable the status bar per view controller (some view full screen, some not)

I've been several times through all the post related to the status bar 20 pixels issue, but still have the problem, especially on iOS5.0 (some trick worked on older iOS version):

Here is the problem definition:

  • I use [[UIApplication sharedApplication] setStatusBarHidden:YES] to hide the status bar

  • I always have the 20 pixel height white empty area if I do this

  • I've try to enable/disable the navigation bar to force a layout, this does not works on iOS 5:

    [self.navigationController setNavigationBarHidden:NO animated:NO];
    [self.navigationController setNavigationBarHidden:YES animated:NO];
  • I've try to manually reset the view frame size, no change

    self.view.frame=CGRectMake(0, 0, 320, 480);

  • I've tried to change manually the navigation container view:

    self.navigationController.frame=CGRectMake(0, 0, 320, 480);

  • All the view are of course 480 pixels height

share|improve this question

62% accept rate
First try to improve your accept rate it's too low – Wolvorin Jul 27 at 13:27
so you have a tip @AalokParikh ? – tomsoft Aug 8 at 17:59
I use this to show and hide the statusbar [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; And also design view according to the statusbar's hidden status ie. If statusbar is hidden I design my View with no statusbar in it. :) – Wolvorin Aug 9 at 9:37
well, I've tried this too , but the beahvior also is different depending of the iOS version. I've finally had to rewrite completely the navigation framework in order to be 100% sur to manage it... – tomsoft Aug 9 at 11:59
Oh I dont get any difference or not been able to detect it sorry :( – Wolvorin Aug 9 at 12:00
show 2 more comments
Was this post useful to you?     

Use the following method in viewWillAppear of view controller to which you would like to display StatusBar.

[[UIApplication sharedApplication]setStatusBarHidden:YES];

Declare one BOOL variable to indicate whether status bar is hidden or not while view is loaded in view controller which you would like to hide status bar and set its value to NO.

BOOL statusBarHidden = NO;

Then add the following code in viewWillAppear of view controller(Status Bar is hidden in this view)

[[UIApplication sharedApplication] setStatusBarHidden:YES];
if(statusBarHidden == NO)
{
   
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);
    statusBarHidden
= YES;

}

Posted by 다오나무
iOS2012. 9. 13. 23:17

게임을 만들때 반드시 처리해야 할일 상태바를 감춰야 한다.

게임에서는 상태바에 시간 베터리 양이 보이면 상대적으로 몰입도가 떨어진다.

아무리 보드게임이라 할지라도 반드시 없애 줘야 사용자가 좀더 게임에 몰입한다.

이게 근데 어떻게 설정 해서 하는건지 모르면 난감하다.


AppDelegate 소스에

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Hide the status bar
    [UIApplicationsharedApplication].statusBarHidden = YES;

위와 같은 간단한 코드로 해결이 된다.

오늘의 팁은 끝!

Posted by 다오나무
iOS2012. 9. 13. 13:49

UIImageView를 터치했을 경우의 이벤트를 얻어야 할 경우.
UIControl을 이용해 이벤트를 얻어온다.

1. UIImageView 생성.
2. UIControl 타입의 mask 생성.
3. mask 에 imageView 자식 뷰로 추가
4. mask 에 이벤트 설정.
5. 현재의 뷰컨트롤러의 뷰에 자식뷰로 mask 추가.



    UIImage * image = [UIImage imageNamed:@"sexy.jpg"];

    UIImageView * imageView = [[[UIImageView allocinitWithImage:image] autorelease];

    [imageView setFrame:CGRectMake(10.0f10.0f90.0f90.0f)];

    [imageView.layer setBorderColor:[[UIColor grayColorCGColor]];

    [imageView.layer setBorderWidth:1.0];

    [imageView.layer setCornerRadius:10.0];

    [imageView.layer setMasksToBounds:YES];

    

    UIControl * mask = [[[UIControl allocinitWithFrame:imageView.frameautorelease];

    

    CGSize imageSize = imageView.frame.size;

    imageView.frame = CGRectMake(00, imageSize.width, imageSize.height);

    [mask addSubview:imageView];

    

    [mask addTarget:self action:@selector(cancelButtonPush:) forControlEvents:UIControlEventTouchUpInside];

    

    [self.view addSubview:mask];

Posted by 다오나무
iOS2012. 9. 13. 13:34


왼쪽의 그림은 서클(또는 휠) 메뉴이다. 적당한 이름이 생각나지 않아 그냥 서클 메뉴라 칭했다. 좌우 제스처(gesture)를 이용해 메뉴를 좌우로 이동 시킨다. 그리고 메뉴가 보이는 상테에서 상하 제스처를 이용해 서클 메뉴를 이동 시킨다. 

샘플로 첨부한 프로젝트는 이러한 애니메이션을 구현한 예이다. 실제 사용하기 위해서는 메뉴에 실제 버튼(예에서는 단순히 배경이미지만을 보여 준다.)을 추가해 이때 처리할 로직을 추가해야 한다.

원형의 메뉴를 위한 애니메이션을 위해 CGAffineTransformMakeRotation를 사용해 좌표 시스템을 이동시키는 방법을 사용했다. 그런데 이때 상하 제스처를 쉽게 사용하기 위해 CircleMenu라는 백그라운드 역할을 뷰위에 원형의 메뉴 이미지를 올려 놓았다. 이렇게 하지 않으면 좌표 시스템의 이동에 따라 상하 제스처를 제대로 이용할 수 없다.

간단히 코드를 살표 보자. 자세한 내용은 다음에 첨부한 샘플 프로젝트를 참고하라.


우선 Xcode에서 View-based Application 템플릿을 이용해 프로젝트를 생성하자. 그리고 서클 메뉴의 백그라운드로 이용할 CircleMenu 클래스를 생성한다. 실제 사용하기 위해서는 이 곳에 버튼과 관련된 내용을 추가해야 한다. 샘플에서는 제스처 이벤트만을 처리하고 있다.

그리고 CircleMenuViewController를 다음과 같이 수정한다.

[CircleMenuViewController.h]

#import <UIKit/UIKit.h>

#import <QuartzCore/QuartzCore.h>
#import <AVFoundation/AVFoundation.h> 

#import <Audiotoolbox/AudioToolbox.h>


@class CircleMenu;


@interface CircleMenuViewController : UIViewController {

    UIButton *toggleButton; // 화살표 버튼.

    float lastRadian;

    BOOL isLeft; // 화살표 이미지 상태.

}


@property (nonatomicretainCircleMenu *circle;

@property (nonatomicretainUIImageView *imageView;

@property (nonatomicretainIBOutlet UIButton *toggleButton;


- (void)rotateCircleMenu:(UISwipeGestureRecognizer *)recognizer;

- (void)moveToLeftOrRight:(UISwipeGestureRecognizer *)recognizer;

- (void)playSound;


@end


[CircleMenuViewController.m]

#import "CircleMenuViewController.h"

#import "CircleMenu.h"


#define degreesToRadian(x) (M_PI * (x) / 180.0)



@implementation CircleMenuViewController


@synthesize circle;

@synthesize imageView;

@synthesize toggleButton;


- (void)dealloc

{

    [circle release];

    [imageView release];

    [toggleButton release];

    [super dealloc];

}

// 생략...
 

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    isLeft = YES;

    

    self.circle = [[CircleMenu allocinitWithFrame:CGRectMake(0.00.0225.0225.0)];

    self.circle.center = CGPointMake(420240);

    [self.view addSubview:circle];

    

    UIImage *image = [UIImage imageNamed:@"circle.png"];

    imageView = [[UIImageView allocinitWithImage:image];

    self.imageView.bounds = self.circle.frame;

    [self.circle addSubview:imageView];

    

    lastRadian = 0.0;

    

    // UISwipeGestureRecognizer 인스턴스 생성.

UISwipeGestureRecognizer *recognizerUp = [[[UISwipeGestureRecognizer allocinitWithTarget:selfaction:@selector(rotateCircleMenu:)] autorelease];

// 스와이프 제스처를 인식하기위한  .

recognizerUp.numberOfTouchesRequired = 1;

// 스와이프의 방향.

    recognizerUp.direction = UISwipeGestureRecognizerDirectionUp;

[self.circle addGestureRecognizer:recognizerUp];

UISwipeGestureRecognizer *recognizerDown = [[[UISwipeGestureRecognizer allocinitWithTarget:selfaction:@selector(rotateCircleMenu:)] autorelease];

// 스와이프 제스처를 인식하기위한  .

recognizerDown.numberOfTouchesRequired = 1;

// 스와이프의 방향.

    recognizerDown.direction = UISwipeGestureRecognizerDirectionDown;

[self.circle addGestureRecognizer:recognizerDown];

    

    UISwipeGestureRecognizer *recognizerLeft = [[[UISwipeGestureRecognizer allocinitWithTarget:selfaction:@selector(moveToLeftOrRight:)] autorelease];

// 스와이프 제스처를 인식하기위한  .

recognizerLeft.numberOfTouchesRequired = 1;

// 스와이프의 방향.

    recognizerLeft.direction = UISwipeGestureRecognizerDirectionLeft;

[self.view addGestureRecognizer:recognizerLeft];

// UISwipeGestureRecognizer 인스턴스 생성.

UISwipeGestureRecognizer *recognizerRight = [[[UISwipeGestureRecognizer allocinitWithTarget:selfaction:@selector(moveToLeftOrRight:)] autorelease];

// 스와이프 제스처를 인식하기위한  .

recognizerRight.numberOfTouchesRequired = 1;

// 스와이프의 방향.

    recognizerRight.direction = UISwipeGestureRecognizerDirectionRight;

[self.view addGestureRecognizer:recognizerRight];

    



// 생략...

#pragma mark - 커스텀 메서드


// 메뉴 회전.

- (void)rotateCircleMenu:(UISwipeGestureRecognizer *)recognizer

{   

    NSLog(@"Before frame: %@"NSStringFromCGRect(self.circle.frame));

    if (recognizer.direction == UISwipeGestureRecognizerDirectionUp) {

        lastRadian += 26;

}

if (recognizer.direction == UISwipeGestureRecognizerDirectionDown) {

        lastRadian -= 26;

}

    

    [UIView beginAnimations:@"Rotation" context:nil];

    [UIView setAnimationDuration:0.7];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    

    self.imageView.transform = CGAffineTransformMakeRotation(degreesToRadian(lastRadian));

    [self playSound];

    

    [UIView commitAnimations];

    

    NSLog(@"Last radian: %f"lastRadian);

    NSLog(@"After frame: %@"NSStringFromCGRect(self.circle.frame));

}


// 메뉴 이동(/).

- (void)moveToLeftOrRight:(UISwipeGestureRecognizer *)recognizer

{

    UIImage *image;

float moveCenterX;

if (isLeft && recognizer.direction == UISwipeGestureRecognizerDirectionLeft) {

moveCenterX = -100.0;

image = [UIImage imageNamed:@"icon_right.png"];

isLeft = NO;

}

if (!isLeft && recognizer.direction == UISwipeGestureRecognizerDirectionRight) {

moveCenterX = 100.0;

image = [UIImage imageNamed:@"icon_left.png"];

isLeft = YES;

}

    

    // iOS4+: Blocks 사용.

    [UIView animateWithDuration:0.7

  delay:0.1

options:UIViewAnimationCurveEaseOut

 animations:^{

 self.circle.center = CGPointMake(self.circle.center.x + moveCenterX, 240);

                         self.toggleButton.center = CGPointMake(self.toggleButton.center.x + moveCenterX,self.toggleButton.center.y);

 [self.toggleButton setImage:imageforState:UIControlStateNormal];

 } 

 completion:^(BOOL finished){

 NSLog(@"Done!");

 }];

}


// 사운드 효과.

- (void)playSound

{

    NSString *path = [[NSBundle mainBundlepathForResource:@"sound" ofType:@"mp3"];

NSURL *url = [NSURL fileURLWithPath:path];

AVAudioPlayer *player = [[AVAudioPlayer allocinitWithContentsOfURL:url error:nil];

//[player setNumberOfLoops:1];

    //[player playAtTime:1.5];

    [player play];

}


@end 


 버튼을 추가하는 방법은 여러 가지가 있겠으나, 좀더 효과적인 것이 무엇일까 고민 중이다. 좋의 의견 있는 분들은 댓글을 남겨 주십시오!

Posted by 다오나무
iOS2012. 9. 13. 13:17

UIViewController 를 이용한 메인뷰 또는 특정뷰에서 일련의 백그라운드 작업시 대기상태를 나타내주는 여러 방법(Modal Popup, Spinner, SubView 등...)들 중에, 카테고리를 이용하여 간단한 Method 호출로 UIViewController 에 오버레이되는 View 를 생성해 보자.


CREATE CATEGORY 


UIViewControll+OverlayView.h

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>
 
@interface UIViewController (OverlayView)
 
-(void)showLayer:(NSString *)message;
-(void)hideLayer;
@end

UIViewController+OverlayView.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#import "UIViewController+OverlayView.h"
 
@implementation UIViewController (OverlayView)
 
-(void)showLayer:(NSString *)message
{
    UIView *layer = [[UIView alloc] initWithFrame:self.view.bounds];
    // layer.alpha = 0.5;
    layer.backgroundColor = [[UIColor clearColor] colorWithAlphaComponent:0.5];
     
    /* Create Label */
    UILabel *label = [[UILabel alloc] initWithFrame:self.view.bounds];
    label.textAlignment = UITextAlignmentCenter;
    label.lineBreakMode = YES; // 개행 설정.
    label.numberOfLines = 0; // 개행 숫자에 제한을 두지 않음.
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.text = message;
    [layer addSubview:label];
    [label release];
     
    /* Add LayerView */
    [self.view addSubview:layer];
    [layer release];
}
 
-(void)hideLayer
{
    NSArray *subViews = [self.view subviews];
    UIView *layer = [subViews lastObject];
    [layer removeFromSuperview];
}
@end

※ alpha 를 적용하게되면, UIView *layer 에 올라오는 컨트롤 및 서브뷰들도 해당 alpha value 가 적용되어 보여진다. 반면, backgroundColor 는 해당 View 에만 alpha value 가 적용된다.


USING CATEGORY


ViewController.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "ViewController.h"
#import "UIViewController+OverlayView.h"
 
@implementation ViewController
- (IBAction)onBtnAction:(id)sender {
    [self showLayer:@"MESSAGE TO SHOW"];
     
    [self performSelector:@selector(onHideLayer) withObject:nil afterDelay:2.0f];
}
 
- (void)onHideLayer
{
    [self hideLayer];
}
@end

테스트를 위해, 생성된 오버레이뷰를 performSelector 로 2초후 해제되게 작성. UIViewController 를 서브클래싱하는 클래스들에서 해당 카테고리를 임포트하여, 간단히 카테고리 메소드 호출.


RESULT


스크린샷 처럼, Spinner (UIActivityIndicatorView) 를 표시하거나 기타 다른 컨트롤뷰도 해당 오버레이뷰에 추가하여 프로젝트 성격에 맞게끔 커스터마이징.

1
2
3
4
5
6
7
8
9
/* Create Spinner */
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    spinner.center = CGPointMake(160, 200);
    spinner.hidesWhenStopped = NO;
    spinner.tag = 100;
    [layer addSubview:spinner];
     
    [spinner startAnimating];
    [spinner release];

Posted by 다오나무
iOS2012. 9. 13. 11:02

UIImageView를 둥글게 제가 사용한 방법 입니다.
#import <QuartzCore/QuartzCore.h> 이렇게 한 후
imageView.layer.masksToBounds = YES;
imageView.layer.cornerRadius = 5;
이걸 쓰면 둥글게 되더군요.
cornerRadius 의 수치가 둥글게 정도의 수치구요.

Posted by 다오나무
iOS2012. 9. 13. 11:01

그림 1.



Corner에 라운드가 처리된 ImageView가 필요해서, 만들게 되어 이러게 공유 합니다 ^^

구글링 해보면, 이런저런 기법들이 많이 나오는데요, 복잡한 해법들이 많은데,
저는 UIBeizerPath라는 녀석을 이용해서, 간단히 구현 하는 방법을 소개 해볼까 합니다.

아직 UIImageView를 이용하면 가장 좋을것 같은데, 방법을 따로 못찾아서, UIView를 상속 받아서, 구현하였습니다.
혹시 아시는 분 있으면 공유! 부탁드립니다 !

RoundRectedImageView.h

#import <Foundation/Foundation.h>

@interface RoundRectedImageView : UIView {

}

@property (nonatomic,retainUIImage *image;

-(id) initWithImage:(UIImage *) aImage;

@end


RoundRectedImageView.m

#import "RoundRectedImageView.h"


@implementation RoundRectedImageView

@synthesize image = mImage;

-(id) initWithImage:(UIImage *) aImage {

    

    self = [super initWithFrame:CGRectMake(00, aImage.size.width, aImage.size.height)];

    self.image = aImage;

    self.backgroundColor = [UIColor clearColor];

    return self;

}


-(void) drawRect:(CGRect)rect {

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerAllCornerscornerRadii:CGSizeMake(16.016.0f)];

    [path addClip];

    [self.image drawInRect:rect];

}

-(void) dealloc {

    self.image = nil;

    [super dealloc];

@end


코드양이 별로 없어서, 설명도 간략하겠군요 :)
drawRect: Method만 살펴 보시면 됩니다.

1. Round가 있는 사각형 UIBezierPath Object를 만든다.
2. addClip 을 호출하여, 앞으로 그려질때, clipping 되도록한다.
3. UIImage를 그려준다.



이렇게 해주면 그림.1 의 우측 그림과 같이 RoundRect 된 ImageView가 됩니다. ^^

Posted by 다오나무
iOS2012. 9. 12. 16:26


- (void)viewDidLoad{   
      commentTxtView
.text = @"Comment";
      commentTxtView
.textColor = [UIColor lightGrayColor];
}
- (BOOL) textViewShouldBeginEditing:(UITextView *)textView
{
     if(commentTxtView.text.length > 0 && commentTxtView.textColor == [UIColor blackColor])
    	 return YES;
 
     commentTxtView.text = @"";
     commentTxtView
.textColor = [UIColor blackColor];
     
return YES;
}


-(void) textViewDidChange:(UITextView *)textView
{
if(commentTxtView.text.length == 0){
    commentTxtView
.textColor = [UIColor lightGrayColor];
    commentTxtView
.text = @"Comment";
   
[commentTxtView resignFirstResponder];
}
}


Posted by 다오나무
php2012. 9. 10. 23:08

$name = '홍길동';
$filepath = '그림폴더/이름'. $name .'.gif';
if(file_exists($filepath)) {
echo "이미지 출력 html"; // 경로에 화일이 존재한다면
} else {
echo ""; // 공백처리
}

'php' 카테고리의 다른 글

php 썸네일 이미지 만들기  (0) 2012.09.29
코드이그나이터 한국 포럼  (0) 2012.09.24
페이징 처리  (0) 2012.07.31
[PHP] 정규표현식 - preg_replace, preg_match, str_replace  (0) 2012.07.26
사이트 긁어오기  (0) 2012.07.25
Posted by 다오나무
iOS2012. 9. 10. 21:57

iOS 개발 하다 보니 image를 crop 하거나 resize를 해야 하는 경우가 많더구요.

구글링 해보니 괜찮게 만들어 놓은 소스도 많아서 참고해서 UIImage에 Category로 만들어서 사용하고 있습니다. 


  1. @implementation UIImage ( NBUIImageCrop )
  2. - (UIImage *)crop:(CGRect)rect {
  3.     if (self.scale > 1.0f) {
  4.         rect = CGRectMake(rect.origin.* self.scale,
  5.                           rect.origin.* self.scale,
  6.                           rect.size.width * self.scale,
  7.                           rect.size.height * self.scale);
  8.     }
  9.    
  10.     if ([self imageOrientation] == UIImageOrientationLeft) {
  11.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  12.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  13.         rect.origin = CGPointMake(rect.origin.y, rect.origin.x);
  14.     }
  15.     else if ([self imageOrientation] == UIImageOrientationRight) {
  16.         rect.size = CGSizeMake(rect.size.height, rect.size.width);
  17.         rect.origin = CGPointMake(rect.origin.y, rect.origin.x);
  18.     }
  19.  
  20.     CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, rect);
  21.     UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
  22.     CGImageRelease(imageRef);
  23.     return result;
  24. }
  25.  
  26. - (UIImage *)resizeToFitWidth:(CGFloat)width
  27. {
  28.     CGSize size = CGSizeMake(width, self.size.height * width/self.size.width);
  29.     UIGraphicsBeginImageContext(size);
  30.     [self drawInRect:CGRectMake(0,0,size.width,size.height)];
  31.     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
  32.     UIGraphicsEndImageContext();
  33.     return newImage;
  34. }

Posted by 다오나무