UITextView 格线背景但行高错误

2024-05-06

我有一个 UITextView,用户可以在其中创建注释并保存到 plist 文件中。 我希望能够像普通笔记本一样显示线条。我遇到的问题是 文本无法正确对齐。

下图很好地解释了这个问题。

This is the background I use to create the lines like the Notes.app enter image description here

这是我为我的背景创建的代码UITextView:

textView.font            = [UIFont fontWithName:@"MarkerFelt-Thin" size:19.0]; 
textView.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Notes.png"]];

我知道UIFont.lineHeight属性仅适用于 > iOS 4.x。

所以我想知道是否还有其他方法可以解决我的问题?


您应该尝试以编程方式绘制线条,而不是使用图像。以下是一些示例代码,说明如何实现这一目标。你可以子类化UITextView并覆盖它drawRect: method.

NoteView.h

#import <UIKit/UIKit.h>
@interface NoteView : UITextView <UITextViewDelegate> {
}
@end

NoteView.m

#import "NoteView.h"

@implementation NoteView

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor colorWithRed:1.0f green:1.0f blue:0.6f alpha:1.0f];
        self.font = [UIFont fontWithName:@"MarkerFelt-Thin" size:19];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    //Get the current drawing context   
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    //Set the line color and width
    CGContextSetStrokeColorWithColor(context, [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.2f].CGColor);
    CGContextSetLineWidth(context, 1.0f);
    //Start a new Path
    CGContextBeginPath(context);

    //Find the number of lines in our textView + add a bit more height to draw lines in the empty part of the view
    NSUInteger numberOfLines = (self.contentSize.height + self.bounds.size.height) / self.font.leading;

    //Set the line offset from the baseline. (I'm sure there's a concrete way to calculate this.)
    CGFloat baselineOffset = 6.0f;

    //iterate over numberOfLines and draw each line
    for (int x = 0; x < numberOfLines; x++) {
        //0.5f offset lines up line with pixel boundary
        CGContextMoveToPoint(context, self.bounds.origin.x, self.font.leading*x + 0.5f + baselineOffset);
        CGContextAddLineToPoint(context, self.bounds.size.width, self.font.leading*x + 0.5f + baselineOffset);
    }

    //Close our Path and Stroke (draw) it
    CGContextClosePath(context);
    CGContextStrokePath(context);
}

@end

MyViewController.h

#import <UIKit/UIKit.h>
#import "NoteView.h"
@interface MyViewController : UIViewController <UITextViewDelegate> {

    NoteView *note;
}

@property (nonatomic, retain) NoteView *note;

@end

MyViewController.m

#import "MyViewController.h"
#import "NoteView.h"

#define KEYBOARD_HEIGHT 216

@implementation MyViewController
@synthesize note;

- (void)loadView {
    [super loadView];
    self.note = [[[NoteView alloc] initWithFrame:self.view.bounds] autorelease];
    [self.view addSubview:note];
    note.delegate = self;
    note.text = @"This is the first line.\nThis is the second line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\nThis is the ... line.\n";
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    [note setNeedsDisplay];
}

- (void)textViewDidBeginEditing:(UITextView *)textView {
    CGRect frame = self.view.bounds;
    frame.size.height -= KEYBOARD_HEIGHT;
    note.frame = frame;
}

- (void)textViewDidEndEditing:(UITextView *)textView {
    note.frame = self.view.bounds;
}

- (void)dealloc {
    [note release];
    [super dealloc];
}

