iOS-Coretext 图文混排占位符上下偏移处理

这里说的占位符,实际就是排版时需要展示的图片,图片基于占位符填充,那么处理图片时,怎么解决占位符(图片)的上下偏移
在设置占位符属性时,我通过以下方法来实现它:

+ (NSAttributedString *)wxImageAttributeCoreTextFromPaperQuestion:(WXTKCoretextQSourceImg *)image{
    
    CTRunDelegateCallbacks callbacks;
    memset(&callbacks, 0, sizeof(CTRunDelegateCallbacks));
    callbacks.version = kCTRunDelegateVersion1;
    callbacks.getAscent = ascentCallbackPaper;
    callbacks.getDescent = descentCallbackPaper;
    callbacks.getWidth = widthCallbackPaper;
    CTRunDelegateRef delegate = CTRunDelegateCreate(&callbacks, (__bridge void *)(image));
    // 使用0xFFFC作为空白的占位符
    unichar objectReplacementChar = 0xFFFC;
    NSString * content = [NSString stringWithCharacters:&objectReplacementChar length:1];
    NSMutableDictionary * attributes = [self wxAttributesPaperImg:image];
    NSMutableAttributedString * space = [[NSMutableAttributedString alloc] initWithString:content attributes:attributes];
    CFAttributedStringSetAttribute((CFMutableAttributedStringRef)space, CFRangeMake(0, 1),
                                   kCTRunDelegateAttributeName, delegate);
    CFRelease(delegate);
    return space;
}

上述方法在引入 CTRunDelegateCallbacks 时,提供了控制占位符大小属性,即:getAscent、getDescent、getWidth

getWidth是占位符所取宽,getAscent与getDescent分别基于基准可上下偏移,一般情况,getDescent会提供返回0值,而getAscent一般是占位符(图片)的高度;下面通过设置不同数值,看下字符如何偏移;

向下不偏移,向上提供占位符高度

///占位基准上升度
static CGFloat ascentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height;
}
///占位基准下降度
static CGFloat descentCallbackPaper(void *ref){
    return 0;
}

视觉给我感觉默认不向下偏移,图片比左侧字符高一点点

iOS-Coretext 图文混排占位符上下偏移处理

向下偏移5,向上提供占位符高度 - 5

///占位基准上升度
static CGFloat ascentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height - 5;
}
///占位基准下降度
static CGFloat descentCallbackPaper(void *ref){
    return 5;
}

iOS-Coretext 图文混排占位符上下偏移处理

向下偏移10,向上提供占位符高度 - 10

///占位基准上升度
static CGFloat ascentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height - 10;
}
///占位基准下降度
static CGFloat descentCallbackPaper(void *ref){
    return 10;
}

iOS-Coretext 图文混排占位符上下偏移处理

向下偏移整个占位(图片)高度,向上提供占位符高度 0

///占位基准上升度
static CGFloat ascentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height - refP.height;
}
///占位基准下降度
static CGFloat descentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height;
}

iOS-Coretext 图文混排占位符上下偏移处理

注意有个问题,上述的 getAscent、getDescent值加起来,其实就是图片的高度,那么如果比高度大或者小的情况下,图片会被拉伸,或者压缩

向下偏移小于整个占位(图片)高度( -10),向上提供占位符高度 0

///占位基准上升度
static CGFloat ascentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height - refP.height;
}
///占位基准下降度
static CGFloat descentCallbackPaper(void *ref){
    WXTKCoretextQSourceImg *refP = (__bridge WXTKCoretextQSourceImg *)ref;
    return refP.height - 10;
}

iOS-Coretext 图文混排占位符上下偏移处理

总结

上下偏移要处理好图片的高度值,确保getAscent + getDescent = 占位符(图片)高度即可

原文链接:https://www.cnblogs.com/wangkejia/p/16892664.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:iOS-Coretext 图文混排占位符上下偏移处理 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • Xcode Run Script 脚本

    在Xcode 项目执行:Run Script 时,则标识:${SYMROOT} . 更改括号类型。 例如:BUILD 号自增,编译完成后自动copy 某文件至目标文件夹等: cp -R ${BUILD_DIR}/${CONFIGURATION}-iphoneos/XXXX.bundle ${SRCROOT}/../XXXProject/ 具体环境变量如下: …

    IOS 2023年4月18日
    00
  • iOS 组件化实施过程

    目录 一、组件化的优缺点 二、组件化的拆分 三、组件与组件之间如何进行通讯(路由) 四、从Cocopods拉取代码的过程 五、创建本地私有库 一、组件化的优缺点 二、组件化的拆分 三、组件与组件之间如何进行通讯(路由) 四、从Cocopods拉取代码的过程 远程索引库里很多的.spec文件,该文件记录了很多内容,如用户名,框架名称,描述,框架的地址 Podf…

    IOS 2023年4月18日
    00
  • uniapp ios原生插件开发 (framework,cocopods)

    一、了解UniApp 插件的开发方式 Xcode Framework 、 Static Library 基于Cocoapods开发 pod lib 已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。…

    IOS 2023年4月17日
    00
  • [一句话说iOS]dispatch如何造成死锁

    dispatch_sync执行了两件事:把代码块放入指定线程的任务队列中、堵塞当前线程直到代码块执行结束,如果出现了堵塞的线程和代码块所在的线程为同一线程的话,这个时候代码无法在此线程执行继续下去,即造成了死锁。 – (void)viewDidLoad { [super viewDidLoad]; dispatch_sync(dispatch_get_mai…

    IOS 2023年4月17日
    00
  • 上传了ipa但iTunes Connect没有构建版本问题

    AU上传ipa出现下图红框提示说明成功上传,如果App Store后台没有出现构建版本, 请登录 apple账号对应的邮箱查看反馈,特别留意垃圾邮箱,无论成功还是失败,apple都会发邮件 一、首先登录iTunes Connect 后台、查看ipa构建情况 https://appstoreconnect.apple.com/ 点击进入APP,点击活动,所有构…

    IOS 2023年4月18日
    00
  • 使用SDLocalize高效完成iOS本地化国际化工作

    使用SDLocalize高效完成iOS本地化国际化工作 SDLocalize 该方案最大特点是对旧代码几乎没有较多修改就可以完成从单语言项目修改为多语言的项目。并支持XIB的控件本地化,无需创建不同语言版本的XIB文件。 SDLocalize的工作原理: 首先标记一组需要本地化的控件 然后在恰当时机(viewDidLoad),触发一组本地化任务(Then (…

    IOS 2023年4月17日
    00
  • Appuploader 常见错误及解决方法

    问题解决秘籍 遇到问题,第一个请登录苹果开发者官网 检查一遍账号是否有权限,是否被停用,是否过期,是否有协议需要同意,并且在右上角切换账号后检查所有关联的账号是否工作正常,apple账号的邮箱也是个重要的地方,当有ipa上传,账号有发生变化,被停用,apple经常发送一些邮件,去检查邮件通知,根据邮件通知修改调整。只有账号正常没问题,再考虑是否软件哪个地方操…

    IOS 2023年4月18日
    00
  • 【新技术】不用开发者账号申请ios证书真机调试

      虽然xcode现在可以免证书进行测试了,但众多跨平台开发者,如果还没注册苹果开发者账号。 想安装到自己非越狱手机测试是无能为力了。 不过新技术来了,只需要普通免费的苹果账号无需付费成为开发者就可以申请iOS证书打包ipa安装到自己手机测试! 没付费苹果开发者账号的,也能轻松调试自己的苹果APP。 当然如果要上架App Store还是需要注册一个付费的苹果…

    IOS 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部