小编Pet*_*sey的帖子

如何在UIBarButtonItem中添加UIGestureRecognizer,就像在iPad应用程序中常见的undo/redo UIPopoverController方案一样?

问题

在我的iPad应用程序中,在按下并保持事件后才能将弹出窗口附加到按钮栏项目.但这似乎是撤消/重做的标准.其他应用程序如何做到这一点?

背景

我的UIKit(iPad)应用程序的工具栏中有一个撤消按钮(UIBarButtonSystemItemUndo).当我按下撤销按钮时,它会触发它的动作,即undo:,并且正确执行.

然而,在iPad上撤消/重做的"标准UE惯例"是按下撤销执行撤消,但按住按钮会显示一个弹出控制器,用户选择"撤消"或"重做"直到控制器被解除.

附加弹出控制器的常规方法是使用presentPopoverFromBarButtonItem:,我可以很容易地配置它.要仅在按住之后显示此内容,我们必须设置视图以响应"长按"手势事件,如此代码段中所示:

UILongPressGestureRecognizer *longPressOnUndoGesture = [[UILongPressGestureRecognizer alloc] 
       initWithTarget:self 
               action:@selector(handleLongPressOnUndoGesture:)];
//Broken because there is no customView in a UIBarButtonSystemItemUndo item
[self.undoButtonItem.customView addGestureRecognizer:longPressOnUndoGesture];
[longPressOnUndoGesture release];
Run Code Online (Sandbox Code Playgroud)

有了这个,在按下并保持视图后,方法handleLongPressOnUndoGesture:将被调用,在这个方法中,我将配置并显示undo/redo的popover.到现在为止还挺好.

这个问题是没有附加视图.self.undoButtonItem是一个UIButtonBarItem,而不是一个视图.

可能的解决方案

1)[理想] 将手势识别器附加到按钮栏项目.可以将手势识别器附加到视图,但UIButtonBarItem不是视图.它确实具有.customView的属性,但当buttonbaritem是标准系统类型时(在这种情况下它是),该属性为nil.

2)使用另一个视图.我可以使用UIToolbar,但这需要一些奇怪的命中测试,并且如果可能的话首先是一个全面的黑客攻击.我无法想到使用其他替代视图.

3)使用customView属性.像UIBarButtonSystemItemUndo这样的标准类型没有customView(它是nil).设置customView将删除它需要的标准内容.这将相当于重新实现UIBarButtonSystemItemUndo的所有外观和功能,如果可能的话.

如何将手势识别器附加到此"按钮"?更具体地说,如何在iPad应用程序中实现标准的按住 - 显示 - 重做 - 弹出窗口?

想法?非常感谢,特别是如果有人真的在他们的应用程序中工作(我在想你,omni)并想分享......

cocoa-touch undo-redo uibarbuttonitem ipad uigesturerecognizer

39
推荐指数
5
解决办法
2万
查看次数

如何创建标准的iOS Share按钮?

iOS人机界面指南说:

使用系统提供的"共享"按钮.用户熟悉此按钮的含义和行为,因此在可能的情况下使用它是个好主意.主要的例外是如果您的应用程序不包含工具栏或导航栏[,因为]共享按钮只能在工具栏或导航栏中使用.

好的,但我如何"使用系统提供的共享按钮"?搜索文档没有任何用处.

我已经收集到我应该在响应被点击的按钮时使用UIActivityViewController,但是我如何首先创建标准的Share按钮?

cocoa-touch share uikit ios ios7

39
推荐指数
4
解决办法
3万
查看次数

UITableViewCell:如何防止蓝色选择​​背景没有borking isSelected属性?

我有一个自定义UITableViewCell子类.我已经将contentView我的单元子类设置为一个自定义UIView类,我在其中重写-drawRect:并完成所有绘图.

此外,我设置cell.contentView.opaque = NO的目的是为了在单元格的某些区域实现透明度(不幸的是,桌子背后的背景图像必须通过某些部分的每个单元格来显示以获得风格效果.我知道这是一个性能损失.它必须是所以).

问题:当我选择或突出显示(按下)时,我仍会看到在我的单元格后面(在透明区域中)绘制默认的漂亮蓝色渐变背景.这会遮挡桌子后面的图像,这很糟糕.

目标:为了防止蓝色渐变背景出现,但仍然能够从内部检查cell.isSelectedcell.isHighlighted属性-[MyContentView drawRect:]以确定如何绘制我自己的自定义选择/突出显示.