看看苹果的文档管理键盘 http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html,特别是“移动位于键盘下的内容”。它解释了如何监听 NSNotifcations 并正确调整您的视图。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UITextView 格线背景但行高错误 的相关文章

  • dispatch_async 在某个地方有滞后,找不到哪里。 NSLog有问题吗?

    所以我有这个代码 dispatch async dispatch get global queue DISPATCH QUEUE PRIORITY DEFAULT 0 Bunch of code NSLog Test 它立即运行并返回 ns
  • 讨论iPhone上的MVC实现

    我在不同的框架上使用 MVC 模式一段时间 例如 swing android gwt 现在 我正在学习iPhone框架 我对MVC的实现感到非常惊讶 我问的问题是关于视图和控制器交互的 首先 这就是我构思 MVC 模式的方式 视图和控制器通
  • OCMockito everything() 用于原始类型

    对于方法签名 void insertValue NSUInteger value 我想看看是否有任何值的 insertValue 永远不会被调用 verifyCount test never insertValue 0 由于编译器抱怨 ev
  • Core Data 与 Sqlite 以及性能

    我想知道是否有人有关于已在 3 0 SDK 中转换为 Core Data 的旧 sqlite 应用程序之间的性能差异的真实数据 我怀疑核心数据在底层只是使用 sqlite 并且为了方便成本而增加了一些开销 但我想我还是会问 Core Dat
  • 强制隐藏详细视图后未调用 UISplitViewController willHideViewController/willShowViewController

    我有一个 iPad 应用程序 它使用 UISplitViewController 作为根控制器 我已经设置了委托 并且我正在使用 UINavigationController 作为 DetailView 它似乎工作正常 当特定视图控制器显示
  • 用于 RSS feed 解析的 Objective-C 库?

    我正在为 iOS 应用程序寻找一个 Objective C 库 该库将解析并显示 RSS 提要中的文章 具体来说 我正在寻找为新闻网站制作一个应用程序 如果可能的话 该框架应该能够使用各种 RSS XML 结构 嗯 有两个不同的新闻网站 一
  • 我的开发者帐户会员资格到期后,我的应用程序会怎样? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我的 Apple 付费开发者会员资格到期时 我在应用程序商店中现有的应用程序会怎样 我知道我无法添加新应用程序 但我现有的应用程序会保留
  • 如何在 UIButton 中创建边框?

    我在名为 addButton 的应用程序中使用自定义按钮 我想用白色边框它 如何在自定义按钮周围获得白色边框 您可以通过访问按钮的图层属性来设置 CALayer 上的边框属性 首先 添加石英 import
  • 获取选定行 NSTableView 的值

    我如何获取 NSTableView 中选定行的值 通过使用selectedRow see here https developer apple com documentation appkit nstableview 1535010 sel
  • FCM 通知在 iOS 应用程序中不起作用

    我正在我的应用程序中集成 FCM 通知和云消息传递 我已按照 Firebase 文档中提到的完全相同的步骤进行操作 即使我已经尝试过 FCM 给出的示例代码 它只是发出一些警告
  • iOS CoreBluetooth:状态保存和恢复

    希望在这里得到一些意见 在我当前的 iOS 项目中 我使用 CoreBluetooth 和 swift 该应用程序可以在后台使用 CoreBluetooth 进行通信 这基本上可以工作 外设需要与 iOS 设备建立有效连接才能按预期工作 每
  • UIWebView Javascript 窗口到窗口通信

    我正在开发一个 iOS 应用程序 我试图在其中使用UIWebView显示各种网站 最近我完成了将 Javascript 注入到的逻辑UIWebView捕获实例window open window close and window opene
  • GMSMarker 不透明度动画不重复

    我正在尝试使带有自定义图标的 GMSMarker 以衰减的动画不透明度闪烁 动画应该重复几次 但事实并非如此 它只执行一次转换 然后就停止了 这种情况仅在对不透明度属性进行动画处理时发生 在对其他属性进行动画处理时效果很好 这是代码 GMS
  • iOS 5 核心数据冻结

    我尝试做以下简单的事情 NSArray entities context executeFetchRequest inFetchRequest error fetchError 没有什么花哨 但这在 iOS 5 中冻结 在 iOS 4 中工
  • 越狱的 iOS 从后台应用程序截图

    我正在为自己构建一个实用程序应用程序 当该实用程序在后台运行时 它可以截取前台运行的任何内容的屏幕截图 该实用程序将在越狱设备上运行 因此它可以访问私有 API 而不受沙箱的限制 由于实用程序应用程序在后台运行 作为守护程序或使用后台程序
  • 在 UIView 中的贝塞尔曲线路径内像草图颜色一样绘制/绘制

    我正在 UIView 上的 UIBezierPath 的帮助下绘制形状图层 CAShapeLayer pathLayer CAShapeLayer layer pathLayer frame CGRectMake view frame or
  • 有没有用于iPhone开发的高级手势库?

    iPhone 平台有许多常见的手势习惯用法 例如 有轻击 捏合和滑动等操作 每种操作都需要不同数量的手指 但是 当您开发应用程序时 您需要根据有关触摸次数和位置的低级信息来实现这些内容 看起来这是图书馆的主要候选者 您将注册一个委托 设置一
  • 模态转换风格就像邮件应用程序中一样

    我试图实现模态呈现效果 其中呈现的视图仅部分覆盖父视图 如下图所示 我知道我可以通过使用实现自定义转换来实现这一点UIPresentationController 我不想重新发明轮子 所以在继续开发之前我想问一下 API 中是否有对这种转换
  • 如何让 CAAnimation 在每个动画周期调用一个块?

    我可以以某种方式在 CAAnimation 的每个 tick 上执行一个块吗 它可能像下面的代码一样工作 如果有办法用选择器来做到这一点 那也是可行的 NSString keyPath position x CGFloat endValue
  • Objective-C 中何时使用括号以及何时使用句点

    我是一名新的 iPhone Objective C 开发人员 当我浏览不同的教程和开源代码时 我在理解何时使用方括号 以及何时使用句号方面遇到了一些问题 用于访问对象的属性 方法 例如 这段代码 void setSelected BOOL

