美文网首页O~1收藏ios
UITableView形式的图文编辑

UITableView形式的图文编辑

作者: Hawk_Eleven | 来源:发表于2017-03-26 15:25 被阅读73次

    导语

    本方案使用UITableview实现简单的图文混编效果,数据存储采用Json字符串。

    一、背景

    近期做项目,需要图文编辑功能,就上网搜索了一些资料,发现主流的方式有三种:
    UIView+UITextView+ImageViewUIWebviewCoreText,数据存储方面主要采用HtmlJson

    由于项目的特殊需求:批量插入图片,且每张图片下面自带文本输入框,还可以删除图片。因此自己用UITableView来实现此功能:图片一个cell,文本一个cell(因为考虑到后期的拖拽排序,故没将图片和文本放到一个cell里面处理)。

    图文编辑.gif

    二、具体实现

    插入图片

    这里存在两种情况:

    1)在末尾依次插入图片和对应的输入框;

    2)从中间插入图片和输入框。

    代码如下:

        EditContentModel *imgModel = [[EditContentModel alloc] init];
        imgModel.img = photos[i];
        imgModel.cellType = EditContentCellTypeImage;
        if (self.isInsertImg == YES) {
            [self.dataArr insertObject:imgModel atIndex:self.responderIndex + (2 * i + 1)];
        } else {
            [self.dataArr addObject:imgModel];
        }
        [self _uploadWithImage:photos[i] index:[self.dataArr indexOfObject:imgModel]];
            
        EditContentModel *textModel = [[EditContentModel alloc] init];
        textModel.inputStr = @"";
        textModel.cellType = EditContentCellTypeText;
        if (self.isInsertImg == YES) {
            [self.dataArr insertObject:textModel atIndex:self.responderIndex + (2 * i + 2)];
        } else {
            [self.dataArr addObject:textModel];
        }
    

    文本输入

    输入文本时动态改变textview的高度,达到自适应效果(这里使用的是RAC,也可以用代理实现):

        @weakify(self);
        [_inputTextView.rac_textSignal subscribeNext:^(id x) {
            @strongify(self);
            self.model.inputStr = x;
            self->_placeholderLabel.hidden = [x length] > 0;
            
            // textView高度自适应
            CGRect bounds = _inputTextView.bounds;
            
            // 计算 text view 的高度
            CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);
            CGSize newSize = [_inputTextView sizeThatFits:maxSize];
            bounds.size = newSize;
            _inputTextView.bounds = bounds;
            
            // 让 table view 重新计算高度
            UITableView *tableView = [self tableView];
            [tableView beginUpdates];
            [tableView endUpdates];
        }];
    

    图片删除

    删除图片时,将相邻的两个文本cell合并为一个,并处理相应的数据源:

        imgCell.deleteImgBlock = ^() {
                [self.dataArr removeObjectAtIndex:indexPath.row];
                if (indexPath.row != 0) {
                    EditContentModel *frontModel = self.dataArr[indexPath.row - 1];
                    EditContentModel *lastModel = self.dataArr[indexPath.row];
                    NSString *text = nil;
                    if (!frontModel.inputStr.length || !lastModel.inputStr.length) {
                        text = [NSString stringWithFormat:@"%@%@", frontModel.inputStr, lastModel.inputStr];
                    } else {
                        text = [NSString stringWithFormat:@"%@\n%@", frontModel.inputStr, lastModel.inputStr];
                    }
                    frontModel.inputStr = text;
                    [self.dataArr removeObjectAtIndex:indexPath.row];
                }
                [self.tableView reloadData];
            };
    

    数据存储

    数据上传时,将一个图片和一个文本的数据作为一个整体进行处理:

        NSMutableArray *arrM = [NSMutableArray array];
        if (self.dataArr.count % 2 == 0) {
            for (NSInteger i = 0; i < self.dataArr.count / 2; i ++) {
                EditContentItemModel *model = [[EditContentItemModel alloc] init];
                model.imageUrl = self.dataArr[2 * i].imageUrl;
                model.inputStr = self.dataArr[2 * i + 1].inputStr;
                [arrM addObject:model];
            }
        } else {
            for (NSInteger i = 0; i < (self.dataArr.count + 1) / 2; i ++) {
                if (i == 0) {
                    EditContentItemModel *model = [[EditContentItemModel alloc] init];
                    model.imageUrl = @"";
                    model.inputStr = self.dataArr[0].inputStr;
                    [arrM addObject:model];
                } else {
                    EditContentItemModel *model = [[EditContentItemModel alloc] init];
                    model.imageUrl = self.dataArr[2 * i - 1].imageUrl;
                    model.inputStr = self.dataArr[2 * i].inputStr;
                    [arrM addObject:model];
                }
            }
        }
        NSDictionary *dict = @{@"mEditorDatas" : arrM};
        NSString *mEditorDatas = [dict yy_modelToJSONString];
    

    至此,基本功能已经完成,若大家有排序这种需求可以在此基础上进行拓展添加。若要查看完整代码,可前往https://github.com/HawkEleven/EditContent下载。

    感谢

    相关文章

      网友评论

      • Civel_Xu:当 键盘弹起, 为了防止遮盖输入,我调整了tablview 的 bottom 的位置, 此时输入 tablview 会往上面滚动, self.tableView.beginUpdates()调整 texttview的高度时会导致tableview闪屏, 要如何处理呢?

      本文标题:UITableView形式的图文编辑

      本文链接:https://www.haomeiwen.com/subject/unpcottx.html