我有一个类似于笔记应用程序的视图 - 即在一张带衬里的纸上打字.为了使文本和纸张同时滚动,我已经禁用了UITextView的滚动,而是将我的UITextView和我的UIImageView放在UIScrollView中.
唯一的问题是,当用户键入时,文本消失在键盘下方,因为显然UIScrollView不知道滚动到光标位置.
有没有简单的方法可以检索光标位置并告诉UIScrollView在那里滚动?
- -编辑 - -
从这里类似的东西开始(有人试图用UITableView做类似的事情),我已经设法制作了一个不断增长的,可编辑的UITextView,它具有几乎完全滚动的固定背景.现在唯一的问题是:
这是代码 - 如果有人能进一步完善它,我将非常感激...
#import "NoteEditViewController.h"
#import "RLWideLabelTableCell.h"
@implementation NoteEditViewController
@synthesize keyboardSize;
@synthesize keyboardHideDuration;
@synthesize scrollView;
@synthesize noteTextView;
//
// Dealloc and all that stuff
//
- (void)loadView
{
[super loadView];
UIScrollView *aScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
self.scrollView = aScrollView; [aScrollView release];
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width, noteTextView.frame.size.height);
[self.view addSubview:scrollView];
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Get notified when keyboard is shown. Don't …Run Code Online (Sandbox Code Playgroud) 我已经制作了一个自定义的UITableViewCell,并且正确地完成了它(将所有内容添加到contentView,并覆盖layoutSubviews所以我的子视图是相对的contentView.bounds).
当用户按下"编辑"按钮时,表格会缩进以留出红色删除符号的空间.这很好,但默认的缩进量太多,并且破坏了我的自定义单元格的外观.如何减少压痕量?setIndentationLevel并且tableView:IndentationLevelForRowAtIndexPath似乎什么也没做.
(有人在这里问过类似的问题,但从未解决过).
有没有办法以编程方式返回导航控制器标题栏的字体和大小(例如,self.title.frame.size或者self.title.font,虽然我不知道这些作品)?
(如果您想知道原因,我想使用NSString sizeWithFont方法在我截断之前确定标题中可以容纳多少文本.我可以通过物理测量字体和帧大小来实现这一点(例如我认为这是Helvetica 15),但我希望实际的标题报告自己的字体和大小,以使我的应用程序面向未来.)
我的印象是UINavigationController的导航栏总是按下子视图的高度,这样子视图的原点就在标题栏的底部.
但是当我提出像这样的视图控制器时......
MyViewController *viewController = [[MyViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
viewController.title = @"My View Controller";
viewController.navigationItem.prompt = @"My Prompt";
viewController.delegate = self;
[self presentModalViewController:navigationController animated:YES];
[navigationController release]; [viewController release];
Run Code Online (Sandbox Code Playgroud)
...然后检查self.view.frame.size.heightNSLog viewDidLoad,它报告我的视图是460px高.它不应该减去我的标题和提示的高度?
我有一个数字(比方说,34),我想找到它的下一个十的倍数.我可以这样做:
经过一番研究后,我发现这是Objective C中的代码:
int number = 34;
int roundedNumber = ceil((double)number/10)*10;
Run Code Online (Sandbox Code Playgroud)
我的问题是:什么是(double)for,为什么删除(double)导致它向下舍入而不是向上?
我从谷歌搜索中了解到,将浮动格式更改为"双精度",但说实话,这对我来说太复杂了.任何人都可以简单解释它在做什么吗?
math floating-point cocoa-touch objective-c double-precision
我的观点有两个UITextFields和一个UISwitch.如果用户编辑a textField,然后立即触摸开关(不按返回),则文本在键入时保留,而不是AutoCorrect.
如果我知道textField他们输入了哪些内容,我可以通过调用强制完成自动更正[textField resignFirstResponder].但是用户可能正在键入textField,所以我不知道要拨打哪一个.
我怎么能绕过这个?有没有办法检测哪些textField被使用?还是我没想过的更简单的东西?
我需要将UITextView的高度从上到下计算到光标.我正在修剪它包含的文本(因此它只能到达光标),然后使用NSString的sizeWithFont:constrainedToSize:lineBreakMode:方法来计算高度,如下所示:
NSRange range;
range.location = noteTextView.selectedRange.location;
range.length = noteTextView.text.length - range.location;
NSString *string = [noteTextView.text stringByReplacingCharactersInRange:range withString:@""];
CGSize size = [string sizeWithFont:noteTextView.font
constrainedToSize:noteTextView.frame.size
lineBreakMode:UILineBreakModeWordWrap];
NSLog(@"height is: %f \n", size.height);
Run Code Online (Sandbox Code Playgroud)
每当我输入任何东西时都会这样做.
问题是,当我在键入时观察NSLog时,在我在新行上键入4个字符之前,它不会记录高度的变化.就好像该sizeWithFont方法恰好是四个字符.这里有两个屏幕截图显示我的意思:

谁能告诉我发生了什么事?
如果我在我的UITableViewCell子类的init方法中为我的表格单元格创建一个背景图像,那么图像就是我绘制它的方式,并且tableView:heightForRowAtIndexPath:只是在它周围增加了一个间隙.
但是,如果我在tableView的tableView:cellForRowAtIndexPath:方法中创建背景图像并进行设置,则更改单元格高度现在将拉伸图像.
我需要在cellForRowAtIndexPath方法中创建背景视图,因为不同行的背景会发生变化.如何才能使图像的大小再次固定?
我是一个编程新手,如果这表明我的无知,那就很抱歉......
情况1:
情况2:
在情境2中,我希望我的程序只是从头开始加载,而是在崩溃之前返回到它被"冻结"的页面.
为什么是这样?
编辑 - 这是崩溃的回溯.我已经完成了我的应用程序的完全干净安装,没有数据,从你看到的第一个屏幕,以保持变量最小化:
#0 0x96dc009a in mach_msg_trap ()
#1 0x96dc0807 in mach_msg ()
#2 0x0111cd86 in __CFRunLoopServiceMachPort ()
#3 0x01079e74 in __CFRunLoopRun ()
#4 0x01079840 in CFRunLoopRunSpecific ()
#5 0x01079761 in CFRunLoopRunInMode ()
#6 0x01c821c4 in GSEventRunModal ()
#7 0x01c82289 in GSEventRun ()
#8 0x001c4c93 in UIApplicationMain ()
#9 0x00002429 in main (argc=1, argv=0xbffff050) at main.m:14
Run Code Online (Sandbox Code Playgroud) 我一直在通过在Objective C中创建一个简单的应用程序来自学编程.今天,我遇到了一个问题,我必须编写一个方法,不知道它将获得什么类型的对象.在谷歌的帮助下,我很高兴发现了一种叫做"铸造"的东西.:)
我正在使用铸造:
- (void)aCustomViewControllerNeedsToChangeStuff:(id)viewController
{
((SpecialViewController *)viewController).aProperty = somethingInteresting;
((SpecialViewController *)viewController).anotherProperty = somethingElse;
((SpecialViewController *)viewController).yetAnotherProperty = moreStuff;
}
Run Code Online (Sandbox Code Playgroud)
我是否必须在这样的每一行上进行转换,或者是否有一种方法可以在方法范围内转换"viewController"一次,以使我的代码更整洁?
我有一个简单的CoreData应用程序,它允许您将项目添加到列表中,显示在表格视图中.当用户键入新项时,将调用以下方法:
- (void)addNewItem:(NSString *)item
{
// Create a new instance of the entity managed by the fetched results controller.
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
Item *newItem = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];
[newItem setName:item];
// Save the context.
NSError *error = nil;
if (![context save:&error])
{
//error handling code
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[context release];
[entity release];
[newItem release];
Run Code Online (Sandbox Code Playgroud)
该应用程序始终允许您将一个项目添加到列表中,但如果您尝试添加一个项目,则会崩溃.如果我删除"[newItem release];",该应用程序将允许您添加4个列表项,然后当您尝试输入第五个时突然崩溃.
只有删除方法末尾的所有三个发布语句时,应用程序才能正常工作.有谁能解释为什么?
cocoa-touch ×11
iphone ×9
objective-c ×4
uitableview ×2
uitextview ×2
cocoa ×1
core-data ×1
ios ×1
math ×1
multitasking ×1
nsstring ×1
uiimageview ×1
uiscrollview ×1
uiswitch ×1
uitextfield ×1
uiview ×1