2009-05-19 5 views
2

iPhone에서 Safari의 양식 동작을 내 응용 프로그램으로 복제하고 싶습니다. 웹 양식에 데이터를 입력하면 UIKeyboardView 바로 위에 별도의 UIToolbar (이전, 다음, 완료)가 표시됩니다. 옵션 선택과 동일 : UIPickerView 바로 위와 동일한 UIToolbar를 얻습니다.자체 UIToolbar가있는 UITextView 및 UIPickerView

나는 이것을 구현하는 데모/소스 코드/아이디어를 찾고 있습니다. 그 툴바와 textview/pickerview로 내 자신의 하위 뷰를 만들 수 있습니까? 더 우아한 방법이 있습니까? 특히 UITextfield의 firstFresponder를 활용하는 것이 있습니까?

답변

13

그래서 이것을 관리하기 위해 UIViewCOntroller 서브 클래스를 만들었습니다.

에이 기능을 추가하여 작성했습니다.

-(void) addToViewWithAnimation:(UIView *) theView 
{ 
    UIView* myview = self.view; 
    CGRect frame = myview.frame; 
    frame.origin.y = 420; 
    myview.frame = frame; 

    UIView* bgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; 
    bgView.backgroundColor = [UIColor blackColor]; 
    bgView.alpha = 0.6; 
    backgroundView = bgView; 
    [theView addSubview: bgView]; // this adds in the dark background 

    [theView addSubview:self.view]; // this adds in the pickerView with toolbar. 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.5]; 
    frame = myview.frame; 
    frame.origin.y = 420 - frame.size.height; 
    myview.frame = frame; 

    [UIView commitAnimations]; 
} 

그런 다음 IB에서보기를 만들었습니다. 여기에 내 머리글 헤더의 모양이 있습니다. (뷰에 UItoolbar도가 난 그냥 내 컨트롤러에 대한 참조가없는)

@interface PropertyPickerController : UIViewController { 
    IBOutlet UIPickerView* Picker; 
    IBOutlet UIButton* DoneButton; 
    IBOutlet UIButton* CancelButton; 
    UIView* backgroundView; 
    NSArray* SimpleObjects; 
    id PickerObjectDelegate; 
    SEL PickerObjectSelector; 
} 
그럼 내가 사용하는 뷰를 숨 깁니다.

-(void) removeFromSuperviewWithAnimation 
{ 

    UIView* myview = self.view; 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(AnimationDidStop:)]; 
    [UIView setAnimationDuration:0.5]; 
    // set fram below window. 
    CGRect frame = myview.frame; 
    frame.origin.y = 420; 
    myview.frame = frame; 
    backgroundView.alpha = 0; //fades shade to nothing 
    [UIView commitAnimations]; 
} 

-(void) AnimationDidStop:(id) object 
{ 
    [self.view removeFromSuperview]; //removes view after animations. 
    [backgroundView removeFromSuperview]; 
} 

마지막으로 피커에 대한 모든 대리자 기능.

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
    { 
     FBSimpleObject* object = (FBSimpleObject*)[SimpleObjects objectAtIndex:row]; 
     return object.Name; 
    } 

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
    { 
    } 
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
    { return 1;} 

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
    { 
     return [SimpleObjects count]; 
    } 

    - (IBAction)CancelButtonClick 
    { 
      [self removeFromSuperviewWithAnimation]; 
    } 
    - (IBAction)DoneButtonClick 
    { 
//This performs a selector when the done button is clicked, makes the controller more versatile. 
if(PickerObjectDelegate && PickerObjectSelector) 
     { 
      NSMethodSignature* signature = [PickerObjectDelegate methodSignatureForSelector:PickerObjectSelector]; 
      NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature]; 
      [invocation setTarget:PickerObjectDelegate]; 
      [invocation setSelector:PickerObjectSelector]; 
      [invocation setArgument:&object atIndex:2]; 
      [invocation retainArguments]; 
      [invocation invoke]; 
     } 
    } 

이것은 툴바를 수행하는 방법입니다. 기본적으로 ViewController 하위 클래스와 동일한 개념을 사용하고 표준 푸시보기 또는 모달 표시 옵션을 사용하지 않습니다. (예 여기에 실제로 텍스트 상자와 키보드의 상단에 도구 모음을 배치

@interface BugEditCommentController : UIViewController에 { UITextView * 코멘트; UIToolbar * 도구 모음, } - (무효) addToViewWithAnimation :. (UIView의 *) theView,

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; 
    [nc addObserver:self selector:@selector(keyboardWillShow:) name: UIKeyboardWillShowNotification object:nil]; 
    [nc addObserver:self selector:@selector(keyboardWillHide:) name: UIKeyboardWillHideNotification object:nil]; 
, 당신은 당신의 뷰 컨트롤러 생성자에이를 추가하는 경우 그래서, 당신이 할 필요가 [오브젝트 becomeFirstResponder] 호출입니다

는 [객체가 becomeFirstResponder] 일반적으로 호출 할이보기를 활성화하려면

ABD 당신은 (위의 코드에 정의) 컨트롤러에이 방법

-(void) keyboardWillShow:(NSNotification *) note 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 

    CGRect toolbarFrame = Toolbar.frame; 
    CGRect keyboardFrame; 
    CGPoint keyboardCenter; 
    [[note.userInfo valueForKey:UIKeyboardCenterEndUserInfoKey] getValue:&keyboardCenter]; 
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardFrame]; 

    //CGRect toolbarRect = Toolbar.center; 
    toolbarFrame.origin.y= keyboardCenter.y - ((keyboardFrame.size.height/2) + (toolbarFrame.size.height)); 
    Toolbar.frame = toolbarFrame; 
    [UIView commitAnimations]; 

} 

-(void) keyboardWillHide:(id) object 
{ 

//you could call [self removeFromSuperviewHere]; 
} 

-(void) removeFromsuperViewWithAnimation 
{ 
    [Comment resignFirstResponder]; 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:0.3]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(AnimationDidStop:)]; 

    CGRect frame = Toolbar.frame; 
    frame.origin.y = 480; 
    Toolbar.frame = frame; 

    [self.view viewWithTag:1].alpha = 0; //fade transparent black background to clear. 
    [UIView commitAnimations]; 

} 
-(void)AnimationDidStop:(id) object 
{ 
    [self.view removeFromSuperview]; 
} 

를 구현하는 경우는 추가 정보가 도움이되기를 바랍니다.

+0

감사합니다. 그러나 UITextView가 없습니다. 'firstResponder'메커니즘과 어떻게 통합 할 지 모르겠습니다. – luebken

+0

죄송합니다. 예는 UIPickerView입니다. 나는 기회가 생길 때 UITextView에 대한 코드를 게시 할 것이다. – Bluephlame

+0

github에 코드를 게시 할 수 있습니까? –

0

이 문제에 대한 해결책도 찾고 있습니다.

이것이 최선의 해결책이라고 판단한 경우이 SCKit을 사용하여 툴바를 추가하여 원하는대로 UIPickerView 또는 UIDatePicker를 닫을 수 있습니다. https://github.com/scelis/SCKit/tree/

재밌게 :

다음은 GitHub의 링크입니다!