我尝试过的:

  1. 设置cell.selectionStyle = UITableViewCellSelectionStyleNone具有防止漂亮的蓝色渐变选择背景的所需效果,但也防止cell.isSelectedcell.isHighlighted属性被正确设置,这意味着我无法自己做自定义选择/高亮显示绘图

  2. 设置cell.selectionBackgroundView = nilcell.backgroundView = nil单元格-init-prepareForReuse方法中的设置不会阻止蓝色渐变选择背景

  3. 设置cell.selectionBackgroundView = nil-[MyContentView -drawRect:]方法确实具有防止蓝色梯度选择背景的所希望的效果,但是,似乎非常janky

  4. 覆盖 - [UITableViewCell setSelected:animated:]为无操作.这不具有防止蓝色渐变选择背景的期望效果

iphone cocoa-touch objective-c uikit

38
推荐指数
3
解决办法
3万
查看次数

Objective-C中的实例变量默认设置为nil吗?

我正在用我的iPhone应用程序解决一些内存问题,我一直在考虑一些基础知识.如果我设置了一个ivar并且永远不会在我的对象的生命周期中使用它,当我在其上调用dealloc时,会导致问题吗?例如

@interface testClass {
    id myobject;
}
@property (nonatomic, retain) id myobject;
@end

@implementation testClass
@synthesize myobject;
- (id)init {
    ...
    // Do I have to set myobject to nil here?
    // So if myobject isn't used the dealloc call to nil
    // will be okay? Or can you release the variable without
    // having set every object to nil that you may may not use 
    ...
}

...

// Somewhere in the code, myobject may be set to
// …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa cocoa-touch memory-management objective-c

38
推荐指数
2
解决办法
1万
查看次数

旋转后UIWebView调整文本大小:寻找魔法bug或我的愚蠢的解释

所以我在我的应用程序中有UIWebView,我加载了一些HTML(文章)给它,放一些CSS,使一切更好.这简单明了,一切都很完美,直到我尝试添加景观功能阅读,然后我注意到UIWebView忽略了任何CSS"font-size"我放入HTML并在旋转到横向模式后大幅增加字体大小.

我花了大约4-5个小时(我是编程Iphone应用程序的新手,但是在制作正确的东西时我很顽固)试图修复它.尝试了很多很多配置选项 - 没什么.

今晚发生了一些神奇的事情.看看来源:

景观与虫子:

r = CGRectMake(0.0, 0.0, 480.0, 320.0);
[adView.view removeFromSuperview];
if (!isFullScreen) {
    minus = 50 + minus;
    [controlsView setFrame:CGRectMake(0, r.size.height - 50, r.size.width, 50)];        
} else {
    minus = 20; 
}

[textView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)];  
[scrollView setFrame:CGRectMake(0, 0, r.size.width, r.size.height - minus)];
Run Code Online (Sandbox Code Playgroud)

修复了横向(字体大小不再变化):

r = CGRectMake(0.0, 0.0, 480.0, 320.0);
[adView.view removeFromSuperview];
if (!isFullScreen) {
    minus = 50 + minus;
    [controlsView setFrame:CGRectMake(0, r.size.height - 50, r.size.width, 50)];        
} else {
    minus = 20; …
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch webkit uiwebview

37
推荐指数
4
解决办法
1万
查看次数

UIViewController的初始化和加载顺序

我对Mac和iPhone上的UI编程相当陌生,而且我遇到了一些让我感到困惑的事情.

UIViewController有3个方法,涉及它的初始化及其视图:

  1. init(和类似init的方法)
  2. 的loadView
  3. viewDidLoad(委托方法)

我希望这些按照上面的顺序发生.第一个UIViewController由其他一些对象分配,然后立即调用init(或其他一些init方法,如initWithStyle).

只有在初始化对象后,我才会期望它调用自己的loadView函数,之后视图加载后会调用viewDidLoad委托方法.

例如,这不会发生:

@implementation UIViewControllerSubclass

- (id)init {
        NSLog(@"0");
    if (self = [super init]) {
        NSLog(@"1");
    }
    return self;
}

- (void)loadView {
    [super loadView];
    NSLog(@"2");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"3");
}

@end
Run Code Online (Sandbox Code Playgroud)

生成控制台输出:

