objective c在scrollview中的Textview不会激活textViewShouldBeginEditing

时间:2017-01-11 09:39:11

标签: ios objective-c uiscrollview uitextview

并且在这个应用程序中我有一个sidescrolling / Paging scrollview,每个“page”都有一个图像和一个textView。我需要做的是分别在每个页面上编辑textview。

我还有一个TapGestureRecocgnizer来处理图像上的点击 我一直试图让这段代码工作一段时间,所以haw尝试了不同的东西。在taphandler(作品)中使用show键盘,然后我似乎无法进行“完成编辑”,因此我可以保存用户输入的文本。

我试图在调用“make subview”的scrollviewcontroller和在视图中添加img和textview的子视图中为textView添加一个委托。 这也几乎可行。只在第一页或第一页上

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

UIView *subView = [[UIView alloc]initWithFrame:self.scrollViewOU.frame];

for(int i = 0; i < prgItm.slides.count; i++) {
    CGRect frame;

    frame.origin.x = self.scrollViewOU.frame.size.width * i ;
    frame.origin.y = 0.0;

    CGSize size = CGSizeMake(self.scrollViewOU.frame.size.width, self.scrollViewOU.frame.size.height);
    frame.size = size;
    self.scrollViewOU.pagingEnabled = YES;

    slide *sld = prgItm.slides[i];

    UIImage *img;

    NSString *imgName = sld.img;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
    NSString *fullPath = [[paths objectAtIndex:0] stringByAppendingPathComponent:imgName];

    img = [UIImage imageWithContentsOfFile:fullPath];

    NSString *txt = [NSString stringWithFormat:@"%@", sld.notat];

    SlideView *slde = [[SlideView alloc] initWithImage:img note:txt frame:frame];

    [subView addSubview:slde];                

}    

[self.scrollViewOU addSubview:subView];
self.scrollViewOU.delaysContentTouches = YES;    

UITapGestureRecognizer *imgTap =[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[imgTap setNumberOfTapsRequired:1];
[self.scrollViewOU addGestureRecognizer:imgTap];    

self.scrollViewOU.contentSize = CGSizeMake(self.scrollViewOU.frame.size.width * slides.count, self.scrollViewOU.frame.size.height );

CGPoint point = CGPointMake(scrollViewOU.frame.size.width * position, scrollViewOU.contentOffset.y);

[self.scrollViewOU setContentOffset:point animated:YES];

}

-(void)handleTap:(UITapGestureRecognizer *)Tap {


UIScrollView *view = Tap.view;
CGPoint point = [Tap locationInView:view];
int pageNr = round(view.contentOffset.x / view.frame.size.width);

UIView *slideView = view.subviews[0].subviews[pageNr];
UIView *touchedView = [slideView hitTest:point withEvent:nil];

NSLog(@"view.tag: %d", touchedView.tag);    
NSLog(@"point: %f %f" , point.x, point.y);
if(point.y >= slideView.subviews[1].frame.origin.y){
    UITextView *tmp = touchedView;
    //tmp.delegate = self;
    NSLog(@"touched text %@", tmp.text);

    //[tmp becomeFirstResponder];
    //[tmp reloadInputViews];
}else {
    [self performSegueWithIdentifier:@"ShowFullScreen" sender:self];
}

}

make Subview类

-(id)initWithImage:(UIImage *)slide note:(NSString *)text frame:(CGRect)frame
{
self = [super init];
if(self)
{
    CGRect rectView = CGRectMake(frame.origin.x,
                                 frame.origin.y,
                                 frame.size.width,
                                 frame.size.height);

    self.frame = rectView;
    CGRect imgRect = CGRectMake(0,
                                0,
                                frame.size.width,
                                frame.size.height * 0.75);

    UIImageView *subview = [[UIImageView alloc] initWithFrame:imgRect];

    subview.contentMode = UIViewContentModeScaleAspectFit;

    //[subview setAutoresizingMask:UIViewAutoresizingNone];
    subview.image = slide;

    subview.userInteractionEnabled = YES;
    subview.tag = 1;

    CGRect noteRect = CGRectMake(frame.size.width * 0.01,
                                 frame.size.height *0.76,
                                 frame.size.width * 0.98,
                                 frame.size.height *0.23);

    UITextView *noteView = [[UITextView alloc] initWithFrame:noteRect];

    [noteView.layer setBorderColor:[[[UIColor grayColor] colorWithAlphaComponent:0.5] CGColor]];
    [noteView.layer setBorderWidth:2.0];

    noteView.layer.cornerRadius = 5;
    noteView.clipsToBounds = YES;

    noteView.userInteractionEnabled = YES;
    noteView.editable = YES;

    noteView.text = text;


    [noteView setKeyboardType:UIKeyboardTypeDefault];

    [noteView setDelegate:self];


    [self addSubview:subview];
    [self addSubview:noteView];


    self.userInteractionEnabled = YES;

        }
return self;
}
-(BOOL)canBecomeFirstResponder {
    return YES;
}

-(BOOL)textViewShouldBeginEditing:(UITextView *)textView {
//[textView becomeFirstResponder];
return YES;
}

-(BOOL)textViewShouldEndEditing:(UITextView *)textView {
[textView resignFirstResponder];
return YES;
}

总结一下。 我需要scrollview包含带有Img和textView的x页面。 我需要单击textview开始编辑textview。当用户关闭键盘时,我需要一种方法来保存编辑过的文本。该页面还需要做出反应来点击img(这个工作)

2 个答案:

答案 0 :(得分:0)

对于X页面,

使用scrollView属性pagingMode设置为true

单击texview,确保已启用UIUsersInteraction,并且您已委托textview并“实现protocole”,成为第一个应答器

请不要使用tap来成为textView的响应者 麻烦

你应该尽快删除tapGesture他可能得到了点击并禁止你接到texview响应者的电话

答案 1 :(得分:0)

所以事实证明我需要将parrent UIview的宽度更改为与总scrollview内容大小相同(fram.width * pages)

这现在有效。这有点奇怪,因为我尝试了很多东西,并且在我第一次遇到这个问题后添加了错误大小的UIview。