随机推荐

  • 如何在我的项目中使用 FFTW DLL 导入库 .lib 作为静态 .lib?

    我了解 C 和编译小型插件 始终基于类似且布局的工作流程 虽然目前我需要将最新版本的 FFTW 编译成静态库 或者从编译版本中获取它 这应该会容易得多 但这给了我一个非常困难的时间 可能是因为我不知道编译的来龙去脉 请注意 我正在使用 Vi
  • 在慢速连接上使用 picasso 加载图像

    我正在使用 Picasso 加载列表视图的图像 问题是互联网连接速度很慢 如何更改 Picasso 中的加载超时时间 我的代码是 Picasso with context load MainActivity WEBSITE book ite
  • mongoDB 对嵌套对象数组的聚合查找

    我有一个如下所示的集合 但我无法执行 lookup 并按开始时的方式返回它 但包含填充的字段 我已经对我想要填充的字段发表了评论 代理 missions clients client title Tourn e libre agent 5d
  • 如何仅重置 Angular 5 中表单的特定字段

    我在我的组件文件之一中创建了一个函数来重置表单 myform onSubmit if this myform valid console log Form Submitted this myform reset 它可以很好地重置整个表单 但
  • 想要运行命令列表,但能够在运行时编辑该列表

    我有一个要运行的 bash 命令列表
  • 使 Flex 子项的高度等于网格列内父项的高度

    我正在尝试构建一个定价表 其中每列都包含一张卡片 我希望所有卡片都拉伸到其父 col 元素的高度 注意 我正在使用 Bootstrap 4 并尝试使用现有的网格系统来实现这一点 为了保持一致性 并使用这个特定的标记 我无法让卡片增长到其父容
  • 如何使用 Asp.Net MVC 3 和 Razor 获得特定于视图的 内容?

    除了 Layout cshtml 中已链接的内容之外 我还想在某些视图中链接特定的样式表 对于非 Razor 我看到使用内容占位符 我该如何为 Razor 执行此操作 Razor 中的内容占位符相当于部分 在你的 Layout cshtml
  • /usr/sbin/install 到底有什么作用?

    我正在尝试安装discount https github com Orc discount on my VPS http no de它基于Solaris 设置一些环境变量后编译效果很好 但是安装失败 https gist github co
  • Web 本地应用程序 Apache:运行 shell 脚本

    我开发了一个 shell 脚本 我想用它创建一个 UI 我决定使用带有本地服务器的 Web 界面 因为我对 HTML PHP 的了解很少 比 QT 或 Java 的了解更多 我只是希望我的 html 可以在我的计算机上运行 shell 脚本
  • 如何使用文本框在数据网格视图中搜索数据?

    这是我当前的代码 private void searchTextBox TextChanged object sender EventArgs e dataGridView1 DataSource as DataTable DefaultV
  • Chrome DevTools 中的渲染去了哪里?

    看起来渲染设置不再是原来的位置 即启用绘画闪烁 显示图层边框 显示 FPS 仪表 显示滚动性能问题 我怎样才能再次访问这些功能 渲染设置已移动铬48 您现在可以通过三点菜单图标 更多工具 渲染设置来访问它们 或者 您可以通过底部窗格的新菜单
  • 用宏包装函数(无需重命名)C

    我有兴趣通过包装现有函数调用来添加一些额外的逻辑without重命名它们 仅供测试 我发现的现有解决方案依赖于将函数包装在不同名称的宏中 这可能意味着更改大量代码 有什么建议么 请注意 我知道LD PRELOAD 但我有兴趣使用宏来检查传递
  • Vuetify 默认轮播 CSS 选择器,用于减少过渡持续时间

    I need a transition that does not produce the dreaded image blinking for a v carousel item Ideally it s a smooth and qui
  • 使用通用元组函数一次进行多次折叠

    如何编写一个接受类型函数元组的函数ai gt b gt ai并返回一个函数 该函数接受类型元素的元组ai 类型的一个元素b 并将每个元素组合成一个新的元组ai 那是签名应该是这样的 f a1 gt b gt a1 a2 gt b gt a2
  • 我要疯了吗? jQuery .click() 似乎不起作用

    下面的代码不适用于任何浏览器 它应该显示一个警报框 我究竟做错了什么 a href test a 将其放入 document ready 中
  • 获取所有按钮标签类型

    有没有办法使用 javascript 获取特定页面上的所有按钮标签及其类型 将此代码放在文档的加载事件中或 HTML 的底部 var buttons document getElementsByTagName button for let
  • 搜索并替换字符串 t-SQL

    每个人我都试图编写一个查询来替换末尾出现的所有字符串 我有一些干扰词 确切地说是 104 个 如果它们出现在字符串末尾 则需要将其从字符串中删除 例如 两个干扰词是 Company LLC 以下是一些示例和预期输出 American Com
  • JS 按特定排序顺序排序

    我需要按特定顺序对数据进行排序 如下所示 const sortBy b a c e d const data a d e 我知道如何按升序 降序排序 console log data sort a b gt a gt b a d e con
  • 以静默方式安装应用程序,并授予 INSTALL_PACKAGES 权限

    我正在尝试将 apk 静默安装到系统中 我的应用程序位于 system app 并成功授予权限 android permission INSTALL PACKAGES 但是我在任何地方都找不到如何使用此权限 我尝试将文件复制到 data a
  • UITextView 格线背景但行高错误

    我有一个 UITextView 用户可以在其中创建注释并保存到 plist 文件中 我希望能够像普通笔记本一样显示线条 我遇到的问题是 文本无法正确对齐 下图很好地解释了这个问题 This is the background I use t