目前我的收藏视图占据了我3.5英寸屏幕尺寸的大部分屏幕.收集视图从顶部开始是51像素,从屏幕底部开始是20像素.我正在使用单元格UIPageControl创建分页布局,每页一个单元格.当切换到4英寸大小时,使用约束我可以使集合视图扩展到新空间(保持从顶部51个像素和从底部20个),但单元格大小保持不变,所以现在有一堆细胞顶部和底部的空白空间.我尝试使用约束,但看起来你不能为细胞设置它们.如何扩大单元格大小以填充iPhone 5上的空白区域?
集合视图代码就是
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
布局在IB中设置我希望在添加更多之前首先使布局工作


constraints objective-c ios uicollectionview uicollectionviewcell
我正在尝试使用新的(beta)facebook ios sdk 3.0在应用程序中添加facebook集成.我想要的是向facebook发布状态更新.我使用FBLoginView登录Facebook.我按照facebook上的指示将我的app id放在plist中.我输入了一些代码发布到Facebook.
(void)viewDidLoad
{
[super viewDidLoad];
NSArray *perms;
perms = [NSArray arrayWithObjects:@"status_update", nil];
FBLoginView *loginview =
[[FBLoginView alloc] initWithPermissions:perms];
loginview.frame = CGRectOffset(loginview.frame, 5, 5);
loginview.delegate = self;
[self.view addSubview:loginview];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)poststatus:(UIButton *)sender {
NSString *message = [NSString stringWithFormat:@"Test staus update"];
[FBRequestConnection startForPostStatusUpdate:message
completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
[self showAlert:message result:result error:error];
}];
}
- (void)showAlert:(NSString *)message
result:(id)result
error:(NSError *)error {
NSString …Run Code Online (Sandbox Code Playgroud) 我试图将一个归因字符串放在NSTextField中,它本身就在NSAlert里面这是我的代码:
NSTextField *label1 = [[NSTextField alloc]initWithFrame:NSMakeRect(0, 23, 50, 20)];
[label1 setEditable:FALSE];
[label1 setAllowsEditingTextAttributes:TRUE];
[label1 setBezeled:FALSE];
label1.backgroundColor = [NSColor clearColor];
NSString *login = @"Username";
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:login];
NSString *boldFontName = [[NSFont boldSystemFontOfSize:12] fontName];
[attrString beginEditing];
NSRange ran = NSMakeRange(0, 8);
[attrString addAttribute:NSFontAttributeName
value:boldFontName
range:ran];
[attrString endEditing];
NSLog(@"%@",attrString);
[label1 setAttributedStringValue:attrString];
[alert setAccessoryView:label1];
[alert runModal];
Run Code Online (Sandbox Code Playgroud)
但是,一旦调出[alert runModal],我的应用程序就会崩溃
"[__NSCFConstantString pointSize]: unrecognized selector sent to instance 0x7fff74035bb0"
Run Code Online (Sandbox Code Playgroud)
我不确定为什么会这样.它似乎与字符串有关,因为只要我删除[alert setAccessoryView:label1]或给label1一个标准的nsstring,它就可以正常工作.请帮忙!
我有一个包含文本视图和图像视图的单元格的tableview.我的项目目前正在使用AutoLayout.我的目标是在点击时将图像视图全屏显示.一个选项是使用模态视图控制器,但我想让这项工作有点像在Facebook应用程序中点击图像的方式工作,应用程序使图像居中并淡化背景.
由于我使用autolayout,我不能简单地设置imageview的框架来填充屏幕.相反,我需要使用自动布局约束.我的图像视图有5个约束,约束设置距单元格底部的距离,以及左侧和右侧,以及控制图像高度的约束.最后一个是图像视图上方的文本视图和图像顶部之间的垂直空间约束.虽然这似乎与高度和底部约束相冲突,但由于某种原因,界面构建器迫使我有这个.为了避免出现问题,我将此约束的优先级设置为小于1000(无论如何,图像永远不会与textview重叠,因为tableview单元格高度设置为所有内容都完全适合).
为了使图像居中,我将左右距离设置为零,并删除垂直空间约束.为了使图像居中,我将带有中心y对齐约束的底部空间约束替换为UIWindow而不是tableviewcell.我希望它在屏幕的中心,而不是细胞.
要获取主窗口,我使用此:
AppDelegate* myDelegate = (((AppDelegate*) [UIApplication sharedApplication].delegate));
//access main window using myDelegate.window
Run Code Online (Sandbox Code Playgroud)
然后,设置约束:
//currently sets the distance from the bottom of the cell to 14
//changing it...
[cellselected removeConstraint:cellselected.imagebottomspace];
cellselected.imagebottomspace = [NSLayoutConstraint constraintWithItem:cellselected.viewimage attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:myDelegate.window attribute:NSLayoutAttributeCenterY multiplier:0 constant:0];
[cellselected addConstraint:cellselected.imagebottomspace];
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.图像视图的宽度和高度的变化适用.然而,当读取imagebottomspace约束时,我得到一个不可满足的布局 - 显然约束与另一个约束冲突,该约束将底部和图像视图之间的距离设置为14,这是我刚刚删除的约束.所以它似乎并没有实际删除约束.
当我继续让app破坏约束时,imageview会移动,但会移动到错误的位置.它不在屏幕中心.它向上移动并离开屏幕.
显然我正在做的事情是不对的.我究竟做错了什么?
在我的应用程序中,我需要从多个源加载数据并将它们放在一个表视图中.一个接一个地收集每个来源将永远需要.为了解决这个问题,我需要一起运行所有下载操作.由于它们是下载任务,理论上我可以运行它们,但问题是线程上只有部分代码是异步运行的,这意味着它需要主线程才能完成操作.
所以为了让它在后台运行,我需要使用GCD,我没有多少经验.
//DataLoader.m
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
[self.webLoader getFeedWithCompletion:self.thatOtherCompletionBlock];
[self.otherDataLoader getDataWithCompletion:self.completionBlock];
[self.thatDataLoader getThatDataWithCompletion:self.anotherCompletionBlock]
dispatch_async(dispatch_get_main_queue(), ^(void){
});
});
Run Code Online (Sandbox Code Playgroud)
但是,由于部分任务已经异步,我需要弄清楚GCD代码的放置位置.
我可以在开始任务之前把它放进去,就像我上面做的那样.但是,这可能有效,因为任务已经在后台部分运行(在某些情况下我无法改变),运行已在后台部分在后台运行的任务似乎很浪费.为什么运行已在另一个线程中的后台线程中运行的东西?
另一种选择是在获取feed的实际类中使用GCD(例如webloader),将其放在所有未在后台运行的代码上
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
.......
});
Run Code Online (Sandbox Code Playgroud)
哪种方式更好?
还有另一个问题.由于部分任务是异步的,因此它们使用完成块.我不仅需要在后台运行完成块,我还需要确定哪一个是最后一个完成,所以我可以运行一些代码来清理并整齐地打包并将数据发送到视图控制器.
我想到的方法是为每个任务使用BOOL,只需在完成后将其更改为true.然后在我的完成块中,我可以检查所有其他任务是否完成,如果是,则运行清理代码.但是,这可能不是最优雅的解决方案.
处理这些任务的最佳方法是什么,确保这一切都在后台发生?
multithreading cocoa-touch objective-c grand-central-dispatch ios
ios ×4
objective-c ×3
autolayout ×1
cocoa ×1
cocoa-touch ×1
constraints ×1
facebook ×1
macos ×1
nsalert ×1
nsautolayout ×1
uitableview ×1