ibireme / YYText

Powerful text framework for iOS to display and edit rich text.
MIT License
8.86k stars 1.7k forks source link

yytext和AGphoto的手势冲突了 #60

Closed MonkeyS914 closed 8 years ago

MonkeyS914 commented 8 years ago

集成的是YYtestView,发现和AGPhoto的手势冲突了,点开AGPhoto后,滑动和点击手势都不能用了

ibireme commented 8 years ago

能给出如何使用代码片段吗?

MonkeyS914 commented 8 years ago

YYTextView *inputTextView;//输入框 inputTextView = [[YYTextView alloc]initWithFrame:CGRectMake(10, 10, SCREEN_WIDTH-20, 30)]; inputTextView.delegate = self; inputTextView.font = [UIFont systemFontOfSize:16]; inputTextView.layer.masksToBounds = YES; inputTextView.layer.cornerRadius = 5; inputTextView.scrollEnabled = YES; inputTextView.textParser = yyParser;//这个是你的表情解析器 inputTextView.placeholderTextColor = tipColor; inputTextView.placeholderText = @"我也说一句"; 这个inputview添加在我初始化的一个UIView上

pragma mark - Getters

添加了YYTextViewDelegate,AGPhotoBrowserDataSource,AGPhotoBrowserDelegate

我试过了,只要一初始化YYTextView,AGPhoto的点击手势,滑动手势都失效了

ibireme commented 8 years ago
@interface YYTextAttributeExample ()<YYTextViewDelegate, AGPhotoBrowserDelegate, AGPhotoBrowserDataSource>
@property (nonatomic, strong) AGPhotoBrowserView *browserView;
@end

@implementation YYTextAttributeExample

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    [self initInputView];
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [[self browserView] show];
    });
}

- (void)initInputView {
    YYTextView *inputTextView;//输入框
    inputTextView = [[YYTextView alloc]initWithFrame:CGRectMake(10, 100, kScreenSize.width-20, 30)];
    inputTextView.delegate = self;
    inputTextView.font = [UIFont systemFontOfSize:16];
    inputTextView.layer.masksToBounds = YES;
    inputTextView.layer.cornerRadius = 5;
    inputTextView.scrollEnabled = YES;
    inputTextView.placeholderText = @"我也说一句";
    [self.view addSubview:inputTextView];
}

- (AGPhotoBrowserView *)browserView {
    //这个是AGPhoto
    if (!_browserView) {
        _browserView = [[AGPhotoBrowserView alloc] initWithFrame:self.view.bounds];
        _browserView.delegate = self;
        _browserView.dataSource = self;
    }
    return _browserView;
}

- (void)photoBrowser:(AGPhotoBrowserView *)photoBrowser didTapOnDoneButton:(UIButton *)doneButton {
    [[self browserView] hideWithCompletion:^(BOOL finished) {

    }];
}

- (void)photoBrowser:(AGPhotoBrowserView *)photoBrowser didTapOnActionButton:(UIButton *)actionButton atIndex:(NSInteger)index {

}

- (NSInteger)numberOfPhotosForPhotoBrowser:(AGPhotoBrowserView *)photoBrowser {
    return 5;
}

- (UIImage *)photoBrowser:(AGPhotoBrowserView *)photoBrowser imageAtIndex:(NSInteger)index {
    UIImage *image = [UIImage imageNamed:@(index).description];
    return image;
}

- (NSString *)photoBrowser:(AGPhotoBrowserView *)photoBrowser titleForImageAtIndex:(NSInteger)index {
    return @(index).description;
}

@end

以上是我的测试代码,目前没有发现问题,请按以下顺序检查:

  1. 确认代码中没有使用 inputView 名称的属性。
  2. 更新 YYText 到最新版。 如果还有问题,请给出更详细一些的情况,比如实际 Controller 的代码、运行的系统与版本。

另外,我看了下 AGPhotoBrowser 这个项目,其内部使用 UIWindow 的方法对于 iOS 9 来说是有问题的。

MonkeyS914 commented 8 years ago

好的,谢谢,我先检查下

MonkeyS914 commented 8 years ago

我昨天晚上试了修改AGPhoto的代码没有解决,刚刚把你上面的那段代码放到一个空白的viewController,AGPhoto是可以显示的,但是不会响应任何操作,类似于界面卡死在AGPhoto那了,但是不是真的卡死,就是对操作不响应。

我把整个AGPoto转到一个新的viewController里面当做一个模态视图呈现出来还是不行。只要YYtextview初始化之后,AGPoto显示出来就不支持手势了,不响应操作,整个界面假死

ibireme commented 8 years ago

能给你下你用的设备型号、系统版本、YYText版本吗? 另外,如果你把 YYTextView 换成 UITextView 还会出现问题吗?

MonkeyS914 commented 8 years ago

iPhone6 系统9.1(13B143) YYText我昨天更新到最新版本了。UITextView是正常的,之前的输入框是用的系统自带的UITextView, 然后再添加的AGPhoto图片浏览,后来前段时间看到您发布的YYText功能很蛮好,所以就集成进来了。昨天一朋友发现的这个问题。

我开始是把整个YYkit都拖进来了,昨天又单独把YYText下了一份,把之前的替换了,还是不行。

MonkeyS914 commented 8 years ago

后面换了一个MWPhotoBrowser,这个项目一直在更新,然后按照你给的那个测试代码测了一下 还是有手势冲突MWPhotoBrowser里面有个上滑和下滑dismiss,先初始化YYTextView之后,MWPhotoBrowser的swipe手势就失效了

if (_enableSwipeToDismiss) {
    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(doneButtonPressed:)];
    swipeGesture.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    [self.view addGestureRecognizer:swipeGesture];
}
ibireme commented 8 years ago

我一开始怀疑是 AGPhoto 和 YYTextView 在使用 UIWindow 有冲突,但是 MWPhotoBrowser 中并没有使用 UIWindow。那 YYTextView 只是一个简单的ScrollView 视图,应该不至于产生问题。我觉得可能是你在添加视图层次和 Gesture 使用时有问题。

能给出一个可运行可复现问题的最简单的 Controller 代码吗?

MonkeyS914 commented 8 years ago

你好,我新建了一个工程,复现了问题,已经发到你的邮箱ibireme@gmail.com,谢谢

ibireme commented 8 years ago

AGPhotoBrowserView.m 这个文件的 show 方法内第一行调用有问题:

[[[UIApplication sharedApplication].windows lastObject] addSubview:self];

这个函数会找到最上层的 window,这个 window 可能是系统创建的、或者 App 内其他组建创建的 window。如果 App 用 UITextView 代替 YYTextView,那这个视图就会被加到 UITextEffectsWindow 上,这也会产生潜在的问题。

此处应该改为第一个 window,即 [[UIApplication sharedApplication].windows firstObject],这个才是 App 自身的主 window。

MonkeyS914 commented 8 years ago

恩恩,对于windoe这一块不是太熟悉,我之前以为加在最上层是没问题的。非常感谢抽时间帮我解答疑问!