The code looks OK. Remember that it's checking rectangles, so if the rectangles overlap you'll have a collision, even if the visible parts of the images are not touching.
Also, the .frame property is not accurate when using a UIView animation. It only seems to tell you where the endpoint of the animation will be, not the "real" location of the image on the screen. You're only checking for collisions at the end of the animation though, so maybe your animations are short and that's OK?
If they had different parents you'd have to convert one of the rectangles; but you said "The key and Character and both inside the same UIView" -- do they both have the same direct parent? They're both children of the same view? Then that's OK too.
If it's still not working, put these logs inside your if statement and post the result for one of the "wrong" pickups.
Code:
NSLog(@"Character: %f,%f %f,%f", Character.frame.origin.x, Character.frame.origin.y, Character.frame.size.width, Character.frame.size.height);
NSLog(@"Key: %f,%f %f,%f", , Key.frame.origin.x, Key.frame.origin.y, Key.frame.size.width, Key.frame.size.height);