0
2
3
1
Run Code Online (Sandbox Code Playgroud)

因此,loadView和viewDidLoad方法不能进行委托调用,因为委托通常在调用[super init]之后设置, loadView和viewDidLoad运行之后调用(如上所示):

UIViewControllerSubClass *someViewController = [[UIViewControllerSubclass alloc] init];
[viewController setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

如果我想运行以某种方式设置ViewController的代码,通知代理,如果代码驻留在init方法中?loadView现有的原因是否允许在适当的时候运行此类代码?

在我看来,我必须创建一个新的initWithDelegate方法,该方法调用[super init] 之前设置委托ivar ,这是对的,还是我以错误的方式进行此操作?

提前致谢 :)

iphone cocoa-touch objective-c uiviewcontroller

37
推荐指数
3
解决办法
5万
查看次数

横向模式仅适用于iPhone或iPad

我想创建一个不使用纵向模式的应用程序.

我不确定是否需要编辑plist或者除了plist之外还有代码

iphone cocoa-touch objective-c uikit ipad

37
推荐指数
4
解决办法
4万
查看次数

NSFetchedResultsController:更改谓词不起作用?

我正在一个屏幕上编写一个带有两个表的应用程序.左表是文件夹列表,右表显示文件列表.点击左侧的行时,右侧表格将显示属于该文件夹的文件.

我正在使用Core Data进行存储.当文件夹的选择发生变化时,右表NSFetchedResultsController的fetch谓词将改变并执行新的提取,然后重新加载表数据.我使用了以下代码片段:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {   
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
[table reloadData];
Run Code Online (Sandbox Code Playgroud)

但是获取结果仍然相同.我在获取之前和之后都有NSLog'ed"谓词",并且它们对于更新的信息是正确的.获取结果与初始提取保持一致(加载视图时).

我不太熟悉Core Data获取对象的方式(是否有缓存系统?),但我之前用单表视图完成了类似的事情(更改谓词,重新获取数据和刷新表),一切都进行了好.

如果有人能给我一个提示,我将非常感激.

提前致谢.

iphone core-data uitableview nspredicate nsfetchedresultscontroller

35
推荐指数
1
解决办法
2万
查看次数

如何将NSUrl转换为NSString?

之后AVAssetExportSession拥有完整导出视频.我打算通过Youtube上传视频路径.但[GDataUtilities MIMETypeForFileAtPath:path defaultMIMEType:@"video/mp4"]; 它只接受NSString.是否可以将NSUrl转换为NSString用于视频文件路径.

我试着用NSString *path = [ExportoutputURL absoluteString]; 它但崩溃了.

这是守则

- (void)exportDidFinish:(AVAssetExportSession*)session {
    ExportoutputURL = session.outputURL;

    _exporting = NO;
    NSIndexPath *exportCellIndexPath = [NSIndexPath indexPathForRow:2 inSection:kProjectSection];
    ExportCell *cell = (ExportCell*)[self.tableView cellForRowAtIndexPath:exportCellIndexPath];
    cell.progressView.progress = 1.0;
    [cell setProgressViewHidden:YES animated:YES];
    [self updateCell:cell forRowAtIndexPath:exportCellIndexPath];

    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:ExportoutputURL]) {
        [library writeVideoAtPathToSavedPhotosAlbum:ExportoutputURL
                                    completionBlock:^(NSURL *assetURL, NSError *error){
                                        dispatch_async(dispatch_get_main_queue(), ^{
                                            if (error) {
                                                NSLog(@"writeVideoToAssestsLibrary failed: %@", error);
                                                UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
                                                                                                    message:[error localizedRecoverySuggestion] …
Run Code Online (Sandbox Code Playgroud)

cocoa cocoa-touch objective-c ios

34
推荐指数
3
解决办法
5万
查看次数

如何在目标c中为iphone创建一个字符串数组

我正在尝试创建一个可以随机化并限制为某个x个字符串的字符串数组.

如果数组可以随机化,我可以选择前x个字符串,这样可以正常工作.

我正在尝试使用这样的代码

NSString *statements[9];
statements[0] = @"hello";
Run Code Online (Sandbox Code Playgroud)

这似乎有效但阵列似乎充满了垃圾数据.

有人可以帮我正确的方向.(内存分配是以错误的方式完成的吗?

谢谢

iphone cocoa cocoa-touch objective-c

33
推荐指数
2
解决办法
9万
查看次数